On Fri, 16 Mar 2018 15:55:53 +0900 shunki-fujita <shunki-fujita@xxxxxxxxxxxx> wrote: > 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. Yes, the patch removes the flush_disk() call when shrinking. But it adds additional code which is unchangelogged and uncommented. What's happening here? > --- 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; > + } > } > } Oh, I see. It's a copy-n-paste of some mystery uncommented, lost-in-the-mists-of-time code from flush_disk(). Argh. The world would be a better place if we could move that bit of code into a separate function, figure out what it does, document it and call it from both sites.