| From 8beb330044d0d1878c7b92290e91c0b889e92633 Mon Sep 17 00:00:00 2001 |
| From: James Bottomley <jejb@linux.vnet.ibm.com> |
| Date: Mon, 13 Jun 2016 22:00:07 -0700 |
| Subject: 53c700: fix BUG on untagged commands |
| |
| From: James Bottomley <jejb@linux.vnet.ibm.com> |
| |
| commit 8beb330044d0d1878c7b92290e91c0b889e92633 upstream. |
| |
| The untagged command case in the 53c700 driver has been broken since |
| host wide tags were enabled because the replaced scsi_find_tag() |
| function had a special case for the tag value SCSI_NO_TAG to retrieve |
| sdev->current_cmnd. The replacement function scsi_host_find_tag() has |
| no such special case and returns NULL causing untagged commands to |
| trigger a BUG() in the driver. Inspection shows that the 53c700 is the |
| only driver using this SCSI_NO_TAG case, so a local fix in the driver |
| suffices to fix this problem globally. |
| |
| Fixes: 64d513ac31b - "scsi: use host wide tags by default" |
| Reported-by: Helge Deller <deller@gmx.de> |
| Tested-by: Helge Deller <deller@gmx.de> |
| Signed-off-by: James Bottomley <jejb@linux.vnet.ibm.com> |
| Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> |
| Reviewed-by: Ewan D. Milne <emilne@redhat.com> |
| Acked-by: Christoph Hellwig <hch@lst.de> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/scsi/53c700.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/scsi/53c700.c |
| +++ b/drivers/scsi/53c700.c |
| @@ -1122,7 +1122,7 @@ process_script_interrupt(__u32 dsps, __u |
| } else { |
| struct scsi_cmnd *SCp; |
| |
| - SCp = scsi_host_find_tag(SDp->host, SCSI_NO_TAG); |
| + SCp = SDp->current_cmnd; |
| if(unlikely(SCp == NULL)) { |
| sdev_printk(KERN_ERR, SDp, |
| "no saved request for untagged cmd\n"); |
| @@ -1826,7 +1826,7 @@ NCR_700_queuecommand_lck(struct scsi_cmn |
| slot->tag, slot); |
| } else { |
| slot->tag = SCSI_NO_TAG; |
| - /* must populate current_cmnd for scsi_host_find_tag to work */ |
| + /* save current command for reselection */ |
| SCp->device->current_cmnd = SCp; |
| } |
| /* sanity check: some of the commands generated by the mid-layer |