]> git.proxmox.com Git - mirror_ubuntu-kernels.git/blobdiff - block/genhd.c
Merge tag 'for-5.16/block-2021-10-29' of git://git.kernel.dk/linux-block
[mirror_ubuntu-kernels.git] / block / genhd.c
index b49858550fa6e2fabf50d54bf03630f38e2be304..2052aeffa39b5f6d6da4ea1741118172781a3909 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/seq_file.h>
 #include <linux/slab.h>
 #include <linux/kmod.h>
+#include <linux/major.h>
 #include <linux/mutex.h>
 #include <linux/idr.h>
 #include <linux/log2.h>
@@ -588,16 +589,6 @@ void del_gendisk(struct gendisk *disk)
         * Prevent new I/O from crossing bio_queue_enter().
         */
        blk_queue_start_drain(q);
-       blk_mq_freeze_queue_wait(q);
-
-       rq_qos_exit(q);
-       blk_sync_queue(q);
-       blk_flush_integrity();
-       /*
-        * Allow using passthrough request again after the queue is torn down.
-        */
-       blk_queue_flag_clear(QUEUE_FLAG_INIT_DONE, q);
-       __blk_mq_unfreeze_queue(q, true);
 
        if (!(disk->flags & GENHD_FL_HIDDEN)) {
                sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi");
@@ -620,9 +611,41 @@ void del_gendisk(struct gendisk *disk)
                sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk)));
        pm_runtime_set_memalloc_noio(disk_to_dev(disk), false);
        device_del(disk_to_dev(disk));
+
+       blk_mq_freeze_queue_wait(q);
+
+       rq_qos_exit(q);
+       blk_sync_queue(q);
+       blk_flush_integrity();
+       /*
+        * Allow using passthrough request again after the queue is torn down.
+        */
+       blk_queue_flag_clear(QUEUE_FLAG_INIT_DONE, q);
+       __blk_mq_unfreeze_queue(q, true);
+
 }
 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,
@@ -882,7 +905,7 @@ ssize_t part_stat_show(struct device *dev,
                       struct device_attribute *attr, char *buf)
 {
        struct block_device *bdev = dev_to_bdev(dev);
-       struct request_queue *q = bdev->bd_disk->queue;
+       struct request_queue *q = bdev_get_queue(bdev);
        struct disk_stats stat;
        unsigned int inflight;
 
@@ -926,7 +949,7 @@ ssize_t part_inflight_show(struct device *dev, struct device_attribute *attr,
                           char *buf)
 {
        struct block_device *bdev = dev_to_bdev(dev);
-       struct request_queue *q = bdev->bd_disk->queue;
+       struct request_queue *q = bdev_get_queue(bdev);
        unsigned int inflight[2];
 
        if (queue_is_mq(q))
@@ -1266,6 +1289,9 @@ struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
        if (!disk->bdi)
                goto out_free_disk;
 
+       /* bdev_alloc() might need the queue, set before the first call */
+       disk->queue = q;
+
        disk->part0 = bdev_alloc(disk, 0);
        if (!disk->part0)
                goto out_free_bdi;
@@ -1281,7 +1307,6 @@ struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
        disk_to_dev(disk)->type = &disk_type;
        device_initialize(disk_to_dev(disk));
        inc_diskseq(disk);
-       disk->queue = q;
        q->disk = disk;
        lockdep_init_map(&disk->lockdep_map, "(bio completion)", lkclass, 0);
 #ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
@@ -1386,12 +1411,6 @@ void set_disk_ro(struct gendisk *disk, bool read_only)
 }
 EXPORT_SYMBOL(set_disk_ro);
 
-int bdev_read_only(struct block_device *bdev)
-{
-       return bdev->bd_read_only || get_disk_ro(bdev->bd_disk);
-}
-EXPORT_SYMBOL(bdev_read_only);
-
 void inc_diskseq(struct gendisk *disk)
 {
        disk->diskseq = atomic64_inc_return(&diskseq);