summaryrefslogtreecommitdiffstats
path: root/fs/block_dev.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2020-09-01 17:57:43 +0200
committerJens Axboe <axboe@kernel.dk>2020-09-02 08:00:07 -0600
commit659e56ba864d37b7ee0a49cd432205b2a5ca815e (patch)
treed318f21ef0098e4ab6c7385bc99bc1b8c5a82f44 /fs/block_dev.c
parentf4ad06f2bb8476548b08f89919ee65abc4e40212 (diff)
downloadlinux-659e56ba864d37b7ee0a49cd432205b2a5ca815e.tar.bz2
block: add a new revalidate_disk_size helper
revalidate_disk is a relative awkward helper for driver use, as it first calls an optional driver method and then updates the block device size, while most callers either don't need the method call at all, or want to keep state between the caller and the called method. Add a revalidate_disk_size helper that just performs the update of the block device size from the gendisk one, and switch all drivers that do not implement ->revalidate_disk to use the new helper instead of revalidate_disk() Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Acked-by: Song Liu <song@kernel.org> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r--fs/block_dev.c42
1 files changed, 29 insertions, 13 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 1e6441dbe840..9bfe37f394bd 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1312,6 +1312,34 @@ static void check_disk_size_change(struct gendisk *disk,
}
/**
+ * revalidate_disk_size - checks for disk size change and adjusts bdev size.
+ * @disk: struct gendisk to check
+ * @verbose: if %true log a message about a size change if there is any
+ *
+ * This routine checks to see if the bdev size does not match the disk size
+ * and adjusts it if it differs. When shrinking the bdev size, its all caches
+ * are freed.
+ */
+void revalidate_disk_size(struct gendisk *disk, bool verbose)
+{
+ struct block_device *bdev;
+
+ /*
+ * Hidden disks don't have associated bdev so there's no point in
+ * revalidating them.
+ */
+ if (disk->flags & GENHD_FL_HIDDEN)
+ return;
+
+ bdev = bdget_disk(disk, 0);
+ if (bdev) {
+ check_disk_size_change(disk, bdev, verbose);
+ bdput(bdev);
+ }
+}
+EXPORT_SYMBOL(revalidate_disk_size);
+
+/**
* revalidate_disk - wrapper for lower-level driver's revalidate_disk call-back
* @disk: struct gendisk to be revalidated
*
@@ -1325,19 +1353,7 @@ int revalidate_disk(struct gendisk *disk)
if (disk->fops->revalidate_disk)
ret = disk->fops->revalidate_disk(disk);
-
- /*
- * Hidden disks don't have associated bdev so there's no point in
- * revalidating it.
- */
- if (!(disk->flags & GENHD_FL_HIDDEN)) {
- struct block_device *bdev = bdget_disk(disk, 0);
-
- if (bdev) {
- check_disk_size_change(disk, bdev, ret == 0);
- bdput(bdev);
- }
- }
+ revalidate_disk_size(disk, ret == 0);
return ret;
}
EXPORT_SYMBOL(revalidate_disk);