From 0fe735c12df6bc08b5c2d289c21c0eefc03dd12a Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Tue, 4 Jun 2013 14:30:16 -0400 Subject: [PATCH] add patch remove-wait-for-unwritten-extent-conversion-from-ext4_truncate --- ...-unwritten-extent-conversion-from-ext4_truncate | 61 ++++++++++++++++++++++ series | 1 + 2 files changed, 62 insertions(+) create mode 100644 remove-wait-for-unwritten-extent-conversion-from-ext4_truncate diff --git a/remove-wait-for-unwritten-extent-conversion-from-ext4_truncate b/remove-wait-for-unwritten-extent-conversion-from-ext4_truncate new file mode 100644 index 00000000..da2fa5b2 --- /dev/null +++ b/remove-wait-for-unwritten-extent-conversion-from-ext4_truncate @@ -0,0 +1,61 @@ +ext4: remove wait for unwritten extent conversion from ext4_truncate() + +From: Jan Kara + +Since PageWriteback bit is now cleared after extents are converted +from unwritten to written ones, we have full exclusion of writeback +path from truncate (truncate_inode_pages() waits for PageWriteback +bits to get cleared on all invalidated pages). Exclusion from DIO +path is achieved by inode_dio_wait() call in ext4_setattr(). So +there's no need to wait for extent convertion in ext4_truncate() +anymore. + +Reviewed-by: Zheng Liu +Signed-off-by: Jan Kara +Signed-off-by: "Theodore Ts'o" +--- + fs/ext4/inode.c | 6 ------ + fs/ext4/page-io.c | 9 ++++++++- + 2 files changed, 8 insertions(+), 7 deletions(-) + +diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c +index 4273b4d..deab352 100644 +--- a/fs/ext4/inode.c ++++ b/fs/ext4/inode.c +@@ -3742,12 +3742,6 @@ void ext4_truncate(struct inode *inode) + return; + } + +- /* +- * finish any pending end_io work so we won't run the risk of +- * converting any truncated blocks to initialized later +- */ +- ext4_flush_unwritten_io(inode); +- + if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) + credits = ext4_writepage_trans_blocks(inode); + else +diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c +index 755741c..0f65561 100644 +--- a/fs/ext4/page-io.c ++++ b/fs/ext4/page-io.c +@@ -158,7 +158,14 @@ static void ext4_clear_io_unwritten_flag(ext4_io_end_t *io_end) + wake_up_all(ext4_ioend_wq(inode)); + } + +-/* check a range of space and convert unwritten extents to written. */ ++/* ++ * Check a range of space and convert unwritten extents to written. Note that ++ * we are protected from truncate touching same part of extent tree by the ++ * fact that truncate code waits for all DIO to finish (thus exclusion from ++ * direct IO is achieved) and also waits for PageWriteback bits. Thus we ++ * cannot get to ext4_ext_truncate() before all IOs overlapping that range are ++ * completed (happens from ext4_free_ioend()). ++ */ + static int ext4_end_io(ext4_io_end_t *io) + { + struct inode *inode = io->inode; +-- +1.8.1.4 + + diff --git a/series b/series index 391e0ecb..78ce40cf 100644 --- a/series +++ b/series @@ -49,6 +49,7 @@ use-transaction-reservation-for-extent-conversion-in-ext4_end_io split-extent-conversion-lists defer-clearing-of-pagewriteback-after-extent-conversion protect-extent-conversion-after-DIO-with-i_dio_count +remove-wait-for-unwritten-extent-conversion-from-ext4_truncate ########################################## # unstable patches -- 2.11.4.GIT