add patch fix-COLLAPSE_RANGE-test-failure-for-bigalloc
[ext4-patch-queue.git] / fix-incorrect-locking-in-move_extent_per_page
blobf861c81f7a9200289e1fe417d7e6e148465d3f13
1 ext4: fix incorrect locking in move_extent_per_page
3 From: Dmitry Monakhov <dmonakhov@openvz.org>
5 If we have to copy data we must drop i_data_sem because of
6 get_blocks() will be called inside mext_page_mkuptodate(), but later we must
7 reacquire it again because we are about to change extent's tree
9 Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
10 Signed-off-by: Theodore Ts'o <tytso@mit.edu>
11 Reviewed-by: Jan Kara <jack@suse.cz>
12 ---
13  fs/ext4/move_extent.c |    3 ++-
14  1 files changed, 2 insertions(+), 1 deletions(-)
16 diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c
17 index 2484c7e..671a74b 100644
18 --- a/fs/ext4/move_extent.c
19 +++ b/fs/ext4/move_extent.c
20 @@ -1013,10 +1013,11 @@ data_copy:
21                 *err = -EBUSY;
22                 goto unlock_pages;
23         }
25 +       ext4_double_down_write_data_sem(orig_inode, donor_inode);
26         replaced_count = mext_replace_branches(handle, orig_inode, donor_inode,
27                                                orig_blk_offset,
28                                                block_len_in_page, err);
29 +       ext4_double_up_write_data_sem(orig_inode, donor_inode);
30         if (*err) {
31                 if (replaced_count) {
32                         block_len_in_page = replaced_count;
33 -- 
34 1.7.1