[SCSI] 3w-xxxx: Create sense buffer for unsupported commands
authorMartin K. Petersen <martin.petersen@oracle.com>
Mon, 29 Apr 2013 16:13:01 +0000 (12:13 -0400)
committerJames Bottomley <JBottomley@Parallels.com>
Mon, 24 Jun 2013 23:32:22 +0000 (16:32 -0700)
Make the driver return appropriate sense data when an unsupported
operation is queued. This will cause the SCSI layer to stop issuing the
offending command.

Reported-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Acked-by: Adam Radford <aradford@gmail.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/3w-xxxx.c

index 56662ae03dea65adad90665acc1e55690a192fea..b9276d10b25c2e277c05e1b6e48e196a11b38fa4 100644 (file)
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_tcq.h>
 #include <scsi/scsi_cmnd.h>
+#include <scsi/scsi_eh.h>
 #include "3w-xxxx.h"
 
 /* Globals */
@@ -2009,7 +2010,8 @@ static int tw_scsi_queue_lck(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_c
                        printk(KERN_NOTICE "3w-xxxx: scsi%d: Unknown scsi opcode: 0x%x\n", tw_dev->host->host_no, *command);
                        tw_dev->state[request_id] = TW_S_COMPLETED;
                        tw_state_request_finish(tw_dev, request_id);
-                       SCpnt->result = (DID_BAD_TARGET << 16);
+                       SCpnt->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
+                       scsi_build_sense_buffer(1, SCpnt->sense_buffer, ILLEGAL_REQUEST, 0x20, 0);
                        done(SCpnt);
                        retval = 0;
        }