From 6c3e24e7b998544e1e75c850ec2c71ca1f00110d Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Fri, 18 Apr 2014 10:51:35 -0400 Subject: [PATCH] add patch discard-preallocations-after-removing-space --- discard-preallocations-after-removing-space | 64 +++++++++++++++++++++++++++++ series | 1 + 2 files changed, 65 insertions(+) create mode 100644 discard-preallocations-after-removing-space diff --git a/discard-preallocations-after-removing-space b/discard-preallocations-after-removing-space new file mode 100644 index 00000000..6dd9183d --- /dev/null +++ b/discard-preallocations-after-removing-space @@ -0,0 +1,64 @@ +ext4: discard preallocations after removing space + +From: Lukas Czerner + +Currently in ext4_collapse_range() and ext4_punch_hole() we're +discarding preallocation twice. Once before we attempt to do any changes +and second time after we're done with the changes. + +While the second call to ext4_discard_preallocations() in +ext4_punch_hole() case is not needed, we need to discard preallocation +right after ext4_ext_remove_space() in collapse range case because in +the case we had to restart a transaction in the middle of removing space +we might have new preallocations created. + +Remove unneeded ext4_discard_preallocations() ext4_punch_hole() and move +it to the better place in ext4_collapse_range() + +Signed-off-by: Lukas Czerner +Signed-off-by: "Theodore Ts'o" +--- + fs/ext4/extents.c | 2 +- + fs/ext4/inode.c | 1 - + 2 files changed, 1 insertion(+), 2 deletions(-) + +diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c +index 9cd762c..84bb668 100644 +--- a/fs/ext4/extents.c ++++ b/fs/ext4/extents.c +@@ -5433,6 +5433,7 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } ++ ext4_discard_preallocations(inode); + + ret = ext4_ext_shift_extents(inode, handle, punch_stop, + punch_stop - punch_start); +@@ -5445,7 +5446,6 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) + i_size_write(inode, new_size); + EXT4_I(inode)->i_disksize = new_size; + +- ext4_discard_preallocations(inode); + up_write(&EXT4_I(inode)->i_data_sem); + if (IS_SYNC(inode)) + ext4_handle_sync(handle); +diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c +index 56f1ff4..8765d49 100644 +--- a/fs/ext4/inode.c ++++ b/fs/ext4/inode.c +@@ -3613,7 +3613,6 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) + ret = ext4_free_hole_blocks(handle, inode, first_block, + stop_block); + +- ext4_discard_preallocations(inode); + up_write(&EXT4_I(inode)->i_data_sem); + if (IS_SYNC(inode)) + ext4_handle_sync(handle); +-- +1.8.3.1 + +-- +To unsubscribe from this list: send the line "unsubscribe linux-ext4" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at http://vger.kernel.org/majordomo-info.html + diff --git a/series b/series index 52a15417..a8f41d3d 100644 --- a/series +++ b/series @@ -26,6 +26,7 @@ use-truncate_pagecache-in-collapse_range use-filemap_write_and_wait_range-correctly-in-collapse_range fix-removing-status-extents-in-ext4_collapse-range no-need-to-truncate-pagecache-twice-in-collapse-range +discard-preallocations-after-removing-space # ^^^ above are to be pushed to Linus for 3.15-rc1 -- 2.11.4.GIT