Messages in this thread | | | Subject | Re: [smartpqi updates PATCH V2 09/11] smartpqi: fix duplicate device nodes for tape changers | From | john.p.donnelly@oracle ... | Date | Thu, 30 Sep 2021 13:24:31 -0500 |
| |
On 9/28/21 6:54 PM, Don Brace wrote: > From: Kevin Barnett <kevin.barnett@microchip.com> > > 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. > > Reviewed-by: Scott Benesh <scott.benesh@microchip.com> > Reviewed-by: Scott Teel <scott.teel@microchip.com> > Reviewed-by: Mike McGowen <mike.mcgowen@microchip.com> > Signed-off-by: Kevin Barnett <kevin.barnett@microchip.com> > Signed-off-by: Don Brace <don.brace@microchip.com>
Acked-by: John Donnelly <john.p.donnelly@oracle.com>
> --- > drivers/scsi/smartpqi/smartpqi.h | 1 + > drivers/scsi/smartpqi/smartpqi_init.c | 23 +++++++++++++++++++---- > 2 files changed, 20 insertions(+), 4 deletions(-) > > diff --git a/drivers/scsi/smartpqi/smartpqi.h b/drivers/scsi/smartpqi/smartpqi.h > index c439583a4ca5..aac88ac0a0b7 100644 > --- a/drivers/scsi/smartpqi/smartpqi.h > +++ b/drivers/scsi/smartpqi/smartpqi.h > @@ -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; > diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c > index c28eb7ea4a24..8be116992cb0 100644 > --- a/drivers/scsi/smartpqi/smartpqi_init.c > +++ b/drivers/scsi/smartpqi/smartpqi_init.c > @@ -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) >
| |