mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 06:31:52 +00:00
scsi: smartpqi: Fix duplicate device nodes for tape changers
Stop the OS from re-discovering multiple LUNs for tape drive and medium changer. Duplicate device nodes for Ultrium tape drive and medium changer are being created. The Ultrium tape drive is a multi-LUN SCSI target. It presents a LUN for the tape drive and a 2nd LUN for the medium changer. Our controller FW lists both LUNs in the RPL results. As a result, the smartpqi driver exposes both devices to the OS. Then the OS does its normal device discovery via the SCSI REPORT LUNS command, which causes it to re-discover both devices a 2nd time, which results in the duplicate device nodes. Link: https://lore.kernel.org/r/20210928235442.201875-10-don.brace@microchip.com Reviewed-by: Scott Benesh <scott.benesh@microchip.com> Reviewed-by: Scott Teel <scott.teel@microchip.com> Reviewed-by: Mike McGowen <mike.mcgowen@microchip.com> Acked-by: John Donnelly <john.p.donnelly@oracle.com> Signed-off-by: Kevin Barnett <kevin.barnett@microchip.com> Signed-off-by: Don Brace <don.brace@microchip.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
987d35605b
commit
d4dc6aea93
@ -1106,6 +1106,7 @@ struct pqi_scsi_dev {
|
||||
u8 keep_device : 1;
|
||||
u8 volume_offline : 1;
|
||||
u8 rescan : 1;
|
||||
u8 ignore_device : 1;
|
||||
bool aio_enabled; /* only valid for physical disks */
|
||||
bool in_remove;
|
||||
bool device_offline;
|
||||
|
@ -6297,9 +6297,13 @@ static int pqi_slave_alloc(struct scsi_device *sdev)
|
||||
rphy = target_to_rphy(starget);
|
||||
device = pqi_find_device_by_sas_rphy(ctrl_info, rphy);
|
||||
if (device) {
|
||||
device->target = sdev_id(sdev);
|
||||
device->lun = sdev->lun;
|
||||
device->target_lun_valid = true;
|
||||
if (device->target_lun_valid) {
|
||||
device->ignore_device = true;
|
||||
} else {
|
||||
device->target = sdev_id(sdev);
|
||||
device->lun = sdev->lun;
|
||||
device->target_lun_valid = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
device = pqi_find_scsi_dev(ctrl_info, sdev_channel(sdev),
|
||||
@ -6336,14 +6340,25 @@ static int pqi_map_queues(struct Scsi_Host *shost)
|
||||
ctrl_info->pci_dev, 0);
|
||||
}
|
||||
|
||||
static inline bool pqi_is_tape_changer_device(struct pqi_scsi_dev *device)
|
||||
{
|
||||
return device->devtype == TYPE_TAPE || device->devtype == TYPE_MEDIUM_CHANGER;
|
||||
}
|
||||
|
||||
static int pqi_slave_configure(struct scsi_device *sdev)
|
||||
{
|
||||
int rc = 0;
|
||||
struct pqi_scsi_dev *device;
|
||||
|
||||
device = sdev->hostdata;
|
||||
device->devtype = sdev->type;
|
||||
|
||||
return 0;
|
||||
if (pqi_is_tape_changer_device(device) && device->ignore_device) {
|
||||
rc = -ENXIO;
|
||||
device->ignore_device = false;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int pqi_getpciinfo_ioctl(struct pqi_ctrl_info *ctrl_info, void __user *arg)
|
||||
|
Loading…
Reference in New Issue
Block a user