| From e24e81307f9d34e1f00c44ee8fa17b1664473c7e Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 19 May 2021 22:31:02 +0800 |
| Subject: scsi: core: Cap scsi_host cmd_per_lun at can_queue |
| |
| From: John Garry <john.garry@huawei.com> |
| |
| [ Upstream commit ea2f0f77538c50739b9fb4de4700cee5535e1f77 ] |
| |
| The sysfs handling function sdev_store_queue_depth() enforces that the sdev |
| queue depth cannot exceed shost can_queue. The initial sdev queue depth |
| comes from shost cmd_per_lun. However, the LLDD may manually set |
| cmd_per_lun to be larger than can_queue, which leads to an initial sdev |
| queue depth greater than can_queue. |
| |
| Such an issue was reported in [0], which caused a hang. That has since been |
| fixed in commit fc09acb7de31 ("scsi: scsi_debug: Fix cmd_per_lun, set to |
| max_queue"). |
| |
| Stop this possibly happening for other drivers by capping shost cmd_per_lun |
| at shost can_queue. |
| |
| [0] https://lore.kernel.org/linux-scsi/YHaez6iN2HHYxYOh@T590/ |
| |
| Link: https://lore.kernel.org/r/1621434662-173079-1-git-send-email-john.garry@huawei.com |
| Reviewed-by: Ming Lei <ming.lei@redhat.com> |
| Reviewed-by: Bart Van Assche <bvanassche@acm.org> |
| Signed-off-by: John Garry <john.garry@huawei.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/scsi/hosts.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c |
| index bd0dcb540f82..da3920a19d53 100644 |
| --- a/drivers/scsi/hosts.c |
| +++ b/drivers/scsi/hosts.c |
| @@ -220,6 +220,9 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev, |
| goto fail; |
| } |
| |
| + shost->cmd_per_lun = min_t(short, shost->cmd_per_lun, |
| + shost->can_queue); |
| + |
| error = scsi_init_sense_cache(shost); |
| if (error) |
| goto fail; |
| -- |
| 2.30.2 |
| |