summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin K. Petersen <martin.petersen@oracle.com>2026-01-12 06:08:12 +0300
committerMartin K. Petersen <martin.petersen@oracle.com>2026-01-12 06:08:12 +0300
commitee8112a2e0f96d7a125c6ad3a7851e0d598c28a8 (patch)
tree291cb67cad5ce0d21e377155de8a053a6ef80e6e
parent309b23a1553acdc6b8534682ee1782c9598e0e2e (diff)
parente60b579720993bd813dbfe77411ab63e721fe189 (diff)
downloadlinux-ee8112a2e0f96d7a125c6ad3a7851e0d598c28a8.tar.xz
Merge patch series "Call scsi_host_busy() after the SCSI host has been added"
Bart Van Assche <bvanassche@acm.org> says: Hi Martin, The UFS driver is the only SCSI driver I know of that may call scsi_host_busy() before the SCSI host has been added. This patch series modifies the UFS driver such that scsi_host_busy() is only called after the SCSI host has been added. Additionally, commit a0b7780602b1 ("scsi: core: Fix a regression triggered by scsi_host_busy()") is reverted because all scsi_host_busy() calls now happen after the corresponding SCSI host has been added. Please consider this patch series for the next merge window. Thanks, Bart. Link: https://patch.msgid.link/20260109205104.496478-1-bvanassche@acm.org Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r--drivers/scsi/hosts.c5
-rw-r--r--drivers/ufs/core/ufshcd.c6
2 files changed, 6 insertions, 5 deletions
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index 1b3fbd328277..e047747d4ecf 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -626,9 +626,8 @@ int scsi_host_busy(struct Scsi_Host *shost)
{
int cnt = 0;
- if (shost->tag_set.ops)
- blk_mq_tagset_busy_iter(&shost->tag_set,
- scsi_host_check_in_flight, &cnt);
+ blk_mq_tagset_busy_iter(&shost->tag_set,
+ scsi_host_check_in_flight, &cnt);
return cnt;
}
EXPORT_SYMBOL(scsi_host_busy);
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 78669c205568..057678f4c50a 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -283,7 +283,8 @@ static bool ufshcd_has_pending_tasks(struct ufs_hba *hba)
static bool ufshcd_is_ufs_dev_busy(struct ufs_hba *hba)
{
- return scsi_host_busy(hba->host) || ufshcd_has_pending_tasks(hba);
+ return (hba->scsi_host_added && scsi_host_busy(hba->host)) ||
+ ufshcd_has_pending_tasks(hba);
}
static const struct ufs_dev_quirk ufs_fixups[] = {
@@ -678,7 +679,8 @@ static void ufshcd_print_host_state(struct ufs_hba *hba)
dev_err(hba->dev, "UFS Host state=%d\n", hba->ufshcd_state);
dev_err(hba->dev, "%d outstanding reqs, tasks=0x%lx\n",
- scsi_host_busy(hba->host), hba->outstanding_tasks);
+ hba->scsi_host_added ? scsi_host_busy(hba->host) : 0,
+ hba->outstanding_tasks);
dev_err(hba->dev, "saved_err=0x%x, saved_uic_err=0x%x\n",
hba->saved_err, hba->saved_uic_err);
dev_err(hba->dev, "Device power mode=%d, UIC link state=%d\n",