From: Ye Bin <yebin10@xxxxxxxxxx> Unlike recovery state may block other process, blocking IO only when host is blocked. Signed-off-by: Ye Bin <yebin10@xxxxxxxxxx> --- drivers/scsi/scsi_lib.c | 4 ++++ include/scsi/scsi_host.h | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index b7c569a42aa4..492487717f41 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -1731,6 +1731,10 @@ static blk_status_t scsi_queue_rq(struct blk_mq_hw_ctx *hctx, ret = BLK_STS_OFFLINE; goto out_dec_target_busy; } + + if (unlikely(scsi_host_blocked(shost))) + goto out_dec_target_busy; + if (!scsi_host_queue_ready(q, shost, sdev, cmd)) goto out_dec_target_busy; diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index 9e99317b11fa..571321bbb706 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h @@ -745,6 +745,11 @@ static inline int scsi_host_in_recovery(struct Scsi_Host *shost) shost->tmf_in_progress; } +static inline int scsi_host_blocked(struct Scsi_Host *shost) +{ + return shost->shost_state == SHOST_BLOCKED; +} + extern int scsi_queue_work(struct Scsi_Host *, struct work_struct *); extern void scsi_flush_work(struct Scsi_Host *); -- 2.31.1