Re: [PATCH v5 5/6] ata: libata-scsi: probe additional LUNs for multi-LUN ATAPI devices
From: Damien Le Moal
Date: Mon May 18 2026 - 04:14:17 EST
On 2026/05/12 22:27, Phil Pemberton wrote:
> After LUN 0 is added for an ATAPI device, check its BLIST_FORCELUN
> flag. If set, bump dev->nr_luns to the host's max_lun so the LUN
> routing in atapi_xlat() accepts the probe INQUIRYs, then call
> scsi_scan_target() with SCAN_WILD_CARD to trigger the SCSI layer's
> built-in sequential LUN scan for that target only. This probes
> LUNs 1..shost->max_lun, driven by the libata atapi_max_lun module
> parameter.
>
> Devices without BLIST_FORCELUN (the vast majority of ATAPI devices)
> are left with only LUN 0 -- no sequential scan is triggered, so
> single-LUN devices like the iHAS124 DVD writer are completely
> unaffected.
>
> Non-responding LUNs (PQ=0/PDT=0x1f) are silently skipped by
> scsi_probe_and_add_lun() when BLIST_NO_LUN_1F is set on the device
> via scsi_devinfo.
>
> Signed-off-by: Phil Pemberton <philpem@xxxxxxxxxxxxx>
> ---
> drivers/ata/libata-scsi.c | 27 +++++++++++++++++++++++----
> 1 file changed, 23 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
> index 2d714efc855f..a6f5557014c7 100644
> --- a/drivers/ata/libata-scsi.c
> +++ b/drivers/ata/libata-scsi.c
> @@ -26,6 +26,7 @@
> #include <scsi/scsi_device.h>
> #include <scsi/scsi_tcq.h>
> #include <scsi/scsi_transport.h>
> +#include <scsi/scsi_devinfo.h>
> #include <linux/libata.h>
> #include <linux/hdreg.h>
> #include <linux/uaccess.h>
> @@ -4745,12 +4746,30 @@ void ata_scsi_scan_host(struct ata_port *ap, int sync)
> sdev = __scsi_add_device(ap->scsi_host, channel, id, 0,
> NULL);
> if (!IS_ERR(sdev)) {
> - dev->sdev[0] = sdev;
Maybe reverse this condition and do a continue here. That will avoid the
additional indent level, which will make the hunk below a little more pretty.
if (IS_ERR(sdev)) {
dev->sdev[0] = NULL;
continue;
}
/*
* For multi-LUN ATAPI (BLIST_FORCELUN), bump...
...
> - ata_scsi_assign_ofnode(dev, ap);
> + /*
> + * For multi-LUN ATAPI (BLIST_FORCELUN), bump
> + * dev->nr_luns to the host max so the LUN
> + * routing in atapi_xlat() accepts the probe
> + * INQUIRYs to LUN > 0, then trigger the
> + * sequential scan. pdt_1f_for_no_lun, set
> + * during LUN 0 configure, ensures
> + * non-responding LUNs are silently skipped;
> + * dev->sdev[] is populated by
> + * ata_scsi_dev_config() during the scan.
> + */
> + if (dev->class == ATA_DEV_ATAPI &&
> + sdev->sdev_bflags & BLIST_FORCELUN) {
> + dev->nr_luns = ap->scsi_host->max_lun;
> + scsi_scan_target(
> + &ap->scsi_host->shost_gendev,
> + channel, id, SCAN_WILD_CARD,
> + SCSI_SCAN_RESCAN);
> + }
> scsi_device_put(sdev);
> - } else {
> - dev->sdev[0] = NULL;
> }
> +
> + if (dev->sdev[0])
> + ata_scsi_assign_ofnode(dev, ap);
> }
> }
>
--
Damien Le Moal
Western Digital Research