Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[cascardo/linux.git] / fs / ext2 / inode.c
index c7dbb46..d831e24 100644 (file)
@@ -595,7 +595,7 @@ static void ext2_splice_branch(struct inode *inode,
        if (where->bh)
                mark_buffer_dirty_inode(where->bh, inode);
 
-       inode->i_ctime = CURRENT_TIME_SEC;
+       inode->i_ctime = current_time(inode);
        mark_inode_dirty(inode);
 }
 
@@ -732,6 +732,16 @@ static int ext2_get_blocks(struct inode *inode,
        }
 
        if (IS_DAX(inode)) {
+               int i;
+
+               /*
+                * We must unmap blocks before zeroing so that writeback cannot
+                * overwrite zeros with stale data from block device page cache.
+                */
+               for (i = 0; i < count; i++) {
+                       unmap_underlying_metadata(inode->i_sb->s_bdev,
+                                       le32_to_cpu(chain[depth-1].key) + i);
+               }
                /*
                 * block must be initialised before we put it in the tree
                 * so that it's not found by another thread before it's
@@ -1298,7 +1308,7 @@ static int ext2_setsize(struct inode *inode, loff_t newsize)
        __ext2_truncate_blocks(inode, newsize);
        dax_sem_up_write(EXT2_I(inode));
 
-       inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC;
+       inode->i_mtime = inode->i_ctime = current_time(inode);
        if (inode_needs_sync(inode)) {
                sync_mapping_buffers(inode->i_mapping);
                sync_inode_metadata(inode, 1);
@@ -1642,7 +1652,7 @@ int ext2_setattr(struct dentry *dentry, struct iattr *iattr)
        struct inode *inode = d_inode(dentry);
        int error;
 
-       error = inode_change_ok(inode, iattr);
+       error = setattr_prepare(dentry, iattr);
        if (error)
                return error;