diff options
-rw-r--r-- | drivers/scsi/device_handler/scsi_dh.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/scsi/device_handler/scsi_dh.c b/drivers/scsi/device_handler/scsi_dh.c index 6fae3d285ae7..b837c5b3c8f9 100644 --- a/drivers/scsi/device_handler/scsi_dh.c +++ b/drivers/scsi/device_handler/scsi_dh.c | |||
@@ -442,12 +442,19 @@ int scsi_dh_activate(struct request_queue *q, activate_complete fn, void *data) | |||
442 | sdev = q->queuedata; | 442 | sdev = q->queuedata; |
443 | if (sdev && sdev->scsi_dh_data) | 443 | if (sdev && sdev->scsi_dh_data) |
444 | scsi_dh = sdev->scsi_dh_data->scsi_dh; | 444 | scsi_dh = sdev->scsi_dh_data->scsi_dh; |
445 | if (!scsi_dh || !get_device(&sdev->sdev_gendev)) | 445 | if (!scsi_dh || !get_device(&sdev->sdev_gendev) || |
446 | sdev->sdev_state == SDEV_CANCEL || | ||
447 | sdev->sdev_state == SDEV_DEL) | ||
446 | err = SCSI_DH_NOSYS; | 448 | err = SCSI_DH_NOSYS; |
449 | if (sdev->sdev_state == SDEV_OFFLINE) | ||
450 | err = SCSI_DH_DEV_OFFLINED; | ||
447 | spin_unlock_irqrestore(q->queue_lock, flags); | 451 | spin_unlock_irqrestore(q->queue_lock, flags); |
448 | 452 | ||
449 | if (err) | 453 | if (err) { |
454 | if (fn) | ||
455 | fn(data, err); | ||
450 | return err; | 456 | return err; |
457 | } | ||
451 | 458 | ||
452 | if (scsi_dh->activate) | 459 | if (scsi_dh->activate) |
453 | err = scsi_dh->activate(sdev, fn, data); | 460 | err = scsi_dh->activate(sdev, fn, data); |