When changing the size of a block device, its all caches are freed.
It's necessary on shrinking to prevent spurious I/Os to the disappeared region.
However, on expanding, such kind of I/Os doesn't happen.

Similar things can be considered for btrfs filesystem resize and resize2fs,
but they are designed not to cache drops when expanding.
Therefore this patch removes unnecessary cache drop.

Signed-off-by: Shunki Fujita <shunki-fuj...@cybozu.co.jp>
---
 fs/block_dev.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/fs/block_dev.c b/fs/block_dev.c
index fe09ef9..243f4002 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1337,7 +1337,14 @@ void check_disk_size_change(struct gendisk *disk, struct 
block_device *bdev)
                       "%s: detected capacity change from %lld to %lld\n",
                       disk->disk_name, bdev_size, disk_size);
                i_size_write(bdev->bd_inode, disk_size);
-               flush_disk(bdev, false);
+               if (bdev_size > disk_size) {
+                       flush_disk(bdev, false);
+               } else {
+                       if (!bdev->bd_disk)
+                               return;
+                       if (disk_part_scan_enabled(bdev->bd_disk))
+                               bdev->bd_invalidated = 1;
+               }
        }
 }
 EXPORT_SYMBOL(check_disk_size_change);
-- 
2.7.4

Reply via email to