From 0e5a09fed91b9bdbb586ed3b5310d590b16ddc22 Mon Sep 17 00:00:00 2001 From: Li Zhong Date: Mon, 15 Apr 2019 13:20:31 +0800 Subject: [PATCH] scsi: core: map PQ=1, PDT=other values to SCSI_SCAN_TARGET_PRESENT commit 35fd1c24adf0 ("[SCSI] Don't add scsi_device for devices that return PQ=1, PDT=0x1f") returns SCSI_SCAN_TARGET_PRESENT if inquiry returns PQ=1, and PDT = 0x1f. However, from the scsi spec, it seemed setting PQ=1, and PDT to the type it is capable to support, can also mean the device is not connected. E.g. we see an IBM/2145 returns PQ=1 and PDT=0 for a non-mapped lun (details attached at the end). This patch changes the check condition a bit, so the check don't require PTD to be 0x1f when PQ=1. $ echo 0 0 1 > /sys/class/scsi_host/host1/scan [ 2483.722186] scsi 1:0:0:1: scsi scan: INQUIRY pass 1 length 36 [ 2483.725687] scsi 1:0:0:1: scsi scan: INQUIRY successful with code 0x0 [ 2483.729171] scsi 1:0:0:1: scsi scan: INQUIRY pass 2 length 109 [ 2483.732481] scsi 1:0:0:1: scsi scan: INQUIRY successful with code 0x0 [ 2483.735911] scsi 1:0:0:1: Direct-Access IBM 2145 0000 PQ: 1 ANSI: 6 [ 2483.741282] scsi 1:0:0:1: Attached scsi generic sg2 type 0 $ tail /proc/scsi/scsi Attached devices: Host: scsi1 Channel: 00 Id: 00 Lun: 00 Vendor: IBM Model: 2145 Rev: 0000 Type: Direct-Access ANSI SCSI revision: 06 Host: scsi0 Channel: 00 Id: 00 Lun: 00 Vendor: IBM Model: 2145 Rev: 0000 Type: Direct-Access ANSI SCSI revision: 06 Host: scsi1 Channel: 00 Id: 00 Lun: 01 Vendor: IBM Model: 2145 Rev: 0000 Type: Direct-Access ANSI SCSI revision: 06 $ lsscsi [0:0:0:0] disk IBM 2145 0000 /dev/sdb [1:0:0:0] disk IBM 2145 0000 /dev/sda [1:0:0:1] disk IBM 2145 0000 - Signed-off-by: Li Zhong Reviewed-by: Bart Van Assche Signed-off-by: Martin K. Petersen --- drivers/scsi/scsi_scan.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 53380e07b40ee..058079f915f18 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c @@ -1129,7 +1129,8 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, * that no LUN is present, so don't add sdev in these cases. * Two specific examples are: * 1) NetApp targets: return PQ=1, PDT=0x1f - * 2) USB UFI: returns PDT=0x1f, with the PQ bits being "reserved" + * 2) IBM/2145 targets: return PQ=1, PDT=0 + * 3) USB UFI: returns PDT=0x1f, with the PQ bits being "reserved" * in the UFI 1.0 spec (we cannot rely on reserved bits). * * References: @@ -1143,8 +1144,8 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, * PDT=00h Direct-access device (floppy) * PDT=1Fh none (no FDD connected to the requested logical unit) */ - if (((result[0] >> 5) == 1 || starget->pdt_1f_for_no_lun) && - (result[0] & 0x1f) == 0x1f && + if (((result[0] >> 5) == 1 || + (starget->pdt_1f_for_no_lun && (result[0] & 0x1f) == 0x1f)) && !scsi_is_wlun(lun)) { SCSI_LOG_SCAN_BUS(3, sdev_printk(KERN_INFO, sdev, "scsi scan: peripheral device type" -- 2.39.5