@@ -925,7 +925,7 @@ void scsi_eh_done(struct scsi_cmnd *scmd)
* scsi_try_host_reset - ask host adapter to reset itself
* @scmd: SCSI cmd to send host reset.
*/
-static enum scsi_disposition scsi_try_host_reset(struct scsi_cmnd *scmd)
+static enum scsi_disposition __scsi_try_host_reset(struct scsi_cmnd *scmd)
{
unsigned long flags;
enum scsi_disposition rtn;
@@ -951,11 +951,19 @@ static enum scsi_disposition scsi_try_host_reset(struct scsi_cmnd *scmd)
return rtn;
}
+static enum scsi_disposition scsi_try_host_reset(struct scsi_cmnd *scmd)
+{
+ if (!scsi_host_in_recovery(scmd->device->host))
+ return FAILED;
+
+ return __scsi_try_host_reset(scmd);
+}
+
/**
* scsi_try_bus_reset - ask host to perform a bus reset
* @scmd: SCSI cmd to send bus reset.
*/
-static enum scsi_disposition scsi_try_bus_reset(struct scsi_cmnd *scmd)
+static enum scsi_disposition __scsi_try_bus_reset(struct scsi_cmnd *scmd)
{
unsigned long flags;
enum scsi_disposition rtn;
@@ -981,6 +989,14 @@ static enum scsi_disposition scsi_try_bus_reset(struct scsi_cmnd *scmd)
return rtn;
}
+static enum scsi_disposition scsi_try_bus_reset(struct scsi_cmnd *scmd)
+{
+ if (!scsi_host_in_recovery(scmd->device->host))
+ return FAILED;
+
+ return __scsi_try_bus_reset(scmd);
+}
+
static void __scsi_report_device_reset(struct scsi_device *sdev, void *data)
{
sdev->was_reset = 1;
@@ -997,7 +1013,7 @@ static void __scsi_report_device_reset(struct scsi_device *sdev, void *data)
* timer on it, and set the host back to a consistent state prior to
* returning.
*/
-static enum scsi_disposition scsi_try_target_reset(struct scsi_cmnd *scmd)
+static enum scsi_disposition __scsi_try_target_reset(struct scsi_cmnd *scmd)
{
unsigned long flags;
enum scsi_disposition rtn;
@@ -1018,6 +1034,15 @@ static enum scsi_disposition scsi_try_target_reset(struct scsi_cmnd *scmd)
return rtn;
}
+static enum scsi_disposition scsi_try_target_reset(struct scsi_cmnd *scmd)
+{
+ if (!(scsi_target_in_recovery(scsi_target(scmd->device)) ||
+ scsi_host_in_recovery(scmd->device->host)))
+ return FAILED;
+
+ return __scsi_try_target_reset(scmd);
+}
+
/**
* scsi_try_bus_device_reset - Ask host to perform a BDR on a dev
* @scmd: SCSI cmd used to send BDR
@@ -2541,17 +2566,17 @@ scsi_ioctl_reset(struct scsi_device *dev, int __user *arg)
break;
fallthrough;
case SG_SCSI_RESET_TARGET:
- rtn = scsi_try_target_reset(scmd);
+ rtn = __scsi_try_target_reset(scmd);
if (rtn == SUCCESS || (val & SG_SCSI_RESET_NO_ESCALATE))
break;
fallthrough;
case SG_SCSI_RESET_BUS:
- rtn = scsi_try_bus_reset(scmd);
+ rtn = __scsi_try_bus_reset(scmd);
if (rtn == SUCCESS || (val & SG_SCSI_RESET_NO_ESCALATE))
break;
fallthrough;
case SG_SCSI_RESET_HOST:
- rtn = scsi_try_host_reset(scmd);
+ rtn = __scsi_try_host_reset(scmd);
if (rtn == SUCCESS)
break;
fallthrough;