Message ID | 20230325011734.507453-3-yebin@huaweicloud.com |
---|---|
State | New |
Headers | show |
Series | limit set the host state by sysfs | expand |
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.
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; } shost->shost_state = state; return 0; diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index cc0ae5e3def3..b14f95ac594e 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c @@ -69,6 +69,7 @@ static const struct { { SHOST_RECOVERY, "recovery" }, { SHOST_CANCEL_RECOVERY, "cancel/recovery" }, { SHOST_DEL_RECOVERY, "deleted/recovery", }, + { SHOST_BLOCKED, "blocked", }, }; const char *scsi_host_state_name(enum scsi_host_state state) { diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index 587cc767bb67..9e99317b11fa 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h @@ -527,6 +527,7 @@ enum scsi_host_state { SHOST_RECOVERY, SHOST_CANCEL_RECOVERY, SHOST_DEL_RECOVERY, + SHOST_BLOCKED, }; struct Scsi_Host {