SCSI: Fix error handling when no ULD is attached
authorMartin K. Petersen <martin.petersen@oracle.com>
Sun, 15 Apr 2012 03:01:28 +0000 (23:01 -0400)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 15 Apr 2012 18:08:53 +0000 (11:08 -0700)
Commit 18a4d0a22ed6 ("[SCSI] Handle disk devices which can not process
medium access commands") introduced a bug in which we would attempt to
dereference the scsi driver even when the device had no ULD attached.

Ensure that a driver is registered and make the driver accessor function
more resilient to errors during device discovery.

Reported-by: Elric Fu <elricfu1@gmail.com>
Reported-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/scsi/scsi_error.c
include/scsi/scsi_cmnd.h

index 2cfcbffa41fd559b075e7c75eae57e2c7f637488..386f0c53bea7e17cf2b74fe29af5d1d7176c25b9 100644 (file)
@@ -835,7 +835,7 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd,
 
        scsi_eh_restore_cmnd(scmd, &ses);
 
-       if (sdrv->eh_action)
+       if (sdrv && sdrv->eh_action)
                rtn = sdrv->eh_action(scmd, cmnd, cmnd_size, rtn);
 
        return rtn;
index 377df4a28512bd7d97aad68b9a72d1f449f2cba8..1e1198546c725d43a7ff6baa657c25ef364d73ee 100644 (file)
@@ -134,6 +134,9 @@ struct scsi_cmnd {
 
 static inline struct scsi_driver *scsi_cmd_to_driver(struct scsi_cmnd *cmd)
 {
+       if (!cmd->request->rq_disk)
+               return NULL;
+
        return *(struct scsi_driver **)cmd->request->rq_disk->private_data;
 }