[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1414064938-2496-1-git-send-email-dmonakhov@openvz.org>
Date: Thu, 23 Oct 2014 15:48:58 +0400
From: Dmitry Monakhov <dmonakhov@...nvz.org>
To: linux-ext4@...r.kernel.org
Cc: tytso@....edu, wangxg.fnst@...fujitsu.com,
Dmitry Monakhov <dmonakhov@...nvz.org>
Subject: [PATCH] ext4: move_extent explicitly invalidate page buffers
In hard core test-cases such as ext4/301, ext4/302 some bh may
becomes dirty so try_to_release_page() will fail and result in
false positive EBUSY failures. We can easily fix that by
explicit ->invalidatepage() after we holds page which is locked
and uptodate.
Tested-by: Xiaoguang Wang<wangxg.fnst@...fujitsu.com>
Signed-off-by: Dmitry Monakhov <dmonakhov@...nvz.org>
---
fs/ext4/move_extent.c | 10 +++++++---
1 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c
index c2b2b02..76c45b6 100644
--- a/fs/ext4/move_extent.c
+++ b/fs/ext4/move_extent.c
@@ -348,8 +348,9 @@ again:
!try_to_release_page(pagep[0], 0)) ||
(page_has_private(pagep[1]) &&
!try_to_release_page(pagep[1], 0))) {
- *err = -EBUSY;
- goto drop_data_sem;
+ /* One of buffers is busy, fall back data copy */
+ ext4_double_up_write_data_sem(orig_inode, donor_inode);
+ goto data_copy;
}
replaced_count = ext4_swap_extents(handle, orig_inode,
donor_inode, orig_blk_offset,
@@ -360,12 +361,15 @@ again:
goto unlock_pages;
}
data_copy:
- *err = mext_page_mkuptodate(pagep[0], from, from + replaced_size);
+ /* In order to drop all buffers we have to make page fully uptodate */
+ *err = mext_page_mkuptodate(pagep[0], 0, PAGE_CACHE_SIZE);
if (*err)
goto unlock_pages;
/* At this point all buffers in range are uptodate, old mapping layout
* is no longer required, try to drop it now. */
+ do_invalidatepage(pagep[0], 0, PAGE_CACHE_SIZE);
+ do_invalidatepage(pagep[1], 0, PAGE_CACHE_SIZE);
if ((page_has_private(pagep[0]) && !try_to_release_page(pagep[0], 0)) ||
(page_has_private(pagep[1]) && !try_to_release_page(pagep[1], 0))) {
*err = -EBUSY;
--
1.7.1
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists