]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: libsas: Add LUN number check in .slave_alloc callback
authorYufen Yu <yuyufen@huawei.com>
Tue, 22 Jun 2021 03:40:37 +0000 (11:40 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 25 Jul 2021 12:35:13 +0000 (14:35 +0200)
[ Upstream commit 49da96d77938db21864dae6b7736b71e96c1d203 ]

Offlining a SATA device connected to a hisi SAS controller and then
scanning the host will result in detecting 255 non-existent devices:

  # lsscsi
  [2:0:0:0]    disk    ATA      Samsung SSD 860  2B6Q  /dev/sda
  [2:0:1:0]    disk    ATA      WDC WD2003FYYS-3 1D01  /dev/sdb
  [2:0:2:0]    disk    SEAGATE  ST600MM0006      B001  /dev/sdc
  # echo "offline" > /sys/block/sdb/device/state
  # echo "- - -" > /sys/class/scsi_host/host2/scan
  # lsscsi
  [2:0:0:0]    disk    ATA      Samsung SSD 860  2B6Q  /dev/sda
  [2:0:1:0]    disk    ATA      WDC WD2003FYYS-3 1D01  /dev/sdb
  [2:0:1:1]    disk    ATA      WDC WD2003FYYS-3 1D01  /dev/sdh
  ...
  [2:0:1:255]  disk    ATA      WDC WD2003FYYS-3 1D01  /dev/sdjb

After a REPORT LUN command issued to the offline device fails, the SCSI
midlayer tries to do a sequential scan of all devices whose LUN number is
not 0. However, SATA does not support LUN numbers at all.

Introduce a generic sas_slave_alloc() handler which will return -ENXIO for
SATA devices if the requested LUN number is larger than 0 and make libsas
drivers use this function as their .slave_alloc callback.

Link: https://lore.kernel.org/r/20210622034037.1467088-1-yuyufen@huawei.com
Reported-by: Wu Bo <wubo40@huawei.com>
Suggested-by: John Garry <john.garry@huawei.com>
Reviewed-by: John Garry <john.garry@huawei.com>
Reviewed-by: Jason Yan <yanaijie@huawei.com>
Signed-off-by: Yufen Yu <yuyufen@huawei.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/aic94xx/aic94xx_init.c
drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
drivers/scsi/isci/init.c
drivers/scsi/libsas/sas_scsi_host.c
drivers/scsi/mvsas/mv_init.c
drivers/scsi/pm8001/pm8001_init.c

index f5781e31f57c6e394d62274ce96d8fc68d12bb14..b68dfeb952ee8414a50c9fea5a4cacebf62cd164 100644 (file)
@@ -52,6 +52,7 @@ static struct scsi_host_template aic94xx_sht = {
        .max_sectors            = SCSI_DEFAULT_MAX_SECTORS,
        .eh_device_reset_handler        = sas_eh_device_reset_handler,
        .eh_target_reset_handler        = sas_eh_target_reset_handler,
+       .slave_alloc            = sas_slave_alloc,
        .target_destroy         = sas_target_destroy,
        .ioctl                  = sas_ioctl,
        .track_queue_depth      = 1,
index 9f6534bd354bc5849aed73ce1f11a51fe41f11c4..1443c803d8f753b730533db64153ecfa2b7cd3de 100644 (file)
@@ -1768,6 +1768,7 @@ static struct scsi_host_template sht_v1_hw = {
        .max_sectors            = SCSI_DEFAULT_MAX_SECTORS,
        .eh_device_reset_handler = sas_eh_device_reset_handler,
        .eh_target_reset_handler = sas_eh_target_reset_handler,
+       .slave_alloc            = sas_slave_alloc,
        .target_destroy         = sas_target_destroy,
        .ioctl                  = sas_ioctl,
        .shost_attrs            = host_attrs_v1_hw,
index 8e96a257e439383acb5033fd4eca565668ee237f..11c75881bd892a7d7771691acc64e86809bcdd25 100644 (file)
@@ -3542,6 +3542,7 @@ static struct scsi_host_template sht_v2_hw = {
        .max_sectors            = SCSI_DEFAULT_MAX_SECTORS,
        .eh_device_reset_handler = sas_eh_device_reset_handler,
        .eh_target_reset_handler = sas_eh_target_reset_handler,
+       .slave_alloc            = sas_slave_alloc,
        .target_destroy         = sas_target_destroy,
        .ioctl                  = sas_ioctl,
        .shost_attrs            = host_attrs_v2_hw,
index 916447f3c6073b6c0e128edaeae8417f455b44ee..13f314fa757e8856d98d48b0ed9f64c27d8b9734 100644 (file)
@@ -3064,6 +3064,7 @@ static struct scsi_host_template sht_v3_hw = {
        .max_sectors            = SCSI_DEFAULT_MAX_SECTORS,
        .eh_device_reset_handler = sas_eh_device_reset_handler,
        .eh_target_reset_handler = sas_eh_target_reset_handler,
+       .slave_alloc            = sas_slave_alloc,
        .target_destroy         = sas_target_destroy,
        .ioctl                  = sas_ioctl,
        .shost_attrs            = host_attrs_v3_hw,
index 1727d0c71b1235e153b7565cff1e5a29ead37b4b..c33bcf85fb211cb4be311c9fa8e2251eb145adeb 100644 (file)
@@ -166,6 +166,7 @@ static struct scsi_host_template isci_sht = {
        .eh_abort_handler               = sas_eh_abort_handler,
        .eh_device_reset_handler        = sas_eh_device_reset_handler,
        .eh_target_reset_handler        = sas_eh_target_reset_handler,
+       .slave_alloc                    = sas_slave_alloc,
        .target_destroy                 = sas_target_destroy,
        .ioctl                          = sas_ioctl,
        .shost_attrs                    = isci_host_attrs,
index bec83eb8ab87474a8fd08bc200d9ff5a2ade85dc..081f3145fe145d40b1df1230afa59257c9a577b3 100644 (file)
@@ -911,6 +911,14 @@ void sas_task_abort(struct sas_task *task)
                blk_abort_request(sc->request);
 }
 
+int sas_slave_alloc(struct scsi_device *sdev)
+{
+       if (dev_is_sata(sdev_to_domain_dev(sdev)) && sdev->lun)
+               return -ENXIO;
+
+       return 0;
+}
+
 void sas_target_destroy(struct scsi_target *starget)
 {
        struct domain_device *found_dev = starget->hostdata;
@@ -957,5 +965,6 @@ EXPORT_SYMBOL_GPL(sas_task_abort);
 EXPORT_SYMBOL_GPL(sas_phy_reset);
 EXPORT_SYMBOL_GPL(sas_eh_device_reset_handler);
 EXPORT_SYMBOL_GPL(sas_eh_target_reset_handler);
+EXPORT_SYMBOL_GPL(sas_slave_alloc);
 EXPORT_SYMBOL_GPL(sas_target_destroy);
 EXPORT_SYMBOL_GPL(sas_ioctl);
index da719b0694dcc41cb2ccef8d5ff7e0576535a289..52405ce58ade87ee4a887c1ebb1ae52473276c35 100644 (file)
@@ -45,6 +45,7 @@ static struct scsi_host_template mvs_sht = {
        .max_sectors            = SCSI_DEFAULT_MAX_SECTORS,
        .eh_device_reset_handler = sas_eh_device_reset_handler,
        .eh_target_reset_handler = sas_eh_target_reset_handler,
+       .slave_alloc            = sas_slave_alloc,
        .target_destroy         = sas_target_destroy,
        .ioctl                  = sas_ioctl,
        .shost_attrs            = mvst_host_attrs,
index 8882ba33ca87cbe08ba3a491f12992cd90ce317d..1f41537d52a58e089486407a78e8d2019590a120 100644 (file)
@@ -86,6 +86,7 @@ static struct scsi_host_template pm8001_sht = {
        .max_sectors            = SCSI_DEFAULT_MAX_SECTORS,
        .eh_device_reset_handler = sas_eh_device_reset_handler,
        .eh_target_reset_handler = sas_eh_target_reset_handler,
+       .slave_alloc            = sas_slave_alloc,
        .target_destroy         = sas_target_destroy,
        .ioctl                  = sas_ioctl,
        .shost_attrs            = pm8001_host_attrs,