diff options
author | Dmitry Monakhov <dmonakhov@openvz.org> | 2014-07-27 22:32:27 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2014-07-27 22:32:27 -0400 |
commit | 6e2631463f3a2ce430a295c68aead3ff228ca3cf (patch) | |
tree | 324ca15510faae1060b5df21b8c5e68c5939e8b0 /fs | |
parent | 29faed1638e6b2ace499e1b848cc3337ef6a6ad5 (diff) |
ext4: fix incorrect locking in move_extent_per_page
If we have to copy data we must drop i_data_sem because of
get_blocks() will be called inside mext_page_mkuptodate(), but later we must
reacquire it again because we are about to change extent's tree
Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Reviewed-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ext4/move_extent.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c index 2484c7ec6a72..671a74b14fd7 100644 --- a/fs/ext4/move_extent.c +++ b/fs/ext4/move_extent.c | |||
@@ -1013,10 +1013,11 @@ data_copy: | |||
1013 | *err = -EBUSY; | 1013 | *err = -EBUSY; |
1014 | goto unlock_pages; | 1014 | goto unlock_pages; |
1015 | } | 1015 | } |
1016 | 1016 | ext4_double_down_write_data_sem(orig_inode, donor_inode); | |
1017 | replaced_count = mext_replace_branches(handle, orig_inode, donor_inode, | 1017 | replaced_count = mext_replace_branches(handle, orig_inode, donor_inode, |
1018 | orig_blk_offset, | 1018 | orig_blk_offset, |
1019 | block_len_in_page, err); | 1019 | block_len_in_page, err); |
1020 | ext4_double_up_write_data_sem(orig_inode, donor_inode); | ||
1020 | if (*err) { | 1021 | if (*err) { |
1021 | if (replaced_count) { | 1022 | if (replaced_count) { |
1022 | block_len_in_page = replaced_count; | 1023 | block_len_in_page = replaced_count; |