Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
[sfrench/cifs-2.6.git] / fs / ext2 / inode.c
index 41b8b44a391cb5dc8ed833cb95b632424372e038..0093ea2512a85809e16605088074a8335513e81c 100644 (file)
@@ -732,16 +732,13 @@ 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);
-               }
+               clean_bdev_aliases(inode->i_sb->s_bdev,
+                                  le32_to_cpu(chain[depth-1].key),
+                                  count);
                /*
                 * block must be initialised before we put it in the tree
                 * so that it's not found by another thread before it's
@@ -850,6 +847,9 @@ struct iomap_ops ext2_iomap_ops = {
        .iomap_begin            = ext2_iomap_begin,
        .iomap_end              = ext2_iomap_end,
 };
+#else
+/* Define empty ops for !CONFIG_FS_DAX case to avoid ugly ifdefs */
+struct iomap_ops ext2_iomap_ops;
 #endif /* CONFIG_FS_DAX */
 
 int ext2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
@@ -1293,9 +1293,11 @@ static int ext2_setsize(struct inode *inode, loff_t newsize)
 
        inode_dio_wait(inode);
 
-       if (IS_DAX(inode))
-               error = dax_truncate_page(inode, newsize, ext2_get_block);
-       else if (test_opt(inode->i_sb, NOBH))
+       if (IS_DAX(inode)) {
+               error = iomap_zero_range(inode, newsize,
+                                        PAGE_ALIGN(newsize) - newsize, NULL,
+                                        &ext2_iomap_ops);
+       } else if (test_opt(inode->i_sb, NOBH))
                error = nobh_truncate_page(inode->i_mapping,
                                newsize, ext2_get_block);
        else
@@ -1476,6 +1478,10 @@ struct inode *ext2_iget (struct super_block *sb, unsigned long ino)
                inode->i_size |= ((__u64)le32_to_cpu(raw_inode->i_size_high)) << 32;
        else
                ei->i_dir_acl = le32_to_cpu(raw_inode->i_dir_acl);
+       if (i_size_read(inode) < 0) {
+               ret = -EFSCORRUPTED;
+               goto bad_inode;
+       }
        ei->i_dtime = 0;
        inode->i_generation = le32_to_cpu(raw_inode->i_generation);
        ei->i_state = 0;