add patch move-trans-handling-and-completion-deferal-out-of-_ext4_get_block
[ext4-patch-queue.git] / iterate-over-buffer-heads-correctly-in-move_extent_per_page
blobce802f8bf2c8b3d50a088f93609c51d1a22a1425
1 ext4: iterate over buffer heads correctly in move_extent_per_page()
3 From: Eryu Guan <guaneryu@gmail.com>
5 In commit bcff24887d00 ("ext4: don't read blocks from disk after extents
6 being swapped") bh is not updated correctly in the for loop and wrong
7 data has been written to disk. generic/324 catches this on sub-page
8 block size ext4.
10 Fixes: bcff24887d00 ("ext4: don't read blocks from disk after extentsbeing swapped")
11 Signed-off-by: Eryu Guan <guaneryu@gmail.com>
12 Signed-off-by: Theodore Ts'o <tytso@mit.edu>
13 Cc: stable@vger.kernel.org
14 ---
16 Not sure why I didn't notice generic/324 failure in the first place, it fails
17 every time for me with 4.5-rc5 kernel. Sorry about that!
19 I tested this patch with 1k/2k/4k block size ext4 with all defrag related tests
20 in xfstests (ext4/301 ext4/302 ext4/303 ext4/304 ext4/307 ext4/308 generic/324)
21 and results showed no regression. Test with the reproducer in commit
22 bcff24887d00 also passed.
24  fs/ext4/move_extent.c | 1 +
25  1 file changed, 1 insertion(+)
27 diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c
28 index e032a04..4098acc 100644
29 --- a/fs/ext4/move_extent.c
30 +++ b/fs/ext4/move_extent.c
31 @@ -390,6 +390,7 @@ data_copy:
32                 *err = ext4_get_block(orig_inode, orig_blk_offset + i, bh, 0);
33                 if (*err < 0)
34                         break;
35 +               bh = bh->b_this_page;
36         }
37         if (!*err)
38                 *err = block_commit_write(pagep[0], from, from + replaced_size);
39 -- 
40 2.5.0
43 To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
44 the body of a message to majordomo@vger.kernel.org
45 More majordomo info at  http://vger.kernel.org/majordomo-info.html