Message ID | 1654770559-101375-8-git-send-email-john.garry@huawei.com (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | blk-mq/libata/scsi: SCSI driver tagging improvements | expand |
On 6/9/22 19:29, John Garry wrote: > Add callback to queue reserved commands - call it "internal" as this is > what libata uses. > > Also add it to the base ATA SHT, and set nr_reserved_cmds = 1, which > matches tag ATA_TAG_INTERNAL. > > Signed-off-by: John Garry <john.garry@huawei.com> > --- > drivers/ata/libata-scsi.c | 14 ++++++++++++++ > include/linux/libata.h | 6 +++++- > 2 files changed, 19 insertions(+), 1 deletion(-) > > diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c > index baac35dd17ca..b2702ab0183b 100644 > --- a/drivers/ata/libata-scsi.c > +++ b/drivers/ata/libata-scsi.c > @@ -1114,6 +1114,20 @@ int ata_scsi_dev_config(struct scsi_device *sdev, struct ata_device *dev) > return 0; > } > > +int ata_internal_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmd) ata_scsi_internal_queuecommand() But given that this is used for the .reserved_queuecommand() method, I would call it ata_scsi_reserved_queuecommand(). > +{ > + struct ata_port *ap; > + int res; > + > + ap = ata_shost_to_port(shost); You can move this to ap declaration. struct ata_port *ap = ata_shost_to_port(shost); > + spin_lock_irq(ap->lock); spin_lock_irqsave() ? > + res = ata_sas_queuecmd(scmd, ap); > + spin_unlock_irq(ap->lock); > + > + return res; > +} > +EXPORT_SYMBOL_GPL(ata_internal_queuecommand); > + > /** > * ata_scsi_slave_config - Set SCSI device attributes > * @sdev: SCSI device to examine > diff --git a/include/linux/libata.h b/include/linux/libata.h > index 43f4bcfe9a5f..5fa6f56bba81 100644 > --- a/include/linux/libata.h > +++ b/include/linux/libata.h > @@ -1141,6 +1141,8 @@ extern int ata_std_bios_param(struct scsi_device *sdev, > sector_t capacity, int geom[]); > extern void ata_scsi_unlock_native_capacity(struct scsi_device *sdev); > extern int ata_scsi_slave_config(struct scsi_device *sdev); > +extern int ata_internal_queuecommand(struct Scsi_Host *shost, > + struct scsi_cmnd *scmd); > extern void ata_scsi_slave_destroy(struct scsi_device *sdev); > extern int ata_scsi_change_queue_depth(struct scsi_device *sdev, > int queue_depth); > @@ -1390,7 +1392,9 @@ extern const struct attribute_group *ata_common_sdev_groups[]; > .proc_name = drv_name, \ > .slave_destroy = ata_scsi_slave_destroy, \ > .bios_param = ata_std_bios_param, \ > - .unlock_native_capacity = ata_scsi_unlock_native_capacity > + .unlock_native_capacity = ata_scsi_unlock_native_capacity,\ > + .nr_reserved_cmds = 1,\ > + .reserved_queuecommand = ata_internal_queuecommand > > #define ATA_SUBBASE_SHT(drv_name) \ > __ATA_BASE_SHT(drv_name), \
On 13/06/2022 08:16, Damien Le Moal wrote: >> diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c >> index baac35dd17ca..b2702ab0183b 100644 >> --- a/drivers/ata/libata-scsi.c >> +++ b/drivers/ata/libata-scsi.c >> @@ -1114,6 +1114,20 @@ int ata_scsi_dev_config(struct scsi_device *sdev, struct ata_device *dev) >> return 0; >> } >> >> +int ata_internal_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmd) > ata_scsi_internal_queuecommand() ok > > But given that this is used for the .reserved_queuecommand() method, I > would call it ata_scsi_reserved_queuecommand(). I did mention somewhere that I continued to use the term "internal" as that is what libata already uses, but I can change it. > >> +{ >> + struct ata_port *ap; >> + int res; >> + >> + ap = ata_shost_to_port(shost); > You can move this to ap declaration. > > struct ata_port *ap = ata_shost_to_port(shost); ok > >> + spin_lock_irq(ap->lock); > spin_lock_irqsave() ? Right > >> + res = ata_sas_queuecmd(scmd, ap); >> + spin_unlock_irq(ap->lock); >> + >> + return res; Thanks, John
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index baac35dd17ca..b2702ab0183b 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -1114,6 +1114,20 @@ int ata_scsi_dev_config(struct scsi_device *sdev, struct ata_device *dev) return 0; } +int ata_internal_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmd) +{ + struct ata_port *ap; + int res; + + ap = ata_shost_to_port(shost); + spin_lock_irq(ap->lock); + res = ata_sas_queuecmd(scmd, ap); + spin_unlock_irq(ap->lock); + + return res; +} +EXPORT_SYMBOL_GPL(ata_internal_queuecommand); + /** * ata_scsi_slave_config - Set SCSI device attributes * @sdev: SCSI device to examine diff --git a/include/linux/libata.h b/include/linux/libata.h index 43f4bcfe9a5f..5fa6f56bba81 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -1141,6 +1141,8 @@ extern int ata_std_bios_param(struct scsi_device *sdev, sector_t capacity, int geom[]); extern void ata_scsi_unlock_native_capacity(struct scsi_device *sdev); extern int ata_scsi_slave_config(struct scsi_device *sdev); +extern int ata_internal_queuecommand(struct Scsi_Host *shost, + struct scsi_cmnd *scmd); extern void ata_scsi_slave_destroy(struct scsi_device *sdev); extern int ata_scsi_change_queue_depth(struct scsi_device *sdev, int queue_depth); @@ -1390,7 +1392,9 @@ extern const struct attribute_group *ata_common_sdev_groups[]; .proc_name = drv_name, \ .slave_destroy = ata_scsi_slave_destroy, \ .bios_param = ata_std_bios_param, \ - .unlock_native_capacity = ata_scsi_unlock_native_capacity + .unlock_native_capacity = ata_scsi_unlock_native_capacity,\ + .nr_reserved_cmds = 1,\ + .reserved_queuecommand = ata_internal_queuecommand #define ATA_SUBBASE_SHT(drv_name) \ __ATA_BASE_SHT(drv_name), \
Add callback to queue reserved commands - call it "internal" as this is what libata uses. Also add it to the base ATA SHT, and set nr_reserved_cmds = 1, which matches tag ATA_TAG_INTERNAL. Signed-off-by: John Garry <john.garry@huawei.com> --- drivers/ata/libata-scsi.c | 14 ++++++++++++++ include/linux/libata.h | 6 +++++- 2 files changed, 19 insertions(+), 1 deletion(-)