Patch "ncr5380: Call scsi_eh_prep_cmnd() and scsi_eh_restore_cmnd() as and when appropriate" has been added to the 4.5-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
ncr5380: Call scsi_eh_prep_cmnd() and scsi_eh_restore_cmnd() as and when appropriate
to the 4.5-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:
ncr5380-call-scsi_eh_prep_cmnd-and-scsi_eh_restore_cmnd-as-and-when-appropriate.patch
and it can be found in the queue-4.5 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
8d5dbec3bcb24a7d071962448e0fecaca8c75cc7Mon Sep 17 00:00:00 2001
From: Finn Thain <[email protected]>
Date: Tue, 23 Feb 2016 10:07:09 +1100
Subject: ncr5380: Call scsi_eh_prep_cmnd() and scsi_eh_restore_cmnd() as and when appropriate
From: Finn Thain <[email protected]>
commit 8d5dbec3bcb24a7d071962448e0fecaca8c75cc7 upstream.
This bug causes the wrong command to have its sense pointer overwritten, which sometimes leads to a NULL pointer deref. Fix this by checking which command is being requeued before restoring the scsi_eh_save data.
It turns out that some targets will disconnect a REQUEST SENSE command. The autosense algorithm doesn't anticipate this. Hence multiple commands can end up undergoing autosense simultaneously, and they will all try to use the same scsi_eh_save struct, which won't work. Defer autosense when the scsi_eh_save storage is in use by another command.
--- drivers/scsi/NCR5380.c | 4 ++-- drivers/scsi/atari_NCR5380.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/scsi/NCR5380.c +2 -2
@@ -760,7 +760,7 @@ static struct scsi_cmnd *dequeue_next_cmstruct NCR5380_cmd *ncmd;struct scsi_cmnd *cmd; -if (list_empty (&hostdata->autosense)) { +if (hostdata->sensing ||list_empty (&hostdata->autosense)) {list_for_each_entry (ncmd, &hostdata->unissued, list) { cmd =NCR5380_to_scmd (ncmd); dsprintk(NDEBUG_QUEUES, instance, "dequeue: cmd=%p target=%d busy=0x%02x lun=%llu\n",
@@ -793,7 +793,7 @@ static void requeue_cmd(struct Scsi_Hoststruct NCR5380_hostdata *hostdata =shost_priv (instance);struct NCR5380_cmd *ncmd =scsi_cmd_priv (cmd); -if (hostdata->sensing) { +if (hostdata->sensing == cmd) {scsi_eh_restore_cmnd (cmd, &hostdata->ses);list_add (&ncmd->list, &hostdata->autosense); hostdata->sensing =NULL ;
drivers/scsi/atari_NCR5380.c +2 -2
@@ -862,7 +862,7 @@ static struct scsi_cmnd *dequeue_next_cmstruct NCR5380_cmd *ncmd;struct scsi_cmnd *cmd; -if (list_empty (&hostdata->autosense)) { +if (hostdata->sensing ||list_empty (&hostdata->autosense)) {list_for_each_entry (ncmd, &hostdata->unissued, list) { cmd =NCR5380_to_scmd (ncmd); dsprintk(NDEBUG_QUEUES, instance, "dequeue: cmd=%p target=%d busy=0x%02x lun=%llu\n",
@@ -901,7 +901,7 @@ static void requeue_cmd(struct Scsi_Hoststruct NCR5380_hostdata *hostdata =shost_priv (instance);struct NCR5380_cmd *ncmd =scsi_cmd_priv (cmd); -if (hostdata->sensing) { +if (hostdata->sensing == cmd) {scsi_eh_restore_cmnd (cmd, &hostdata->ses);list_add (&ncmd->list, &hostdata->autosense); hostdata->sensing =NULL ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.5/ncr5380-correctly-clear-command-pointers-and-lists-after-bus-reset.patch queue-4.5/ncr5380-call-scsi_eh_prep_cmnd-and-scsi_eh_restore_cmnd-as-and-when-appropriate.patch queue-4.5/ncr5380-forget-aborted-commands.patch queue-4.5/ncr5380-dont-release-lock-for-pio-transfer.patch queue-4.5/ncr5380-dont-re-enter-ncr5380_select.patch queue-4.5/ncr5380-fix-ncr5380_select-eh-checks-and-result-handling.patch