packaging: Add spec file for VisionFive2
[platform/kernel/linux-starfive.git] / block / genhd.c
index 496e845..ab12ae6 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/badblocks.h>
 
 #include "blk.h"
+#include "blk-rq-qos.h"
 
 static struct kobject *block_depr;
 
@@ -559,6 +560,8 @@ EXPORT_SYMBOL(device_add_disk);
  */
 void del_gendisk(struct gendisk *disk)
 {
+       struct request_queue *q = disk->queue;
+
        might_sleep();
 
        if (WARN_ON_ONCE(!disk_live(disk) && !(disk->flags & GENHD_FL_HIDDEN)))
@@ -575,8 +578,17 @@ void del_gendisk(struct gendisk *disk)
        fsync_bdev(disk->part0);
        __invalidate_device(disk->part0, true);
 
+       /*
+        * Fail any new I/O.
+        */
+       set_bit(GD_DEAD, &disk->state);
        set_capacity(disk, 0);
 
+       /*
+        * Prevent new I/O from crossing bio_queue_enter().
+        */
+       blk_queue_start_drain(q);
+
        if (!(disk->flags & GENHD_FL_HIDDEN)) {
                sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi");
 
@@ -598,6 +610,18 @@ 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);
 
@@ -1056,6 +1080,7 @@ static void disk_release(struct device *dev)
        struct gendisk *disk = dev_to_disk(dev);
 
        might_sleep();
+       WARN_ON_ONCE(disk_live(disk));
 
        disk_release_events(disk);
        kfree(disk->random);