Merge tag 'block-6.0-2022-09-22' of git://git.kernel.dk/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 24 Sep 2022 15:22:53 +0000 (08:22 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 24 Sep 2022 15:22:53 +0000 (08:22 -0700)
Pull block fixes from Jens Axboe:
 "Fix a regression that's been plaguing us by reverting the offending
  commit, as attempts to both reproduce the issue and fix it in a saner
  fashion have failed.

  Fix for a potential oops condition in the s390 dasd block driver"

* tag 'block-6.0-2022-09-22' of git://git.kernel.dk/linux:
  Revert "block: freeze the queue earlier in del_gendisk"
  s390/dasd: fix Oops in dasd_alias_get_start_dev due to missing pavgroup

block/genhd.c
drivers/s390/block/dasd_alias.c

index d36fabf0abc1faaca05b18916f7f14f9cd1cee15..988ba52fd33166d056bdbea9845232a45c5df03d 100644 (file)
@@ -602,7 +602,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);
 
        if (!(disk->flags & GENHD_FL_HIDDEN)) {
                sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi");
@@ -626,6 +625,8 @@ void del_gendisk(struct gendisk *disk)
        pm_runtime_set_memalloc_noio(disk_to_dev(disk), false);
        device_del(disk_to_dev(disk));
 
+       blk_mq_freeze_queue_wait(q);
+
        blk_throtl_cancel_bios(disk->queue);
 
        blk_sync_queue(q);
index dc78a523a69f2104d911555b097a6407a8e04cc1..b6b938aa6615894087d20943624e60bac54754a8 100644 (file)
@@ -675,12 +675,12 @@ int dasd_alias_remove_device(struct dasd_device *device)
 struct dasd_device *dasd_alias_get_start_dev(struct dasd_device *base_device)
 {
        struct dasd_eckd_private *alias_priv, *private = base_device->private;
-       struct alias_pav_group *group = private->pavgroup;
        struct alias_lcu *lcu = private->lcu;
        struct dasd_device *alias_device;
+       struct alias_pav_group *group;
        unsigned long flags;
 
-       if (!group || !lcu)
+       if (!lcu)
                return NULL;
        if (lcu->pav == NO_PAV ||
            lcu->flags & (NEED_UAC_UPDATE | UPDATE_PENDING))
@@ -697,6 +697,11 @@ struct dasd_device *dasd_alias_get_start_dev(struct dasd_device *base_device)
        }
 
        spin_lock_irqsave(&lcu->lock, flags);
+       group = private->pavgroup;
+       if (!group) {
+               spin_unlock_irqrestore(&lcu->lock, flags);
+               return NULL;
+       }
        alias_device = group->next;
        if (!alias_device) {
                if (list_empty(&group->aliaslist)) {