resize2fs block_mover() flushes data after each extent and, curiously, only if progress indicator is enabled, every inode_blocks_per_group blocks. This significantly affects performance, e.g. on a tested large filesystem on top of MD-RAID6+LVM+dm-crypt these flush calls reduce the operation rate from approx. 500MB/s to 5MB/s, causing extremely long shrinking times for large size deltas (70TB in my case). Since this step performs just plain data copying and does not e.g. save any progress/checkpoint information or similar metadata, it seems like this flushing is of very limited usefulness, especially when considering the (in some cases) 100x performance impact. Remove the mid-operation flushes and only flush after all blocks have been moved. Signed-off-by: Anssi Hannula <anssi.hannula@xxxxxx> --- resize/resize2fs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resize/resize2fs.c b/resize/resize2fs.c index 5eeb7d44..46540501 100644 --- a/resize/resize2fs.c +++ b/resize/resize2fs.c @@ -1863,7 +1863,6 @@ static errcode_t block_mover(ext2_resize_t rfs) old_blk += c; moved += c; if (rfs->progress) { - io_channel_flush(fs->io); retval = (rfs->progress)(rfs, E2_RSZ_BLOCK_RELOC_PASS, moved, to_move); @@ -1871,9 +1870,10 @@ static errcode_t block_mover(ext2_resize_t rfs) goto errout; } } while (size > 0); - io_channel_flush(fs->io); } + io_channel_flush(fs->io); + errout: if (badblock_list) { if (!retval && bb_modified) -- 2.41.0