ext2: Unmap metadata when zeroing blocks
[cascardo/linux.git] / fs / ext2 / inode.c
index d5c7d09..303ae2b 100644 (file)
@@ -733,6 +733,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