Commit 0be27f7b authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'block-6.0-2022-09-22' of git://git.kernel.dk/linux

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
parents a63f2e7c 4c66a326
...@@ -602,7 +602,6 @@ void del_gendisk(struct gendisk *disk) ...@@ -602,7 +602,6 @@ void del_gendisk(struct gendisk *disk)
* Prevent new I/O from crossing bio_queue_enter(). * Prevent new I/O from crossing bio_queue_enter().
*/ */
blk_queue_start_drain(q); blk_queue_start_drain(q);
blk_mq_freeze_queue_wait(q);
if (!(disk->flags & GENHD_FL_HIDDEN)) { if (!(disk->flags & GENHD_FL_HIDDEN)) {
sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi"); sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi");
...@@ -626,6 +625,8 @@ void del_gendisk(struct gendisk *disk) ...@@ -626,6 +625,8 @@ void del_gendisk(struct gendisk *disk)
pm_runtime_set_memalloc_noio(disk_to_dev(disk), false); pm_runtime_set_memalloc_noio(disk_to_dev(disk), false);
device_del(disk_to_dev(disk)); device_del(disk_to_dev(disk));
blk_mq_freeze_queue_wait(q);
blk_throtl_cancel_bios(disk->queue); blk_throtl_cancel_bios(disk->queue);
blk_sync_queue(q); blk_sync_queue(q);
......
...@@ -675,12 +675,12 @@ int dasd_alias_remove_device(struct dasd_device *device) ...@@ -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_device *dasd_alias_get_start_dev(struct dasd_device *base_device)
{ {
struct dasd_eckd_private *alias_priv, *private = base_device->private; struct dasd_eckd_private *alias_priv, *private = base_device->private;
struct alias_pav_group *group = private->pavgroup;
struct alias_lcu *lcu = private->lcu; struct alias_lcu *lcu = private->lcu;
struct dasd_device *alias_device; struct dasd_device *alias_device;
struct alias_pav_group *group;
unsigned long flags; unsigned long flags;
if (!group || !lcu) if (!lcu)
return NULL; return NULL;
if (lcu->pav == NO_PAV || if (lcu->pav == NO_PAV ||
lcu->flags & (NEED_UAC_UPDATE | UPDATE_PENDING)) lcu->flags & (NEED_UAC_UPDATE | UPDATE_PENDING))
...@@ -697,6 +697,11 @@ struct dasd_device *dasd_alias_get_start_dev(struct dasd_device *base_device) ...@@ -697,6 +697,11 @@ struct dasd_device *dasd_alias_get_start_dev(struct dasd_device *base_device)
} }
spin_lock_irqsave(&lcu->lock, flags); spin_lock_irqsave(&lcu->lock, flags);
group = private->pavgroup;
if (!group) {
spin_unlock_irqrestore(&lcu->lock, flags);
return NULL;
}
alias_device = group->next; alias_device = group->next;
if (!alias_device) { if (!alias_device) {
if (list_empty(&group->aliaslist)) { if (list_empty(&group->aliaslist)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment