Patch "scsi: scsi_dh_alua: Check scsi_device_get() return value" has been added to the 4.10-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
scsi: scsi_dh_alua: Check scsi_device_get() return value
to the 4.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
scsi-scsi_dh_alua-check-scsi_device_get-return-value.patch
and it can be found in the queue-4.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
625fe857e4fac6518716f3c0ff5e5deb8ec6d238Mon Sep 17 00:00:00 2001
From: Bart Van Assche <[email protected]>
Date: Fri, 17 Mar 2017 17:02:01 -0700
Subject: scsi: scsi_dh_alua: Check scsi_device_get() return value
From: Bart Van Assche <[email protected]>
commit 625fe857e4fac6518716f3c0ff5e5deb8ec6d238 upstream.
Do not queue ALUA work nor call scsi_device_put() if the scsi_device_get() call fails. This patch fixes the following crash:
general protection fault: 0000 [#1] SMP RIP: 0010:scsi_device_put+0xb/0x30 Call Trace: scsi_disk_put+0x2d/0x40 sd_release+0x3d/0xb0 __blkdev_put+0x29e/0x360 blkdev_put+0x49/0x170 dm_put_table_device+0x58/0xc0 [dm_mod] dm_put_device+0x70/0xc0 [dm_mod] free_priority_group+0x92/0xc0 [dm_multipath] free_multipath+0x70/0xc0 [dm_multipath] multipath_dtr+0x19/0x20 [dm_multipath] dm_table_destroy+0x67/0x120 [dm_mod] dev_suspend+0xde/0x240 [dm_mod] ctl_ioctl+0x1f5/0x520 [dm_mod] dm_ctl_ioctl+0xe/0x20 [dm_mod] do_vfs_ioctl+0x8f/0x700 SyS_ioctl+0x3c/0x70 entry_SYSCALL_64_fastpath+0x18/0xad
--- drivers/scsi/device_handler/scsi_dh_alua.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/scsi/device_handler/scsi_dh_alua.c +9 -9
@@ -874,7 +874,7 @@ static void alua_rtpg_queue(struct alua_unsigned long flags;struct workqueue_struct *alua_wq = kaluad_wq; -if (!pg) +if (!pg ||scsi_device_get (sdev))return ;spin_lock_irqsave (&pg->lock, flags);
@@ -888,14 +888,12 @@ static void alua_rtpg_queue(struct alua_ pg->flags |=ALUA_PG_RUN_RTPG ;kref_get (&pg->kref); pg->rtpg_sdev = sdev; -scsi_device_get (sdev); start_queue =1 ; }else if (!(pg->flags &ALUA_PG_RUN_RTPG ) && force) { pg->flags |=ALUA_PG_RUN_RTPG ;/* Do not queue if the worker is already running */ if (!(pg->flags &ALUA_PG_RUNNING )) {kref_get (&pg->kref); - sdev =NULL ; start_queue =1 ; } }
@@ -904,13 +902,15 @@ static void alua_rtpg_queue(struct alua_ alua_wq = kaluad_sync_wq;spin_unlock_irqrestore (&pg->lock, flags); -if (start_queue && - !queue_delayed_work (alua_wq, &pg->rtpg_work, -msecs_to_jiffies (ALUA_RTPG_DELAY_MSECS ))) { -if (sdev) -scsi_device_put (sdev); -kref_put (&pg->kref, release_port_group); +if (start_queue) { +if (queue_delayed_work (alua_wq, &pg->rtpg_work, +msecs_to_jiffies (ALUA_RTPG_DELAY_MSECS ))) + sdev =NULL ; +else +kref_put (&pg->kref, release_port_group); } +if (sdev) +scsi_device_put (sdev); }/*
Patches currently in stable-queue which might be from [email protected] are
queue-4.10/scsi-scsi_dh_alua-ensure-that-alua_activate-calls-the-completion-function.patch queue-4.10/scsi-scsi_dh_alua-check-scsi_device_get-return-value.patch