On 3/24/23 18:17, Ye Bin wrote:
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index 9b6fbbe15d92..3b497fd4d329 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c @@ -90,6 +90,7 @@ int scsi_host_set_state(struct Scsi_Host *shost, enum scsi_host_state state) switch (oldstate) { case SHOST_CREATED: case SHOST_RECOVERY: + case SHOST_BLOCKED: break; default: goto illegal; @@ -99,6 +100,7 @@ int scsi_host_set_state(struct Scsi_Host *shost, enum scsi_host_state state) case SHOST_RECOVERY: switch (oldstate) { case SHOST_RUNNING: + case SHOST_BLOCKED: break; default: goto illegal; @@ -109,6 +111,7 @@ int scsi_host_set_state(struct Scsi_Host *shost, enum scsi_host_state state) switch (oldstate) { case SHOST_CREATED: case SHOST_RUNNING: + case SHOST_BLOCKED: case SHOST_CANCEL_RECOVERY: break; default: @@ -144,6 +147,14 @@ int scsi_host_set_state(struct Scsi_Host *shost, enum scsi_host_state state) goto illegal; } break; + case SHOST_BLOCKED: + switch (oldstate) { + case SHOST_RUNNING: + break; + default: + goto illegal; + } + break; }
If a host is blocked, error recovery happens and completes, the host will be unblocked. I don't think that is acceptable.
The "blocked" property is orthogonal to the host state so a new boolean member variable should be introduced in struct Scsi_Host instead of introducing a new SCSI host state.
Thanks, Bart.