block: Add invalidate_disk() helper to invalidate the gendisk
authorXie Yongji <xieyongji@bytedance.com>
Wed, 22 Sep 2021 12:37:08 +0000 (20:37 +0800)
committerJens Axboe <axboe@kernel.dk>
Thu, 21 Oct 2021 16:12:41 +0000 (10:12 -0600)
To hide internal implementation and simplify some driver code,
this adds a helper to invalidate the gendisk. It will clean the
gendisk's associated buffer/page caches and reset its internal
states.

Signed-off-by: Xie Yongji <xieyongji@bytedance.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20210922123711.187-2-xieyongji@bytedance.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/genhd.c
include/linux/genhd.h

index 80943c123c3e0724b2d7c2493b2c7b6391ee9220..64f83c4aee99bfd7eb7bacdd0907830c88aa1d4e 100644 (file)
@@ -624,6 +624,26 @@ void del_gendisk(struct gendisk *disk)
 }
 EXPORT_SYMBOL(del_gendisk);
 
+/**
+ * invalidate_disk - invalidate the disk
+ * @disk: the struct gendisk to invalidate
+ *
+ * A helper to invalidates the disk. It will clean the disk's associated
+ * buffer/page caches and reset its internal states so that the disk
+ * can be reused by the drivers.
+ *
+ * Context: can sleep
+ */
+void invalidate_disk(struct gendisk *disk)
+{
+       struct block_device *bdev = disk->part0;
+
+       invalidate_bdev(bdev);
+       bdev->bd_inode->i_mapping->wb_err = 0;
+       set_capacity(disk, 0);
+}
+EXPORT_SYMBOL(invalidate_disk);
+
 /* sysfs access to bad-blocks list. */
 static ssize_t disk_badblocks_show(struct device *dev,
                                        struct device_attribute *attr,
index c70bc5fce4dbb3ad81918c8cf2756d23bf85dc7d..13f313ab99e70cbf147c1fb248037b01ef495d62 100644 (file)
@@ -213,6 +213,8 @@ static inline int add_disk(struct gendisk *disk)
 }
 extern void del_gendisk(struct gendisk *gp);
 
+void invalidate_disk(struct gendisk *disk);
+
 void set_disk_ro(struct gendisk *disk, bool read_only);
 
 static inline int get_disk_ro(struct gendisk *disk)