aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Monakhov <dmonakhov@openvz.org>2014-07-27 22:32:27 -0400
committerTheodore Ts'o <tytso@mit.edu>2014-07-27 22:32:27 -0400
commit6e2631463f3a2ce430a295c68aead3ff228ca3cf (patch)
tree324ca15510faae1060b5df21b8c5e68c5939e8b0
parent29faed1638e6b2ace499e1b848cc3337ef6a6ad5 (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>
-rw-r--r--fs/ext4/move_extent.c3
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;