From b7aaed957b7ff0e827ed588865d57ba107654776 Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Sun, 27 Jul 2014 22:33:05 -0400 Subject: [PATCH] add patch fix-incorrect-locking-in-move_extent_per_page --- fix-incorrect-locking-in-move_extent_per_page | 36 +++++++++++++++++++++++++++ series | 1 + 2 files changed, 37 insertions(+) create mode 100644 fix-incorrect-locking-in-move_extent_per_page diff --git a/fix-incorrect-locking-in-move_extent_per_page b/fix-incorrect-locking-in-move_extent_per_page new file mode 100644 index 00000000..f861c81f --- /dev/null +++ b/fix-incorrect-locking-in-move_extent_per_page @@ -0,0 +1,36 @@ +ext4: fix incorrect locking in move_extent_per_page + +From: Dmitry Monakhov + +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 +Signed-off-by: Theodore Ts'o +Reviewed-by: Jan Kara +--- + 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 2484c7e..671a74b 100644 +--- a/fs/ext4/move_extent.c ++++ b/fs/ext4/move_extent.c +@@ -1013,10 +1013,11 @@ data_copy: + *err = -EBUSY; + goto unlock_pages; + } +- ++ ext4_double_down_write_data_sem(orig_inode, donor_inode); + replaced_count = mext_replace_branches(handle, orig_inode, donor_inode, + orig_blk_offset, + block_len_in_page, err); ++ ext4_double_up_write_data_sem(orig_inode, donor_inode); + if (*err) { + if (replaced_count) { + block_len_in_page = replaced_count; +-- +1.7.1 + + diff --git a/series b/series index 6ebc2caf..91eb1752 100644 --- a/series +++ b/series @@ -8,6 +8,7 @@ make-ext4_has_inline_data-as-a-inline-function fix-wrong-size-computation-in-ext4_mb_normalize_request add-i_data_sem-sanity-check use-correct-depth-value +fix-incorrect-locking-in-move_extent_per_page ########################################## # unstable patches -- 2.11.4.GIT