Commit 6e263146 authored by Dmitry Monakhov's avatar Dmitry Monakhov Committed by Theodore Ts'o

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: default avatarDmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
Reviewed-by: default avatarJan Kara <jack@suse.cz>
parent 29faed16
...@@ -1013,10 +1013,11 @@ move_extent_per_page(struct file *o_filp, struct inode *donor_inode, ...@@ -1013,10 +1013,11 @@ move_extent_per_page(struct file *o_filp, struct inode *donor_inode,
*err = -EBUSY; *err = -EBUSY;
goto unlock_pages; goto unlock_pages;
} }
ext4_double_down_write_data_sem(orig_inode, donor_inode);
replaced_count = mext_replace_branches(handle, orig_inode, donor_inode, replaced_count = mext_replace_branches(handle, orig_inode, donor_inode,
orig_blk_offset, orig_blk_offset,
block_len_in_page, err); block_len_in_page, err);
ext4_double_up_write_data_sem(orig_inode, donor_inode);
if (*err) { if (*err) {
if (replaced_count) { if (replaced_count) {
block_len_in_page = replaced_count; block_len_in_page = replaced_count;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment