Hi Andrew, > 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. > This was an unnecessary additional code. Since bdev-> bd_invalidated always 0 after check_disk_size_change (), no additional code was required. https://github.com/torvalds/linux/blob/master/fs/block_dev.c#L1365-L1366 I will repost the fix patch. Thanks, Shunki