Message ID | 20220502215953.5463-4-hare@suse.de (mailing list archive) |
---|---|
State | Deferred |
Headers | show |
Series | None | expand |
On 5/2/22 14:59, Hannes Reinecke wrote: > The bus reset should not depend on any command, but rather only > use the SCSI Host and the channel/bus number as argument. > > Signed-off-by: Hannes Reinecke <hare@suse.com> > --- > Documentation/scsi/scsi_eh.rst | 2 +- > Documentation/scsi/scsi_mid_low_api.rst | 5 ++- > drivers/message/fusion/mptfc.c | 13 +++---- > drivers/message/fusion/mptscsih.c | 21 ++++------- > drivers/message/fusion/mptscsih.h | 2 +- > drivers/scsi/a100u2w.c | 4 +- > drivers/scsi/aacraid/linit.c | 11 +++--- > drivers/scsi/aha152x.c | 4 +- > drivers/scsi/aha1542.c | 4 +- > drivers/scsi/aic7xxx/aic79xx_osm.c | 10 ++--- > drivers/scsi/aic7xxx/aic7xxx_osm.c | 6 +-- > drivers/scsi/arcmsr/arcmsr_hba.c | 6 +-- > drivers/scsi/arm/fas216.c | 9 +++-- > drivers/scsi/arm/fas216.h | 5 ++- > drivers/scsi/dc395x.c | 25 ++++++------- > drivers/scsi/dpt_i2o.c | 9 +++-- > drivers/scsi/dpti.h | 2 +- > drivers/scsi/esas2r/esas2r.h | 2 +- > drivers/scsi/esas2r/esas2r_main.c | 4 +- > drivers/scsi/esp_scsi.c | 4 +- > drivers/scsi/initio.c | 11 +++--- > drivers/scsi/mpi3mr/mpi3mr_os.c | 37 +++++++++++-------- > drivers/scsi/ncr53c8xx.c | 4 +- > drivers/scsi/pcmcia/nsp_cs.c | 6 +-- > drivers/scsi/pcmcia/nsp_cs.h | 2 +- > drivers/scsi/pmcraid.c | 7 ++-- > drivers/scsi/qla1280.c | 12 +++--- > drivers/scsi/qla2xxx/qla_os.c | 17 +++------ > drivers/scsi/scsi_debug.c | 31 ++++++---------- > drivers/scsi/scsi_error.c | 2 +- > drivers/scsi/sym53c8xx_2/sym_glue.c | 7 ++-- > drivers/scsi/vmw_pvscsi.c | 5 +-- > drivers/scsi/wd719x.c | 11 +++--- > .../staging/unisys/visorhba/visorhba_main.c | 7 ++-- > drivers/usb/storage/scsiglue.c | 4 +- > include/scsi/scsi_host.h | 2 +- > 36 files changed, 150 insertions(+), 163 deletions(-) > > diff --git a/Documentation/scsi/scsi_eh.rst b/Documentation/scsi/scsi_eh.rst > index 12113cca5ad9..5e2d04e64005 100644 > --- a/Documentation/scsi/scsi_eh.rst > +++ b/Documentation/scsi/scsi_eh.rst > @@ -214,7 +214,7 @@ considered to fail always. > > int (* eh_abort_handler)(struct scsi_cmnd *); > int (* eh_device_reset_handler)(struct scsi_cmnd *); > - int (* eh_bus_reset_handler)(struct scsi_cmnd *); > + int (* eh_bus_reset_handler)(struct Scsi_Host *, int); > int (* eh_host_reset_handler)(struct Scsi_Host *); > > Higher-severity actions are taken only when lower-severity actions > diff --git a/Documentation/scsi/scsi_mid_low_api.rst b/Documentation/scsi/scsi_mid_low_api.rst > index 784587ea7eee..1b1c37445580 100644 > --- a/Documentation/scsi/scsi_mid_low_api.rst > +++ b/Documentation/scsi/scsi_mid_low_api.rst > @@ -741,7 +741,8 @@ Details:: > > /** > * eh_bus_reset_handler - issue SCSI bus reset > - * @scp: SCSI bus that contains this device should be reset > + * @host: SCSI Host that contains the channel which should be reset > + * @channel: channel to be reset > * > * Returns SUCCESS if command aborted else FAILED > * > @@ -754,7 +755,7 @@ Details:: > * > * Optionally defined in: LLD > **/ > - int eh_bus_reset_handler(struct scsi_cmnd * scp) > + int eh_bus_reset_handler(struct Scsi_Host * host, int channel) > > > /** > diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c > index 4a621380a4eb..bc62f0cc0cbd 100644 > --- a/drivers/message/fusion/mptfc.c > +++ b/drivers/message/fusion/mptfc.c > @@ -103,7 +103,7 @@ static void mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout); > static void mptfc_remove(struct pci_dev *pdev); > static int mptfc_abort(struct scsi_cmnd *SCpnt); > static int mptfc_dev_reset(struct scsi_cmnd *SCpnt); > -static int mptfc_bus_reset(struct scsi_cmnd *SCpnt); > +static int mptfc_bus_reset(struct Scsi_Host *shost, int channel); > > static struct scsi_host_template mptfc_driver_template = { > .module = THIS_MODULE, > @@ -259,11 +259,9 @@ mptfc_dev_reset(struct scsi_cmnd *SCpnt) > } > > static int > -mptfc_bus_reset(struct scsi_cmnd *SCpnt) > +mptfc_bus_reset(struct Scsi_Host *shost, int channel) > { > - struct Scsi_Host *shost = SCpnt->device->host; > MPT_SCSI_HOST __maybe_unused *hd = shost_priv(shost); > - int channel = SCpnt->device->channel; > struct mptfc_rport_info *ri; > int rtn; > > @@ -280,10 +278,9 @@ mptfc_bus_reset(struct scsi_cmnd *SCpnt) > } > if (rtn == 0) { > dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT > - "%s.%d: %d:%llu, executing recovery.\n", __func__, > - hd->ioc->name, shost->host_no, > - SCpnt->device->id, SCpnt->device->lun)); > - rtn = mptscsih_bus_reset(SCpnt); > + "%s.%d: 0:0, executing recovery.\n", __func__, > + hd->ioc->name, shost->host_no)); > + rtn = mptscsih_bus_reset(shost, channel); > } > return rtn; > } > diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c > index 3df07e024026..afdbc8138346 100644 > --- a/drivers/message/fusion/mptscsih.c > +++ b/drivers/message/fusion/mptscsih.c > @@ -1914,39 +1914,34 @@ mptscsih_target_reset(struct scsi_cmnd * SCpnt) > * Returns SUCCESS or FAILED. > **/ > int > -mptscsih_bus_reset(struct scsi_cmnd * SCpnt) > +mptscsih_bus_reset(struct Scsi_Host * shost, int channel) > { > MPT_SCSI_HOST *hd; > int retval; > - VirtDevice *vdevice; > MPT_ADAPTER *ioc; > > /* If we can't locate our host adapter structure, return FAILED status. > */ > - if ((hd = shost_priv(SCpnt->device->host)) == NULL){ > + if ((hd = shost_priv(shost)) == NULL){ > printk(KERN_ERR MYNAM ": bus reset: " > - "Can't locate host! (sc=%p)\n", SCpnt); > + "Can't locate host!\n"); > return FAILED; > } > > ioc = hd->ioc; > - printk(MYIOC_s_INFO_FMT "attempting bus reset! (sc=%p)\n", > - ioc->name, SCpnt); > - scsi_print_command(SCpnt); > + printk(MYIOC_s_INFO_FMT "attempting bus reset!\n", > + ioc->name); > > if (ioc->timeouts < -1) > ioc->timeouts++; > > - vdevice = SCpnt->device->hostdata; > - if (!vdevice || !vdevice->vtarget) > - return SUCCESS; > retval = mptscsih_IssueTaskMgmt(hd, > MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS, > - vdevice->vtarget->channel, 0, 0, 0, > + channel, 0, 0, 0, > mptscsih_get_tm_timeout(ioc)); > > - printk(MYIOC_s_INFO_FMT "bus reset: %s (sc=%p)\n", > - ioc->name, ((retval == 0) ? "SUCCESS" : "FAILED" ), SCpnt); > + printk(MYIOC_s_INFO_FMT "bus reset: %s\n", > + ioc->name, ((retval == 0) ? "SUCCESS" : "FAILED" )); > > if (retval == 0) > return SUCCESS; > diff --git a/drivers/message/fusion/mptscsih.h b/drivers/message/fusion/mptscsih.h > index 0faefe9c7541..9f3756bd25eb 100644 > --- a/drivers/message/fusion/mptscsih.h > +++ b/drivers/message/fusion/mptscsih.h > @@ -121,7 +121,7 @@ extern int mptscsih_slave_configure(struct scsi_device *device); > extern int mptscsih_abort(struct scsi_cmnd * SCpnt); > extern int mptscsih_dev_reset(struct scsi_cmnd * SCpnt); > extern int mptscsih_target_reset(struct scsi_cmnd * SCpnt); > -extern int mptscsih_bus_reset(struct scsi_cmnd * SCpnt); > +extern int mptscsih_bus_reset(struct Scsi_Host *, int); > extern int mptscsih_host_reset(struct Scsi_Host *sh); > extern int mptscsih_bios_param(struct scsi_device * sdev, struct block_device *bdev, sector_t capacity, int geom[]); > extern int mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r); > diff --git a/drivers/scsi/a100u2w.c b/drivers/scsi/a100u2w.c > index bf552c818958..dab79824e2f6 100644 > --- a/drivers/scsi/a100u2w.c > +++ b/drivers/scsi/a100u2w.c > @@ -934,10 +934,10 @@ static int inia100_abort(struct scsi_cmnd * cmd) > Output : None. > Return : pSRB - Pointer to SCSI request block. > *****************************************************************************/ > -static int inia100_bus_reset(struct scsi_cmnd * cmd) > +static int inia100_bus_reset(struct Scsi_Host * shost, int channel) > { /* I need Host Control Block Information */ > struct orc_host *host; > - host = (struct orc_host *) cmd->device->host->hostdata; > + host = (struct orc_host *) shost->hostdata; > return orc_reset_scsi_bus(host); > } > > diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c > index 19a012c9a3c9..de7e0985ac2b 100644 > --- a/drivers/scsi/aacraid/linit.c > +++ b/drivers/scsi/aacraid/linit.c > @@ -1025,20 +1025,18 @@ static int aac_eh_target_reset(struct scsi_cmnd *cmd) > > /* > * aac_eh_bus_reset - Bus reset command handling > - * @scsi_cmd: SCSI command block causing the reset > + * @host: SCSI host causing the reset > + * @channel: Number of the bus to be reset > * > */ > -static int aac_eh_bus_reset(struct scsi_cmnd* cmd) > +static int aac_eh_bus_reset(struct Scsi_Host *host, int channel) > { > - struct scsi_device * dev = cmd->device; > - struct Scsi_Host * host = dev->host; > struct aac_dev * aac = (struct aac_dev *)host->hostdata; > int count; > u32 cmd_bus; > int status = 0; > > - > - cmd_bus = aac_logical_to_phys(scmd_channel(cmd)); > + cmd_bus = aac_logical_to_phys(channel); > /* Mark the assoc. FIB to not complete, eh handler does this */ > for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) { > struct fib *fib = &aac->fibs[count]; > @@ -1046,6 +1044,7 @@ static int aac_eh_bus_reset(struct scsi_cmnd* cmd) > if (fib->hw_fib_va->header.XferState && > (fib->flags & FIB_CONTEXT_FLAG) && > (fib->flags & FIB_CONTEXT_FLAG_SCSI_CMD)) { > + struct scsi_cmnd *cmd; > struct aac_hba_map_info *info; > u32 bus, cid; > > diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c > index 7e58f25c599b..1312dc5ef6d2 100644 > --- a/drivers/scsi/aha152x.c > +++ b/drivers/scsi/aha152x.c > @@ -1192,9 +1192,9 @@ static int aha152x_bus_reset_host(struct Scsi_Host *shpnt) > * Reset the bus > * > */ > -static int aha152x_bus_reset(struct scsi_cmnd *SCpnt) > +static int aha152x_bus_reset(struct Scsi_Host *shpnt, int channel) > { > - return aha152x_bus_reset_host(SCpnt->device->host); > + return aha152x_bus_reset_host(shpnt); > } > > /* > diff --git a/drivers/scsi/aha1542.c b/drivers/scsi/aha1542.c > index 69063fe4aab8..797a49f927dd 100644 > --- a/drivers/scsi/aha1542.c > +++ b/drivers/scsi/aha1542.c > @@ -980,9 +980,9 @@ static int aha1542_reset(struct Scsi_Host *sh, u8 reset_cmd) > return SUCCESS; > } > > -static int aha1542_bus_reset(struct scsi_cmnd *cmd) > +static int aha1542_bus_reset(struct Scsi_Host *sh, int channel) > { > - return aha1542_reset(cmd->device->host, SCRST); > + return aha1542_reset(sh, SCRST); > } > > static int aha1542_host_reset(struct Scsi_Host *sh) > diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c > index c46e8152af28..00786c37f39f 100644 > --- a/drivers/scsi/aic7xxx/aic79xx_osm.c > +++ b/drivers/scsi/aic7xxx/aic79xx_osm.c > @@ -866,21 +866,21 @@ ahd_linux_dev_reset(struct scsi_cmnd *cmd) > * Reset the SCSI bus. > */ > static int > -ahd_linux_bus_reset(struct scsi_cmnd *cmd) > +ahd_linux_bus_reset(struct Scsi_Host *shost, int channel) > { > struct ahd_softc *ahd; > int found; > unsigned long flags; > > - ahd = *(struct ahd_softc **)cmd->device->host->hostdata; > + ahd = *(struct ahd_softc **)shost->hostdata; > #ifdef AHD_DEBUG > if ((ahd_debug & AHD_SHOW_RECOVERY) != 0) > - printk("%s: Bus reset called for cmd %p\n", > - ahd_name(ahd), cmd); > + printk("%s: Bus reset called for channel %d\n", > + ahd_name(ahd), channel); > #endif > ahd_lock(ahd, &flags); > > - found = ahd_reset_channel(ahd, scmd_channel(cmd) + 'A', > + found = ahd_reset_channel(ahd, channel + 'A', > /*initiate reset*/TRUE); > ahd_unlock(ahd, &flags); > > diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c > index 0ad429b7ebcf..f6c547cef26c 100644 > --- a/drivers/scsi/aic7xxx/aic7xxx_osm.c > +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c > @@ -753,16 +753,16 @@ ahc_linux_dev_reset(struct scsi_cmnd *cmd) > * Reset the SCSI bus. > */ > static int > -ahc_linux_bus_reset(struct scsi_cmnd *cmd) > +ahc_linux_bus_reset(struct Scsi_Host *shost, int channel) > { > struct ahc_softc *ahc; > int found; > unsigned long flags; > > - ahc = *(struct ahc_softc **)cmd->device->host->hostdata; > + ahc = *(struct ahc_softc **)shost->hostdata; > > ahc_lock(ahc, &flags); > - found = ahc_reset_channel(ahc, scmd_channel(cmd) + 'A', > + found = ahc_reset_channel(ahc, channel + 'A', > /*initiate reset*/TRUE); > ahc_unlock(ahc, &flags); > > diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c > index d3fb8a9c1c39..baa03ead75d9 100644 > --- a/drivers/scsi/arcmsr/arcmsr_hba.c > +++ b/drivers/scsi/arcmsr/arcmsr_hba.c > @@ -111,7 +111,7 @@ static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, > struct scsi_cmnd *cmd); > static int arcmsr_iop_confirm(struct AdapterControlBlock *acb); > static int arcmsr_abort(struct scsi_cmnd *); > -static int arcmsr_bus_reset(struct scsi_cmnd *); > +static int arcmsr_bus_reset(struct Scsi_Host *, int); > static int arcmsr_bios_param(struct scsi_device *sdev, > struct block_device *bdev, sector_t capacity, int *info); > static int arcmsr_queue_command(struct Scsi_Host *h, struct scsi_cmnd *cmd); > @@ -4573,12 +4573,12 @@ static uint8_t arcmsr_iop_reset(struct AdapterControlBlock *acb) > return rtnval; > } > > -static int arcmsr_bus_reset(struct scsi_cmnd *cmd) > +static int arcmsr_bus_reset(struct Scsi_Host *shost, int channel) > { > struct AdapterControlBlock *acb; > int retry_count = 0; > int rtn = FAILED; > - acb = (struct AdapterControlBlock *) cmd->device->host->hostdata; > + acb = (struct AdapterControlBlock *) shost->hostdata; > if (acb->acb_flags & ACB_F_ADAPTER_REMOVED) > return SUCCESS; > pr_notice("arcmsr: executing bus reset eh.....num_resets = %d," > diff --git a/drivers/scsi/arm/fas216.c b/drivers/scsi/arm/fas216.c > index 38eec967155d..c27b49c42c4f 100644 > --- a/drivers/scsi/arm/fas216.c > +++ b/drivers/scsi/arm/fas216.c > @@ -2550,15 +2550,16 @@ int fas216_eh_device_reset(struct scsi_cmnd *SCpnt) > > /** > * fas216_eh_bus_reset - Reset the bus associated with the command > - * @SCpnt: command specifing bus to reset > + * @shost: host to be reset > + * @channel: bus number to reset > * > - * Reset the bus associated with the command. > + * Reset the bus. > * Returns: FAILED if unable to reset. > * Notes: Further commands are blocked. > */ > -int fas216_eh_bus_reset(struct scsi_cmnd *SCpnt) > +int fas216_eh_bus_reset(struct Scsi_Host *shost, int channel) > { > - FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata; > + FAS216_Info *info = (FAS216_Info *)shost->hostdata; > unsigned long flags; > struct scsi_device *SDpnt; > > diff --git a/drivers/scsi/arm/fas216.h b/drivers/scsi/arm/fas216.h > index f17583f143b3..27a4b564f054 100644 > --- a/drivers/scsi/arm/fas216.h > +++ b/drivers/scsi/arm/fas216.h > @@ -389,10 +389,11 @@ extern int fas216_eh_device_reset(struct scsi_cmnd *SCpnt); > > /* Function: int fas216_eh_bus_reset(struct scsi_cmnd *SCpnt) > * Purpose : Reset the complete bus associated with this command > - * Params : SCpnt - command specifing bus to reset > + * Params : shost - host to be reset > + * channel - bus to be reset > * Returns : FAILED if unable to reset > */ > -extern int fas216_eh_bus_reset(struct scsi_cmnd *SCpnt); > +extern int fas216_eh_bus_reset(struct Scsi_Host *shost, int channel); > > /* Function: int fas216_eh_host_reset(struct Scsi_Host *shost) > * Purpose : Reset the host associated with this command > diff --git a/drivers/scsi/dc395x.c b/drivers/scsi/dc395x.c > index 67a89715c863..7374eda8cffa 100644 > --- a/drivers/scsi/dc395x.c > +++ b/drivers/scsi/dc395x.c > @@ -1144,19 +1144,18 @@ static void reset_dev_param(struct AdapterCtlBlk *acb) > * @cmd - some command for this host (for fetching hooks) > * Returns: SUCCESS (0x2002) on success, else FAILED (0x2003). > */ > -static int __dc395x_eh_bus_reset(struct scsi_cmnd *cmd) > +static int __dc395x_eh_bus_reset(struct Scsi_Host *shost, int channel) > { > struct AdapterCtlBlk *acb = > - (struct AdapterCtlBlk *)cmd->device->host->hostdata; > + (struct AdapterCtlBlk *)shost->hostdata; > dprintkl(KERN_INFO, > - "eh_bus_reset: (0%p) target=<%02i-%i> cmd=%p\n", > - cmd, cmd->device->id, (u8)cmd->device->lun, cmd); > + "eh_bus_reset: bus=<%02i>\n", channel); > > if (timer_pending(&acb->waiting_timer)) > del_timer(&acb->waiting_timer); > > /* > - * disable interrupt > + * disable interrupt > */ > DC395x_write8(acb, TRM_S1040_DMA_INTEN, 0x00); > DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0x00); > @@ -1172,7 +1171,7 @@ static int __dc395x_eh_bus_reset(struct scsi_cmnd *cmd) > HZ * acb->eeprom.delay_time; > > /* > - * re-enable interrupt > + * re-enable interrupt > */ > /* Clear SCSI FIFO */ > DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO); > @@ -1182,7 +1181,7 @@ static int __dc395x_eh_bus_reset(struct scsi_cmnd *cmd) > set_basic_config(acb); > > reset_dev_param(acb); > - doing_srb_done(acb, DID_RESET, cmd, 0); > + doing_srb_done(acb, DID_RESET, NULL, 0); > acb->active_dcb = NULL; > acb->acb_flag = 0; /* RESET_DETECT, RESET_DONE ,RESET_DEV */ > waiting_process_next(acb); > @@ -1190,13 +1189,13 @@ static int __dc395x_eh_bus_reset(struct scsi_cmnd *cmd) > return SUCCESS; > } > > -static int dc395x_eh_bus_reset(struct scsi_cmnd *cmd) > +static int dc395x_eh_bus_reset(struct Scsi_Host *shost, int channel) > { > int rc; > > - spin_lock_irq(cmd->device->host->host_lock); > - rc = __dc395x_eh_bus_reset(cmd); > - spin_unlock_irq(cmd->device->host->host_lock); > + spin_lock_irq(shost->host_lock); > + rc = __dc395x_eh_bus_reset(shost, channel); > + spin_unlock_irq(shost->host_lock); > > return rc; > } > @@ -3338,7 +3337,7 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, > > /* abort all cmds in our queues */ > static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag, > - struct scsi_cmnd *cmd, u8 force) > + struct scsi_cmnd *cmd, u8 force) > { > struct DeviceCtlBlk *dcb; > dprintkl(KERN_INFO, "doing_srb_done: pids "); > @@ -3386,7 +3385,7 @@ static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag, > set_status_byte(p, SAM_STAT_GOOD); > pci_unmap_srb_sense(acb, srb); > pci_unmap_srb(acb, srb); > - if (force) { > + if (force && cmd) { > /* For new EH, we normally don't need to give commands back, > * as they all complete or all time out */ > scsi_done(cmd); > diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c > index 6e3ad0e5b533..b1ab772aff0e 100644 > --- a/drivers/scsi/dpt_i2o.c > +++ b/drivers/scsi/dpt_i2o.c > @@ -718,17 +718,18 @@ static int adpt_device_reset(struct scsi_cmnd* cmd) > > #define I2O_HBA_BUS_RESET 0x87 > // This version of bus reset is called by the eh_error handler > -static int adpt_bus_reset(struct scsi_cmnd* cmd) > +static int adpt_bus_reset(struct Scsi_Host *shost, int channel) > { > adpt_hba* pHba; > u32 msg[4]; > u32 rcode; > > - pHba = (adpt_hba*)cmd->device->host->hostdata[0]; > + pHba = (adpt_hba*)shost->hostdata[0]; > memset(msg, 0, sizeof(msg)); > - printk(KERN_WARNING"%s: Bus reset: SCSI Bus %d: tid: %d\n",pHba->name, cmd->device->channel,pHba->channel[cmd->device->channel].tid ); > + printk(KERN_WARNING"%s: Bus reset: SCSI Bus %d: tid: %d\n", > + pHba->name, channel, pHba->channel[channel].tid ); > msg[0] = FOUR_WORD_MSG_SIZE|SGL_OFFSET_0; > - msg[1] = (I2O_HBA_BUS_RESET<<24|HOST_TID<<12|pHba->channel[cmd->device->channel].tid); > + msg[1] = (I2O_HBA_BUS_RESET<<24|HOST_TID<<12|pHba->channel[channel].tid); > msg[2] = 0; > msg[3] = 0; > if (pHba->host) > diff --git a/drivers/scsi/dpti.h b/drivers/scsi/dpti.h > index b77a3625fa6f..48878e69ab2c 100644 > --- a/drivers/scsi/dpti.h > +++ b/drivers/scsi/dpti.h > @@ -35,7 +35,7 @@ static const char *adpt_info(struct Scsi_Host *pSHost); > static int adpt_bios_param(struct scsi_device * sdev, struct block_device *dev, > sector_t, int geom[]); > > -static int adpt_bus_reset(struct scsi_cmnd* cmd); > +static int adpt_bus_reset(struct Scsi_Host* shost, int channel); > static int adpt_device_reset(struct scsi_cmnd* cmd); > > > diff --git a/drivers/scsi/esas2r/esas2r.h b/drivers/scsi/esas2r/esas2r.h > index a104d1a3a9da..5c1eeaffc090 100644 > --- a/drivers/scsi/esas2r/esas2r.h > +++ b/drivers/scsi/esas2r/esas2r.h > @@ -977,7 +977,7 @@ long esas2r_proc_ioctl(struct file *fp, unsigned int cmd, unsigned long arg); > int esas2r_eh_abort(struct scsi_cmnd *cmd); > int esas2r_device_reset(struct scsi_cmnd *cmd); > int esas2r_host_reset(struct Scsi_Host *shost); > -int esas2r_bus_reset(struct scsi_cmnd *cmd); > +int esas2r_bus_reset(struct Scsi_Host *shost, int channel); > int esas2r_target_reset(struct scsi_cmnd *cmd); > > /* Internal functions */ > diff --git a/drivers/scsi/esas2r/esas2r_main.c b/drivers/scsi/esas2r/esas2r_main.c > index 52494c8bb656..315b8a61d0d7 100644 > --- a/drivers/scsi/esas2r/esas2r_main.c > +++ b/drivers/scsi/esas2r/esas2r_main.c > @@ -1094,10 +1094,8 @@ int esas2r_host_reset(struct Scsi_Host *shost) > return esas2r_host_bus_reset(shost, true); > } > > -int esas2r_bus_reset(struct scsi_cmnd *cmd) > +int esas2r_bus_reset(struct Scsi_Host *shost, int channel) > { > - struct Scsi_Host *shost = cmd->device->host; > - > esas2r_log(ESAS2R_LOG_INFO, "bus_reset (%p)", shost); > > return esas2r_host_bus_reset(shost, false); > diff --git a/drivers/scsi/esp_scsi.c b/drivers/scsi/esp_scsi.c > index b41eac8b5e0f..2fa53100df24 100644 > --- a/drivers/scsi/esp_scsi.c > +++ b/drivers/scsi/esp_scsi.c > @@ -2604,9 +2604,9 @@ static int esp_eh_abort_handler(struct scsi_cmnd *cmd) > return FAILED; > } > > -static int esp_eh_bus_reset_handler(struct scsi_cmnd *cmd) > +static int esp_eh_bus_reset_handler(struct Scsi_Host *shost, int channel) > { > - struct esp *esp = shost_priv(cmd->device->host); > + struct esp *esp = shost_priv(shost); > struct completion eh_reset; > unsigned long flags; > > diff --git a/drivers/scsi/initio.c b/drivers/scsi/initio.c > index f585d6e5fab9..adddedfdbcc7 100644 > --- a/drivers/scsi/initio.c > +++ b/drivers/scsi/initio.c > @@ -2625,20 +2625,21 @@ static DEF_SCSI_QCMD(i91u_queuecommand) > > /** > * i91u_bus_reset - reset the SCSI bus > - * @cmnd: Command block we want to trigger the reset for > + * @shost: SCSI host to be reset > + * @channel: Bus number to be reset > * > * Initiate a SCSI bus reset sequence > */ > > -static int i91u_bus_reset(struct scsi_cmnd * cmnd) > +static int i91u_bus_reset(struct Scsi_Host * shost, int channel) > { > struct initio_host *host; > > - host = (struct initio_host *) cmnd->device->host->hostdata; > + host = (struct initio_host *) shost->hostdata; > > - spin_lock_irq(cmnd->device->host->host_lock); > + spin_lock_irq(shost->host_lock); > initio_reset_scsi(host, 0); > - spin_unlock_irq(cmnd->device->host->host_lock); > + spin_unlock_irq(shost->host_lock); > > return SUCCESS; > } > diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c > index bd42d3a56590..88fbd01c05d0 100644 > --- a/drivers/scsi/mpi3mr/mpi3mr_os.c > +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c > @@ -3362,39 +3362,46 @@ static int mpi3mr_eh_host_reset(struct Scsi_Host *shost) > > /** > * mpi3mr_eh_bus_reset - Bus reset error handling callback > - * @scmd: SCSI command reference > + * @shost: SCSI host reference > + * @channel: bus number > * > * Checks whether pending I/Os are present for the RAID volume; > * if not there's no need to reset the adapter. > * > * Return: SUCCESS of successful reset else FAILED > */ > -static int mpi3mr_eh_bus_reset(struct scsi_cmnd *scmd) > +static int mpi3mr_eh_bus_reset(struct Scsi_Host *shost, int channel) > { > - struct mpi3mr_ioc *mrioc = shost_priv(scmd->device->host); > + struct mpi3mr_ioc *mrioc = shost_priv(shost); > + struct mpi3mr_tgt_dev *tgtdev; > struct mpi3mr_stgt_priv_data *stgt_priv_data; > - struct mpi3mr_sdev_priv_data *sdev_priv_data; > - u8 dev_type = MPI3_DEVICE_DEVFORM_VD; > int retval = FAILED; > > - sdev_priv_data = scmd->device->hostdata; > - if (sdev_priv_data && sdev_priv_data->tgt_priv_data) { > - stgt_priv_data = sdev_priv_data->tgt_priv_data; > - dev_type = stgt_priv_data->dev_type; > + spin_lock(&mrioc->tgtdev_lock); > + list_for_each_entry(tgtdev, &mrioc->tgtdev_list, list) { > + if (!tgtdev->starget || !tgtdev->starget->hostdata) > + continue; > + stgt_priv_data = (struct mpi3mr_stgt_priv_data *) > + tgtdev->starget->hostdata; > + if (stgt_priv_data->dev_type == MPI3_DEVICE_DEVFORM_VD) { > + retval = SUCCESS; > + break; > + } > } > + spin_unlock(&mrioc->tgtdev_lock); > > - if (dev_type == MPI3_DEVICE_DEVFORM_VD) { > + if (retval == SUCCESS) { > mpi3mr_wait_for_host_io(mrioc, > MPI3MR_RAID_ERRREC_RESET_TIMEOUT); > - if (!mpi3mr_get_fw_pending_ios(mrioc)) > - retval = SUCCESS; > + if (mpi3mr_get_fw_pending_ios(mrioc)) > + retval = FAILED; > } > if (retval == FAILED) > mpi3mr_print_pending_host_io(mrioc); > > - sdev_printk(KERN_INFO, scmd->device, > - "Bus reset is %s for scmd(%p)\n", > - ((retval == SUCCESS) ? "SUCCESS" : "FAILED"), scmd); > + shost_printk(KERN_INFO, shost, > + "Bus reset is %s\n", > + ((retval == SUCCESS) ? "SUCCESS" : "FAILED")); > return retval; > } > > diff --git a/drivers/scsi/ncr53c8xx.c b/drivers/scsi/ncr53c8xx.c > index 4458449c960b..2d4470686a4b 100644 > --- a/drivers/scsi/ncr53c8xx.c > +++ b/drivers/scsi/ncr53c8xx.c > @@ -7936,9 +7936,9 @@ static void ncr53c8xx_timeout(struct timer_list *t) > ncr_flush_done_cmds(done_list); > } > > -static int ncr53c8xx_bus_reset(struct scsi_cmnd *cmd) > +static int ncr53c8xx_bus_reset(struct Scsi_Host *host, int channel) > { > - struct ncb *np = ((struct host_data *) cmd->device->host->hostdata)->ncb; > + struct ncb *np = ((struct host_data *) host->hostdata)->ncb; > int sts; > unsigned long flags; > struct scsi_cmnd *done_list; > diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c > index 4aa9737fa711..b1bce76c83b9 100644 > --- a/drivers/scsi/pcmcia/nsp_cs.c > +++ b/drivers/scsi/pcmcia/nsp_cs.c > @@ -1488,11 +1488,11 @@ static int nsp_bus_reset(nsp_hw_data *data) > return SUCCESS; > } > > -static int nsp_eh_bus_reset(struct scsi_cmnd *SCpnt) > +static int nsp_eh_bus_reset(struct Scsi_Host *host, int channel) > { > - nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; > + nsp_hw_data *data = (nsp_hw_data *)host->hostdata; > > - nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt); > + nsp_dbg(NSP_DEBUG_BUSRESET, "channel=0x%d", channel); > > return nsp_bus_reset(data); > } > diff --git a/drivers/scsi/pcmcia/nsp_cs.h b/drivers/scsi/pcmcia/nsp_cs.h > index f532adb5f166..8636f0053c02 100644 > --- a/drivers/scsi/pcmcia/nsp_cs.h > +++ b/drivers/scsi/pcmcia/nsp_cs.h > @@ -299,7 +299,7 @@ static int nsp_queuecommand(struct Scsi_Host *h, struct scsi_cmnd *SCpnt); > /* Error handler */ > /*static int nsp_eh_abort (struct scsi_cmnd *SCpnt);*/ > /*static int nsp_eh_device_reset(struct scsi_cmnd *SCpnt);*/ > -static int nsp_eh_bus_reset (struct scsi_cmnd *SCpnt); > +static int nsp_eh_bus_reset (struct Scsi_Host *host, int channel); > static int nsp_eh_host_reset (struct Scsi_Host *host); > static int nsp_bus_reset (nsp_hw_data *data); > > diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c > index 79ca737ac75b..14e90807d38c 100644 > --- a/drivers/scsi/pmcraid.c > +++ b/drivers/scsi/pmcraid.c > @@ -3023,9 +3023,8 @@ static int pmcraid_eh_device_reset_handler(struct scsi_cmnd *scmd) > RESET_DEVICE_LUN); > } > > -static int pmcraid_eh_bus_reset_handler(struct scsi_cmnd *scmd) > +static int pmcraid_eh_bus_reset_handler(struct Scsi_Host *host, int channel) > { > - struct Scsi_Host *host = scmd->device->host; > struct pmcraid_instance *pinstance = > (struct pmcraid_instance *)host->hostdata; > struct pmcraid_resource_entry *res = NULL; > @@ -3039,11 +3038,11 @@ static int pmcraid_eh_bus_reset_handler(struct scsi_cmnd *scmd) > */ > spin_lock_irqsave(&pinstance->resource_lock, lock_flags); > list_for_each_entry(temp, &pinstance->used_res_q, queue) { > - if (scmd->device->channel == PMCRAID_VSET_BUS_ID && > + if (channel == PMCRAID_VSET_BUS_ID && > RES_IS_VSET(temp->cfg_entry)) { > res = temp; > break; > - } else if (scmd->device->channel == PMCRAID_PHYS_BUS_ID && > + } else if (channel == PMCRAID_PHYS_BUS_ID && > RES_IS_GSCSI(temp->cfg_entry)) { > res = temp; > break; > diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c > index cd4c7126c1c9..f32f00c7a390 100644 > --- a/drivers/scsi/qla1280.c > +++ b/drivers/scsi/qla1280.c > @@ -979,13 +979,15 @@ qla1280_eh_device_reset(struct scsi_cmnd *cmd) > * Reset the specified bus. > **************************************************************************/ > static int > -qla1280_eh_bus_reset(struct scsi_cmnd *cmd) > +qla1280_eh_bus_reset(struct Scsi_Host *shost, int bus) > { > - int rc; > + int rc = FAILED; > + struct scsi_qla_host *ha = (struct scsi_qla_host *)shost->hostdata; > > - spin_lock_irq(cmd->device->host->host_lock); > - rc = qla1280_error_action(cmd, BUS_RESET); > - spin_unlock_irq(cmd->device->host->host_lock); > + spin_lock_irq(shost->host_lock); > + if (qla1280_bus_reset(ha, bus) == 0) > + rc = qla1280_wait_for_pending_commands(ha, 1, 0); > + spin_unlock_irq(shost->host_lock); > > return rc; > } > diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c > index 5f86e7bd5a0e..11e7dc22b94d 100644 > --- a/drivers/scsi/qla2xxx/qla_os.c > +++ b/drivers/scsi/qla2xxx/qla_os.c > @@ -1537,7 +1537,7 @@ qla2xxx_eh_target_reset(struct scsi_cmnd *cmd) > * commands. > * > * Input: > -* cmd = Linux SCSI command packet of the command that cause the > +* host = Linux SCSI command packet of the command that cause the > * bus reset. > * > * Returns: > @@ -1545,12 +1545,10 @@ qla2xxx_eh_target_reset(struct scsi_cmnd *cmd) > * > **************************************************************************/ > static int > -qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) > +qla2xxx_eh_bus_reset(struct Scsi_Host *shost, int channel) > { > - scsi_qla_host_t *vha = shost_priv(cmd->device->host); > + scsi_qla_host_t *vha = shost_priv(shost); > int ret = FAILED; > - unsigned int id; > - uint64_t lun; > struct qla_hw_data *ha = vha->hw; > > if (qla2x00_isp_reg_stat(ha)) { > @@ -1560,14 +1558,11 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) > return FAILED; > } > > - id = cmd->device->id; > - lun = cmd->device->lun; > - > if (qla2x00_chip_is_down(vha)) > return ret; > > ql_log(ql_log_info, vha, 0x8012, > - "BUS RESET ISSUED nexus=%ld:%d:%llu.\n", vha->host_no, id, lun); > + "BUS RESET ISSUED nexus=%ld:%d.\n", vha->host_no, channel); > > if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) { > ql_log(ql_log_fatal, vha, 0x8013, > @@ -1591,8 +1586,8 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) > > eh_bus_reset_done: > ql_log(ql_log_warn, vha, 0x802b, > - "BUS RESET %s nexus=%ld:%d:%llu.\n", > - (ret == FAILED) ? "FAILED" : "SUCCEEDED", vha->host_no, id, lun); > + "BUS RESET %s nexus=%ld:%d.\n", > + (ret == FAILED) ? "FAILED" : "SUCCEEDED", vha->host_no, channel); > > return ret; > } > diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c > index 6292ac7aef7a..f2d3271bc80b 100644 > --- a/drivers/scsi/scsi_debug.c > +++ b/drivers/scsi/scsi_debug.c > @@ -5324,36 +5324,27 @@ static int scsi_debug_target_reset(struct scsi_cmnd *SCpnt) > return SUCCESS; > } > > -static int scsi_debug_bus_reset(struct scsi_cmnd *SCpnt) > +static int scsi_debug_bus_reset(struct Scsi_Host * hp, int channel) > { > - struct sdebug_host_info *sdbg_host; > + struct sdebug_host_info *sdbg_host = > + *(struct sdebug_host_info **)shost_priv(hp); > struct sdebug_dev_info *devip; > - struct scsi_device *sdp; > - struct Scsi_Host *hp; > int k = 0; > > ++num_bus_resets; > - if (!(SCpnt && SCpnt->device)) > - goto lie; > - sdp = SCpnt->device; > if (SDEBUG_OPT_ALL_NOISE & sdebug_opts) > - sdev_printk(KERN_INFO, sdp, "%s\n", __func__); > - hp = sdp->host; > - if (hp) { > - sdbg_host = *(struct sdebug_host_info **)shost_priv(hp); > - if (sdbg_host) { > - list_for_each_entry(devip, > - &sdbg_host->dev_info_list, > - dev_list) { > - set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm); > - ++k; > - } > + shost_printk(KERN_INFO, hp, "%s\n", __func__); > + if (sdbg_host) { > + list_for_each_entry(devip, > + &sdbg_host->dev_info_list, > + dev_list) { > + set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm); > + ++k; > } > } > if (SDEBUG_OPT_RESET_NOISE & sdebug_opts) > - sdev_printk(KERN_INFO, sdp, > + shost_printk(KERN_INFO, hp, > "%s: %d device(s) found in host\n", __func__, k); > -lie: > return SUCCESS; > } > > diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c > index 747131ca8970..148cab3e61c0 100644 > --- a/drivers/scsi/scsi_error.c > +++ b/drivers/scsi/scsi_error.c > @@ -871,7 +871,7 @@ static enum scsi_disposition scsi_try_bus_reset(struct scsi_cmnd *scmd) > if (!hostt->eh_bus_reset_handler) > return FAILED; > > - rtn = hostt->eh_bus_reset_handler(scmd); > + rtn = hostt->eh_bus_reset_handler(host, scmd_channel(scmd)); > > if (rtn == SUCCESS) { > if (!hostt->skip_settle_delay) > diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c > index a573baa5bdf2..aef828731995 100644 > --- a/drivers/scsi/sym53c8xx_2/sym_glue.c > +++ b/drivers/scsi/sym53c8xx_2/sym_glue.c > @@ -670,14 +670,13 @@ static int sym53c8xx_eh_target_reset_handler(struct scsi_cmnd *cmd) > return SCSI_SUCCESS; > } > > -static int sym53c8xx_eh_bus_reset_handler(struct scsi_cmnd *cmd) > +static int sym53c8xx_eh_bus_reset_handler(struct Scsi_Host *shost, int channel) > { > - struct Scsi_Host *shost = cmd->device->host; > struct sym_data *sym_data = shost_priv(shost); > struct pci_dev *pdev = sym_data->pdev; > struct sym_hcb *np = sym_data->ncb; > > - scmd_printk(KERN_WARNING, cmd, "BUS RESET operation started\n"); > + shost_printk(KERN_WARNING, shost, "BUS RESET operation started\n"); > > /* > * Escalate to host reset if the PCI bus went down > @@ -689,7 +688,7 @@ static int sym53c8xx_eh_bus_reset_handler(struct scsi_cmnd *cmd) > sym_reset_scsi_bus(np, 1); > spin_unlock_irq(shost->host_lock); > > - dev_warn(&cmd->device->sdev_gendev, "BUS RESET operation complete.\n"); > + shost_printk(KERN_WARNING, shost, "BUS RESET operation complete.\n"); > return SCSI_SUCCESS; > } > > diff --git a/drivers/scsi/vmw_pvscsi.c b/drivers/scsi/vmw_pvscsi.c > index ddf1837babc0..9c62d446ea9e 100644 > --- a/drivers/scsi/vmw_pvscsi.c > +++ b/drivers/scsi/vmw_pvscsi.c > @@ -947,13 +947,12 @@ static int pvscsi_host_reset(struct Scsi_Host *host) > return SUCCESS; > } > > -static int pvscsi_bus_reset(struct scsi_cmnd *cmd) > +static int pvscsi_bus_reset(struct Scsi_Host *host, int channel) > { > - struct Scsi_Host *host = cmd->device->host; > struct pvscsi_adapter *adapter = shost_priv(host); > unsigned long flags; > > - scmd_printk(KERN_INFO, cmd, "SCSI Bus reset\n"); > + shost_printk(KERN_INFO, host, "SCSI Bus reset\n"); > > /* > * We don't want to queue new requests for this bus after > diff --git a/drivers/scsi/wd719x.c b/drivers/scsi/wd719x.c > index 02b8eb153944..fd297c7517cd 100644 > --- a/drivers/scsi/wd719x.c > +++ b/drivers/scsi/wd719x.c > @@ -484,11 +484,11 @@ static int wd719x_abort(struct scsi_cmnd *cmd) > return SUCCESS; > } > > -static int wd719x_reset(struct scsi_cmnd *cmd, u8 opcode, u8 device) > +static int wd719x_reset(struct Scsi_Host *shost, u8 opcode, u8 device) > { > int result; > unsigned long flags; > - struct wd719x *wd = shost_priv(cmd->device->host); > + struct wd719x *wd = shost_priv(shost); > struct wd719x_scb *scb, *tmp; > > dev_info(&wd->pdev->dev, "%s reset requested\n", > @@ -512,12 +512,13 @@ static int wd719x_reset(struct scsi_cmnd *cmd, u8 opcode, u8 device) > > static int wd719x_dev_reset(struct scsi_cmnd *cmd) > { > - return wd719x_reset(cmd, WD719X_CMD_RESET, cmd->device->id); > + return wd719x_reset(cmd->device->host, WD719X_CMD_RESET, > + cmd->device->id); > } > > -static int wd719x_bus_reset(struct scsi_cmnd *cmd) > +static int wd719x_bus_reset(struct Scsi_Host *host, int channel) > { > - return wd719x_reset(cmd, WD719X_CMD_BUSRESET, 0); > + return wd719x_reset(host, WD719X_CMD_BUSRESET, 0); > } > > static int wd719x_host_reset(struct Scsi_Host *host) > diff --git a/drivers/staging/unisys/visorhba/visorhba_main.c b/drivers/staging/unisys/visorhba/visorhba_main.c > index 0de0dd09cf9d..28c59218077d 100644 > --- a/drivers/staging/unisys/visorhba/visorhba_main.c > +++ b/drivers/staging/unisys/visorhba/visorhba_main.c > @@ -366,14 +366,15 @@ static int visorhba_device_reset_handler(struct scsi_cmnd *scsicmd) > * > * Return: SUCCESS if inserted, FAILED otherwise > */ > -static int visorhba_bus_reset_handler(struct scsi_cmnd *scsicmd) > +static int visorhba_bus_reset_handler(struct Scsi_Host *scsihost, int channel) > { > struct scsi_device *scsidev; > struct visordisk_info *vdisk; > int rtn; > > - scsidev = scsicmd->device; > - shost_for_each_device(scsidev, scsidev->host) { > + shost_for_each_device(scsidev, scsihost) { > + if (scsidev->channel != channel) > + continue; > vdisk = scsidev->hostdata; > if (atomic_read(&vdisk->error_count) < VISORHBA_ERROR_COUNT) > atomic_inc(&vdisk->error_count); > diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c > index 8931df5a85fd..17dabfba6b2b 100644 > --- a/drivers/usb/storage/scsiglue.c > +++ b/drivers/usb/storage/scsiglue.c > @@ -464,9 +464,9 @@ static int device_reset(struct scsi_cmnd *srb) > } > > /* Simulate a SCSI bus reset by resetting the device's USB port. */ > -static int bus_reset(struct scsi_cmnd *srb) > +static int bus_reset(struct Scsi_Host *shost, int channel) > { > - struct us_data *us = host_to_us(srb->device->host); > + struct us_data *us = host_to_us(shost); > int result; > > usb_stor_dbg(us, "%s called\n", __func__); > diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h > index 3b8d9e65ea57..73c9971e7334 100644 > --- a/include/scsi/scsi_host.h > +++ b/include/scsi/scsi_host.h > @@ -140,7 +140,7 @@ struct scsi_host_template { > int (* eh_abort_handler)(struct scsi_cmnd *); > int (* eh_device_reset_handler)(struct scsi_cmnd *); > int (* eh_target_reset_handler)(struct scsi_cmnd *); > - int (* eh_bus_reset_handler)(struct scsi_cmnd *); > + int (* eh_bus_reset_handler)(struct Scsi_Host *, int); > int (* eh_host_reset_handler)(struct Scsi_Host *); > > /* Reviewed-by: Lee Duncan <lduncan@suse.com>
On 5/2/22 23:59, Hannes Reinecke wrote: > The bus reset should not depend on any command, but rather only > use the SCSI Host and the channel/bus number as argument. > > Signed-off-by: Hannes Reinecke <hare@suse.com> > --- > Documentation/scsi/scsi_eh.rst | 2 +- > Documentation/scsi/scsi_mid_low_api.rst | 5 ++- > include/scsi/scsi_host.h | 2 +- > 36 files changed, 150 insertions(+), 163 deletions(-) > > diff --git a/Documentation/scsi/scsi_eh.rst b/Documentation/scsi/scsi_eh.rst > index 12113cca5ad9..5e2d04e64005 100644 > --- a/Documentation/scsi/scsi_eh.rst > +++ b/Documentation/scsi/scsi_eh.rst > @@ -214,7 +214,7 @@ considered to fail always. > > int (* eh_abort_handler)(struct scsi_cmnd *); > int (* eh_device_reset_handler)(struct scsi_cmnd *); > - int (* eh_bus_reset_handler)(struct scsi_cmnd *); > + int (* eh_bus_reset_handler)(struct Scsi_Host *, int); IIRC, checkpatch prefers using variable names with prototypes. I also like it because it would explain the semantics of e.g. the "int". Is it possible to do so in function pointer definitions? [method seemed to work for me with gcc 11.3.0]: + int (* eh_bus_reset_handler)(struct Scsi_Host *host, int channel); > int (* eh_host_reset_handler)(struct Scsi_Host *); > > Higher-severity actions are taken only when lower-severity actions > diff --git a/Documentation/scsi/scsi_mid_low_api.rst b/Documentation/scsi/scsi_mid_low_api.rst > index 784587ea7eee..1b1c37445580 100644 > --- a/Documentation/scsi/scsi_mid_low_api.rst > +++ b/Documentation/scsi/scsi_mid_low_api.rst > @@ -741,7 +741,8 @@ Details:: > > /** > * eh_bus_reset_handler - issue SCSI bus reset > - * @scp: SCSI bus that contains this device should be reset > + * @host: SCSI Host that contains the channel which should be reset > + * @channel: channel to be reset > * > * Returns SUCCESS if command aborted else FAILED > * > @@ -754,7 +755,7 @@ Details:: > * > * Optionally defined in: LLD > **/ > - int eh_bus_reset_handler(struct scsi_cmnd * scp) > + int eh_bus_reset_handler(struct Scsi_Host * host, int channel) exactly like that > > > /** > diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h > index 3b8d9e65ea57..73c9971e7334 100644 > --- a/include/scsi/scsi_host.h > +++ b/include/scsi/scsi_host.h > @@ -140,7 +140,7 @@ struct scsi_host_template { > int (* eh_abort_handler)(struct scsi_cmnd *); > int (* eh_device_reset_handler)(struct scsi_cmnd *); > int (* eh_target_reset_handler)(struct scsi_cmnd *); > - int (* eh_bus_reset_handler)(struct scsi_cmnd *); > + int (* eh_bus_reset_handler)(struct Scsi_Host *, int); dito > int (* eh_host_reset_handler)(struct Scsi_Host *); > > /*
On Mon, May 2, 2022 at 4:01 PM Hannes Reinecke <hare@suse.de> wrote: > > The bus reset should not depend on any command, but rather only > use the SCSI Host and the channel/bus number as argument. > > Signed-off-by: Hannes Reinecke <hare@suse.com> > --- > Documentation/scsi/scsi_eh.rst | 2 +- > Documentation/scsi/scsi_mid_low_api.rst | 5 ++- > drivers/message/fusion/mptfc.c | 13 +++---- > drivers/message/fusion/mptscsih.c | 21 ++++------- > drivers/message/fusion/mptscsih.h | 2 +- > drivers/scsi/a100u2w.c | 4 +- > drivers/scsi/aacraid/linit.c | 11 +++--- > drivers/scsi/aha152x.c | 4 +- > drivers/scsi/aha1542.c | 4 +- > drivers/scsi/aic7xxx/aic79xx_osm.c | 10 ++--- > drivers/scsi/aic7xxx/aic7xxx_osm.c | 6 +-- > drivers/scsi/arcmsr/arcmsr_hba.c | 6 +-- > drivers/scsi/arm/fas216.c | 9 +++-- > drivers/scsi/arm/fas216.h | 5 ++- > drivers/scsi/dc395x.c | 25 ++++++------- > drivers/scsi/dpt_i2o.c | 9 +++-- > drivers/scsi/dpti.h | 2 +- > drivers/scsi/esas2r/esas2r.h | 2 +- > drivers/scsi/esas2r/esas2r_main.c | 4 +- > drivers/scsi/esp_scsi.c | 4 +- > drivers/scsi/initio.c | 11 +++--- > drivers/scsi/mpi3mr/mpi3mr_os.c | 37 +++++++++++-------- > drivers/scsi/ncr53c8xx.c | 4 +- > drivers/scsi/pcmcia/nsp_cs.c | 6 +-- > drivers/scsi/pcmcia/nsp_cs.h | 2 +- > drivers/scsi/pmcraid.c | 7 ++-- > drivers/scsi/qla1280.c | 12 +++--- > drivers/scsi/qla2xxx/qla_os.c | 17 +++------ > drivers/scsi/scsi_debug.c | 31 ++++++---------- > drivers/scsi/scsi_error.c | 2 +- > drivers/scsi/sym53c8xx_2/sym_glue.c | 7 ++-- > drivers/scsi/vmw_pvscsi.c | 5 +-- > drivers/scsi/wd719x.c | 11 +++--- > .../staging/unisys/visorhba/visorhba_main.c | 7 ++-- > drivers/usb/storage/scsiglue.c | 4 +- > include/scsi/scsi_host.h | 2 +- > 36 files changed, 150 insertions(+), 163 deletions(-) > > diff --git a/Documentation/scsi/scsi_eh.rst b/Documentation/scsi/scsi_eh.rst > index 12113cca5ad9..5e2d04e64005 100644 > --- a/Documentation/scsi/scsi_eh.rst > +++ b/Documentation/scsi/scsi_eh.rst > @@ -214,7 +214,7 @@ considered to fail always. > > int (* eh_abort_handler)(struct scsi_cmnd *); > int (* eh_device_reset_handler)(struct scsi_cmnd *); > - int (* eh_bus_reset_handler)(struct scsi_cmnd *); > + int (* eh_bus_reset_handler)(struct Scsi_Host *, int); > int (* eh_host_reset_handler)(struct Scsi_Host *); > > Higher-severity actions are taken only when lower-severity actions > diff --git a/Documentation/scsi/scsi_mid_low_api.rst b/Documentation/scsi/scsi_mid_low_api.rst > index 784587ea7eee..1b1c37445580 100644 > --- a/Documentation/scsi/scsi_mid_low_api.rst > +++ b/Documentation/scsi/scsi_mid_low_api.rst > @@ -741,7 +741,8 @@ Details:: > > /** > * eh_bus_reset_handler - issue SCSI bus reset > - * @scp: SCSI bus that contains this device should be reset > + * @host: SCSI Host that contains the channel which should be reset > + * @channel: channel to be reset > * > * Returns SUCCESS if command aborted else FAILED > * > @@ -754,7 +755,7 @@ Details:: > * > * Optionally defined in: LLD > **/ > - int eh_bus_reset_handler(struct scsi_cmnd * scp) > + int eh_bus_reset_handler(struct Scsi_Host * host, int channel) > > > /** > diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c > index 4a621380a4eb..bc62f0cc0cbd 100644 > --- a/drivers/message/fusion/mptfc.c > +++ b/drivers/message/fusion/mptfc.c > @@ -103,7 +103,7 @@ static void mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout); > static void mptfc_remove(struct pci_dev *pdev); > static int mptfc_abort(struct scsi_cmnd *SCpnt); > static int mptfc_dev_reset(struct scsi_cmnd *SCpnt); > -static int mptfc_bus_reset(struct scsi_cmnd *SCpnt); > +static int mptfc_bus_reset(struct Scsi_Host *shost, int channel); > > static struct scsi_host_template mptfc_driver_template = { > .module = THIS_MODULE, > @@ -259,11 +259,9 @@ mptfc_dev_reset(struct scsi_cmnd *SCpnt) > } > > static int > -mptfc_bus_reset(struct scsi_cmnd *SCpnt) > +mptfc_bus_reset(struct Scsi_Host *shost, int channel) > { > - struct Scsi_Host *shost = SCpnt->device->host; > MPT_SCSI_HOST __maybe_unused *hd = shost_priv(shost); > - int channel = SCpnt->device->channel; > struct mptfc_rport_info *ri; > int rtn; > > @@ -280,10 +278,9 @@ mptfc_bus_reset(struct scsi_cmnd *SCpnt) > } > if (rtn == 0) { > dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT > - "%s.%d: %d:%llu, executing recovery.\n", __func__, > - hd->ioc->name, shost->host_no, > - SCpnt->device->id, SCpnt->device->lun)); > - rtn = mptscsih_bus_reset(SCpnt); > + "%s.%d: 0:0, executing recovery.\n", __func__, > + hd->ioc->name, shost->host_no)); > + rtn = mptscsih_bus_reset(shost, channel); > } > return rtn; > } > diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c > index 3df07e024026..afdbc8138346 100644 > --- a/drivers/message/fusion/mptscsih.c > +++ b/drivers/message/fusion/mptscsih.c > @@ -1914,39 +1914,34 @@ mptscsih_target_reset(struct scsi_cmnd * SCpnt) > * Returns SUCCESS or FAILED. > **/ > int > -mptscsih_bus_reset(struct scsi_cmnd * SCpnt) > +mptscsih_bus_reset(struct Scsi_Host * shost, int channel) > { > MPT_SCSI_HOST *hd; > int retval; > - VirtDevice *vdevice; > MPT_ADAPTER *ioc; > > /* If we can't locate our host adapter structure, return FAILED status. > */ > - if ((hd = shost_priv(SCpnt->device->host)) == NULL){ > + if ((hd = shost_priv(shost)) == NULL){ > printk(KERN_ERR MYNAM ": bus reset: " > - "Can't locate host! (sc=%p)\n", SCpnt); > + "Can't locate host!\n"); > return FAILED; > } > > ioc = hd->ioc; > - printk(MYIOC_s_INFO_FMT "attempting bus reset! (sc=%p)\n", > - ioc->name, SCpnt); > - scsi_print_command(SCpnt); > + printk(MYIOC_s_INFO_FMT "attempting bus reset!\n", > + ioc->name); > > if (ioc->timeouts < -1) > ioc->timeouts++; > > - vdevice = SCpnt->device->hostdata; > - if (!vdevice || !vdevice->vtarget) > - return SUCCESS; > retval = mptscsih_IssueTaskMgmt(hd, > MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS, > - vdevice->vtarget->channel, 0, 0, 0, > + channel, 0, 0, 0, > mptscsih_get_tm_timeout(ioc)); > > - printk(MYIOC_s_INFO_FMT "bus reset: %s (sc=%p)\n", > - ioc->name, ((retval == 0) ? "SUCCESS" : "FAILED" ), SCpnt); > + printk(MYIOC_s_INFO_FMT "bus reset: %s\n", > + ioc->name, ((retval == 0) ? "SUCCESS" : "FAILED" )); > > if (retval == 0) > return SUCCESS; > diff --git a/drivers/message/fusion/mptscsih.h b/drivers/message/fusion/mptscsih.h > index 0faefe9c7541..9f3756bd25eb 100644 > --- a/drivers/message/fusion/mptscsih.h > +++ b/drivers/message/fusion/mptscsih.h > @@ -121,7 +121,7 @@ extern int mptscsih_slave_configure(struct scsi_device *device); > extern int mptscsih_abort(struct scsi_cmnd * SCpnt); > extern int mptscsih_dev_reset(struct scsi_cmnd * SCpnt); > extern int mptscsih_target_reset(struct scsi_cmnd * SCpnt); > -extern int mptscsih_bus_reset(struct scsi_cmnd * SCpnt); > +extern int mptscsih_bus_reset(struct Scsi_Host *, int); > extern int mptscsih_host_reset(struct Scsi_Host *sh); > extern int mptscsih_bios_param(struct scsi_device * sdev, struct block_device *bdev, sector_t capacity, int geom[]); > extern int mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r); > diff --git a/drivers/scsi/a100u2w.c b/drivers/scsi/a100u2w.c > index bf552c818958..dab79824e2f6 100644 > --- a/drivers/scsi/a100u2w.c > +++ b/drivers/scsi/a100u2w.c > @@ -934,10 +934,10 @@ static int inia100_abort(struct scsi_cmnd * cmd) > Output : None. > Return : pSRB - Pointer to SCSI request block. > *****************************************************************************/ > -static int inia100_bus_reset(struct scsi_cmnd * cmd) > +static int inia100_bus_reset(struct Scsi_Host * shost, int channel) > { /* I need Host Control Block Information */ > struct orc_host *host; > - host = (struct orc_host *) cmd->device->host->hostdata; > + host = (struct orc_host *) shost->hostdata; > return orc_reset_scsi_bus(host); > } > > diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c > index 19a012c9a3c9..de7e0985ac2b 100644 > --- a/drivers/scsi/aacraid/linit.c > +++ b/drivers/scsi/aacraid/linit.c > @@ -1025,20 +1025,18 @@ static int aac_eh_target_reset(struct scsi_cmnd *cmd) > > /* > * aac_eh_bus_reset - Bus reset command handling > - * @scsi_cmd: SCSI command block causing the reset > + * @host: SCSI host causing the reset > + * @channel: Number of the bus to be reset > * > */ > -static int aac_eh_bus_reset(struct scsi_cmnd* cmd) > +static int aac_eh_bus_reset(struct Scsi_Host *host, int channel) > { > - struct scsi_device * dev = cmd->device; > - struct Scsi_Host * host = dev->host; > struct aac_dev * aac = (struct aac_dev *)host->hostdata; > int count; > u32 cmd_bus; > int status = 0; > > - > - cmd_bus = aac_logical_to_phys(scmd_channel(cmd)); > + cmd_bus = aac_logical_to_phys(channel); > /* Mark the assoc. FIB to not complete, eh handler does this */ > for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) { > struct fib *fib = &aac->fibs[count]; > @@ -1046,6 +1044,7 @@ static int aac_eh_bus_reset(struct scsi_cmnd* cmd) > if (fib->hw_fib_va->header.XferState && > (fib->flags & FIB_CONTEXT_FLAG) && > (fib->flags & FIB_CONTEXT_FLAG_SCSI_CMD)) { > + struct scsi_cmnd *cmd; > struct aac_hba_map_info *info; > u32 bus, cid; > > diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c > index 7e58f25c599b..1312dc5ef6d2 100644 > --- a/drivers/scsi/aha152x.c > +++ b/drivers/scsi/aha152x.c > @@ -1192,9 +1192,9 @@ static int aha152x_bus_reset_host(struct Scsi_Host *shpnt) > * Reset the bus > * > */ > -static int aha152x_bus_reset(struct scsi_cmnd *SCpnt) > +static int aha152x_bus_reset(struct Scsi_Host *shpnt, int channel) > { > - return aha152x_bus_reset_host(SCpnt->device->host); > + return aha152x_bus_reset_host(shpnt); > } > > /* > diff --git a/drivers/scsi/aha1542.c b/drivers/scsi/aha1542.c > index 69063fe4aab8..797a49f927dd 100644 > --- a/drivers/scsi/aha1542.c > +++ b/drivers/scsi/aha1542.c > @@ -980,9 +980,9 @@ static int aha1542_reset(struct Scsi_Host *sh, u8 reset_cmd) > return SUCCESS; > } > > -static int aha1542_bus_reset(struct scsi_cmnd *cmd) > +static int aha1542_bus_reset(struct Scsi_Host *sh, int channel) > { > - return aha1542_reset(cmd->device->host, SCRST); > + return aha1542_reset(sh, SCRST); > } > > static int aha1542_host_reset(struct Scsi_Host *sh) > diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c > index c46e8152af28..00786c37f39f 100644 > --- a/drivers/scsi/aic7xxx/aic79xx_osm.c > +++ b/drivers/scsi/aic7xxx/aic79xx_osm.c > @@ -866,21 +866,21 @@ ahd_linux_dev_reset(struct scsi_cmnd *cmd) > * Reset the SCSI bus. > */ > static int > -ahd_linux_bus_reset(struct scsi_cmnd *cmd) > +ahd_linux_bus_reset(struct Scsi_Host *shost, int channel) > { > struct ahd_softc *ahd; > int found; > unsigned long flags; > > - ahd = *(struct ahd_softc **)cmd->device->host->hostdata; > + ahd = *(struct ahd_softc **)shost->hostdata; > #ifdef AHD_DEBUG > if ((ahd_debug & AHD_SHOW_RECOVERY) != 0) > - printk("%s: Bus reset called for cmd %p\n", > - ahd_name(ahd), cmd); > + printk("%s: Bus reset called for channel %d\n", > + ahd_name(ahd), channel); > #endif > ahd_lock(ahd, &flags); > > - found = ahd_reset_channel(ahd, scmd_channel(cmd) + 'A', > + found = ahd_reset_channel(ahd, channel + 'A', > /*initiate reset*/TRUE); > ahd_unlock(ahd, &flags); > > diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c > index 0ad429b7ebcf..f6c547cef26c 100644 > --- a/drivers/scsi/aic7xxx/aic7xxx_osm.c > +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c > @@ -753,16 +753,16 @@ ahc_linux_dev_reset(struct scsi_cmnd *cmd) > * Reset the SCSI bus. > */ > static int > -ahc_linux_bus_reset(struct scsi_cmnd *cmd) > +ahc_linux_bus_reset(struct Scsi_Host *shost, int channel) > { > struct ahc_softc *ahc; > int found; > unsigned long flags; > > - ahc = *(struct ahc_softc **)cmd->device->host->hostdata; > + ahc = *(struct ahc_softc **)shost->hostdata; > > ahc_lock(ahc, &flags); > - found = ahc_reset_channel(ahc, scmd_channel(cmd) + 'A', > + found = ahc_reset_channel(ahc, channel + 'A', > /*initiate reset*/TRUE); > ahc_unlock(ahc, &flags); > > diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c > index d3fb8a9c1c39..baa03ead75d9 100644 > --- a/drivers/scsi/arcmsr/arcmsr_hba.c > +++ b/drivers/scsi/arcmsr/arcmsr_hba.c > @@ -111,7 +111,7 @@ static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, > struct scsi_cmnd *cmd); > static int arcmsr_iop_confirm(struct AdapterControlBlock *acb); > static int arcmsr_abort(struct scsi_cmnd *); > -static int arcmsr_bus_reset(struct scsi_cmnd *); > +static int arcmsr_bus_reset(struct Scsi_Host *, int); > static int arcmsr_bios_param(struct scsi_device *sdev, > struct block_device *bdev, sector_t capacity, int *info); > static int arcmsr_queue_command(struct Scsi_Host *h, struct scsi_cmnd *cmd); > @@ -4573,12 +4573,12 @@ static uint8_t arcmsr_iop_reset(struct AdapterControlBlock *acb) > return rtnval; > } > > -static int arcmsr_bus_reset(struct scsi_cmnd *cmd) > +static int arcmsr_bus_reset(struct Scsi_Host *shost, int channel) > { > struct AdapterControlBlock *acb; > int retry_count = 0; > int rtn = FAILED; > - acb = (struct AdapterControlBlock *) cmd->device->host->hostdata; > + acb = (struct AdapterControlBlock *) shost->hostdata; > if (acb->acb_flags & ACB_F_ADAPTER_REMOVED) > return SUCCESS; > pr_notice("arcmsr: executing bus reset eh.....num_resets = %d," > diff --git a/drivers/scsi/arm/fas216.c b/drivers/scsi/arm/fas216.c > index 38eec967155d..c27b49c42c4f 100644 > --- a/drivers/scsi/arm/fas216.c > +++ b/drivers/scsi/arm/fas216.c > @@ -2550,15 +2550,16 @@ int fas216_eh_device_reset(struct scsi_cmnd *SCpnt) > > /** > * fas216_eh_bus_reset - Reset the bus associated with the command > - * @SCpnt: command specifing bus to reset > + * @shost: host to be reset > + * @channel: bus number to reset > * > - * Reset the bus associated with the command. > + * Reset the bus. > * Returns: FAILED if unable to reset. > * Notes: Further commands are blocked. > */ > -int fas216_eh_bus_reset(struct scsi_cmnd *SCpnt) > +int fas216_eh_bus_reset(struct Scsi_Host *shost, int channel) > { > - FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata; > + FAS216_Info *info = (FAS216_Info *)shost->hostdata; > unsigned long flags; > struct scsi_device *SDpnt; > > diff --git a/drivers/scsi/arm/fas216.h b/drivers/scsi/arm/fas216.h > index f17583f143b3..27a4b564f054 100644 > --- a/drivers/scsi/arm/fas216.h > +++ b/drivers/scsi/arm/fas216.h > @@ -389,10 +389,11 @@ extern int fas216_eh_device_reset(struct scsi_cmnd *SCpnt); > > /* Function: int fas216_eh_bus_reset(struct scsi_cmnd *SCpnt) > * Purpose : Reset the complete bus associated with this command > - * Params : SCpnt - command specifing bus to reset > + * Params : shost - host to be reset > + * channel - bus to be reset > * Returns : FAILED if unable to reset > */ > -extern int fas216_eh_bus_reset(struct scsi_cmnd *SCpnt); > +extern int fas216_eh_bus_reset(struct Scsi_Host *shost, int channel); > > /* Function: int fas216_eh_host_reset(struct Scsi_Host *shost) > * Purpose : Reset the host associated with this command > diff --git a/drivers/scsi/dc395x.c b/drivers/scsi/dc395x.c > index 67a89715c863..7374eda8cffa 100644 > --- a/drivers/scsi/dc395x.c > +++ b/drivers/scsi/dc395x.c > @@ -1144,19 +1144,18 @@ static void reset_dev_param(struct AdapterCtlBlk *acb) > * @cmd - some command for this host (for fetching hooks) > * Returns: SUCCESS (0x2002) on success, else FAILED (0x2003). > */ > -static int __dc395x_eh_bus_reset(struct scsi_cmnd *cmd) > +static int __dc395x_eh_bus_reset(struct Scsi_Host *shost, int channel) > { > struct AdapterCtlBlk *acb = > - (struct AdapterCtlBlk *)cmd->device->host->hostdata; > + (struct AdapterCtlBlk *)shost->hostdata; > dprintkl(KERN_INFO, > - "eh_bus_reset: (0%p) target=<%02i-%i> cmd=%p\n", > - cmd, cmd->device->id, (u8)cmd->device->lun, cmd); > + "eh_bus_reset: bus=<%02i>\n", channel); > > if (timer_pending(&acb->waiting_timer)) > del_timer(&acb->waiting_timer); > > /* > - * disable interrupt > + * disable interrupt > */ > DC395x_write8(acb, TRM_S1040_DMA_INTEN, 0x00); > DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0x00); > @@ -1172,7 +1171,7 @@ static int __dc395x_eh_bus_reset(struct scsi_cmnd *cmd) > HZ * acb->eeprom.delay_time; > > /* > - * re-enable interrupt > + * re-enable interrupt > */ > /* Clear SCSI FIFO */ > DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO); > @@ -1182,7 +1181,7 @@ static int __dc395x_eh_bus_reset(struct scsi_cmnd *cmd) > set_basic_config(acb); > > reset_dev_param(acb); > - doing_srb_done(acb, DID_RESET, cmd, 0); > + doing_srb_done(acb, DID_RESET, NULL, 0); > acb->active_dcb = NULL; > acb->acb_flag = 0; /* RESET_DETECT, RESET_DONE ,RESET_DEV */ > waiting_process_next(acb); > @@ -1190,13 +1189,13 @@ static int __dc395x_eh_bus_reset(struct scsi_cmnd *cmd) > return SUCCESS; > } > > -static int dc395x_eh_bus_reset(struct scsi_cmnd *cmd) > +static int dc395x_eh_bus_reset(struct Scsi_Host *shost, int channel) > { > int rc; > > - spin_lock_irq(cmd->device->host->host_lock); > - rc = __dc395x_eh_bus_reset(cmd); > - spin_unlock_irq(cmd->device->host->host_lock); > + spin_lock_irq(shost->host_lock); > + rc = __dc395x_eh_bus_reset(shost, channel); > + spin_unlock_irq(shost->host_lock); > > return rc; > } > @@ -3338,7 +3337,7 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, > > /* abort all cmds in our queues */ > static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag, > - struct scsi_cmnd *cmd, u8 force) > + struct scsi_cmnd *cmd, u8 force) > { > struct DeviceCtlBlk *dcb; > dprintkl(KERN_INFO, "doing_srb_done: pids "); > @@ -3386,7 +3385,7 @@ static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag, > set_status_byte(p, SAM_STAT_GOOD); > pci_unmap_srb_sense(acb, srb); > pci_unmap_srb(acb, srb); > - if (force) { > + if (force && cmd) { > /* For new EH, we normally don't need to give commands back, > * as they all complete or all time out */ > scsi_done(cmd); > diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c > index 6e3ad0e5b533..b1ab772aff0e 100644 > --- a/drivers/scsi/dpt_i2o.c > +++ b/drivers/scsi/dpt_i2o.c > @@ -718,17 +718,18 @@ static int adpt_device_reset(struct scsi_cmnd* cmd) > > #define I2O_HBA_BUS_RESET 0x87 > // This version of bus reset is called by the eh_error handler > -static int adpt_bus_reset(struct scsi_cmnd* cmd) > +static int adpt_bus_reset(struct Scsi_Host *shost, int channel) > { > adpt_hba* pHba; > u32 msg[4]; > u32 rcode; > > - pHba = (adpt_hba*)cmd->device->host->hostdata[0]; > + pHba = (adpt_hba*)shost->hostdata[0]; > memset(msg, 0, sizeof(msg)); > - printk(KERN_WARNING"%s: Bus reset: SCSI Bus %d: tid: %d\n",pHba->name, cmd->device->channel,pHba->channel[cmd->device->channel].tid ); > + printk(KERN_WARNING"%s: Bus reset: SCSI Bus %d: tid: %d\n", > + pHba->name, channel, pHba->channel[channel].tid ); > msg[0] = FOUR_WORD_MSG_SIZE|SGL_OFFSET_0; > - msg[1] = (I2O_HBA_BUS_RESET<<24|HOST_TID<<12|pHba->channel[cmd->device->channel].tid); > + msg[1] = (I2O_HBA_BUS_RESET<<24|HOST_TID<<12|pHba->channel[channel].tid); > msg[2] = 0; > msg[3] = 0; > if (pHba->host) > diff --git a/drivers/scsi/dpti.h b/drivers/scsi/dpti.h > index b77a3625fa6f..48878e69ab2c 100644 > --- a/drivers/scsi/dpti.h > +++ b/drivers/scsi/dpti.h > @@ -35,7 +35,7 @@ static const char *adpt_info(struct Scsi_Host *pSHost); > static int adpt_bios_param(struct scsi_device * sdev, struct block_device *dev, > sector_t, int geom[]); > > -static int adpt_bus_reset(struct scsi_cmnd* cmd); > +static int adpt_bus_reset(struct Scsi_Host* shost, int channel); > static int adpt_device_reset(struct scsi_cmnd* cmd); > > > diff --git a/drivers/scsi/esas2r/esas2r.h b/drivers/scsi/esas2r/esas2r.h > index a104d1a3a9da..5c1eeaffc090 100644 > --- a/drivers/scsi/esas2r/esas2r.h > +++ b/drivers/scsi/esas2r/esas2r.h > @@ -977,7 +977,7 @@ long esas2r_proc_ioctl(struct file *fp, unsigned int cmd, unsigned long arg); > int esas2r_eh_abort(struct scsi_cmnd *cmd); > int esas2r_device_reset(struct scsi_cmnd *cmd); > int esas2r_host_reset(struct Scsi_Host *shost); > -int esas2r_bus_reset(struct scsi_cmnd *cmd); > +int esas2r_bus_reset(struct Scsi_Host *shost, int channel); > int esas2r_target_reset(struct scsi_cmnd *cmd); > > /* Internal functions */ > diff --git a/drivers/scsi/esas2r/esas2r_main.c b/drivers/scsi/esas2r/esas2r_main.c > index 52494c8bb656..315b8a61d0d7 100644 > --- a/drivers/scsi/esas2r/esas2r_main.c > +++ b/drivers/scsi/esas2r/esas2r_main.c > @@ -1094,10 +1094,8 @@ int esas2r_host_reset(struct Scsi_Host *shost) > return esas2r_host_bus_reset(shost, true); > } > > -int esas2r_bus_reset(struct scsi_cmnd *cmd) > +int esas2r_bus_reset(struct Scsi_Host *shost, int channel) > { > - struct Scsi_Host *shost = cmd->device->host; > - > esas2r_log(ESAS2R_LOG_INFO, "bus_reset (%p)", shost); > > return esas2r_host_bus_reset(shost, false); > diff --git a/drivers/scsi/esp_scsi.c b/drivers/scsi/esp_scsi.c > index b41eac8b5e0f..2fa53100df24 100644 > --- a/drivers/scsi/esp_scsi.c > +++ b/drivers/scsi/esp_scsi.c > @@ -2604,9 +2604,9 @@ static int esp_eh_abort_handler(struct scsi_cmnd *cmd) > return FAILED; > } > > -static int esp_eh_bus_reset_handler(struct scsi_cmnd *cmd) > +static int esp_eh_bus_reset_handler(struct Scsi_Host *shost, int channel) > { > - struct esp *esp = shost_priv(cmd->device->host); > + struct esp *esp = shost_priv(shost); > struct completion eh_reset; > unsigned long flags; > > diff --git a/drivers/scsi/initio.c b/drivers/scsi/initio.c > index f585d6e5fab9..adddedfdbcc7 100644 > --- a/drivers/scsi/initio.c > +++ b/drivers/scsi/initio.c > @@ -2625,20 +2625,21 @@ static DEF_SCSI_QCMD(i91u_queuecommand) > > /** > * i91u_bus_reset - reset the SCSI bus > - * @cmnd: Command block we want to trigger the reset for > + * @shost: SCSI host to be reset > + * @channel: Bus number to be reset > * > * Initiate a SCSI bus reset sequence > */ > > -static int i91u_bus_reset(struct scsi_cmnd * cmnd) > +static int i91u_bus_reset(struct Scsi_Host * shost, int channel) > { > struct initio_host *host; > > - host = (struct initio_host *) cmnd->device->host->hostdata; > + host = (struct initio_host *) shost->hostdata; > > - spin_lock_irq(cmnd->device->host->host_lock); > + spin_lock_irq(shost->host_lock); > initio_reset_scsi(host, 0); > - spin_unlock_irq(cmnd->device->host->host_lock); > + spin_unlock_irq(shost->host_lock); > > return SUCCESS; > } > diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c > index bd42d3a56590..88fbd01c05d0 100644 > --- a/drivers/scsi/mpi3mr/mpi3mr_os.c > +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c > @@ -3362,39 +3362,46 @@ static int mpi3mr_eh_host_reset(struct Scsi_Host *shost) > > /** > * mpi3mr_eh_bus_reset - Bus reset error handling callback > - * @scmd: SCSI command reference > + * @shost: SCSI host reference > + * @channel: bus number > * > * Checks whether pending I/Os are present for the RAID volume; > * if not there's no need to reset the adapter. > * > * Return: SUCCESS of successful reset else FAILED > */ > -static int mpi3mr_eh_bus_reset(struct scsi_cmnd *scmd) > +static int mpi3mr_eh_bus_reset(struct Scsi_Host *shost, int channel) > { > - struct mpi3mr_ioc *mrioc = shost_priv(scmd->device->host); > + struct mpi3mr_ioc *mrioc = shost_priv(shost); > + struct mpi3mr_tgt_dev *tgtdev; > struct mpi3mr_stgt_priv_data *stgt_priv_data; > - struct mpi3mr_sdev_priv_data *sdev_priv_data; > - u8 dev_type = MPI3_DEVICE_DEVFORM_VD; > int retval = FAILED; > > - sdev_priv_data = scmd->device->hostdata; > - if (sdev_priv_data && sdev_priv_data->tgt_priv_data) { > - stgt_priv_data = sdev_priv_data->tgt_priv_data; > - dev_type = stgt_priv_data->dev_type; > + spin_lock(&mrioc->tgtdev_lock); > + list_for_each_entry(tgtdev, &mrioc->tgtdev_list, list) { > + if (!tgtdev->starget || !tgtdev->starget->hostdata) > + continue; > + stgt_priv_data = (struct mpi3mr_stgt_priv_data *) > + tgtdev->starget->hostdata; > + if (stgt_priv_data->dev_type == MPI3_DEVICE_DEVFORM_VD) { > + retval = SUCCESS; > + break; > + } > } > + spin_unlock(&mrioc->tgtdev_lock); > >>Hannes, This is changing the purpose of the function. As per our original driver code, the driver was checking pending I/O (with a timeout of three minutes) only if I/Os that timed out were issued for RAID volumes, if an I/O which got timedout was issued to a normal bare drive then the controller is reset without checking pending I/O. That is changed here to wait even if there is a RAID volume in the channel. So even if the problematic drive is a PD, the driver will wait for three minutes. The driver doesn't expose PDs and VDs in different channels. I need more discussions with our controller architecture team prior to ACKing this change. > - if (dev_type == MPI3_DEVICE_DEVFORM_VD) { > + if (retval == SUCCESS) { > mpi3mr_wait_for_host_io(mrioc, > MPI3MR_RAID_ERRREC_RESET_TIMEOUT); > - if (!mpi3mr_get_fw_pending_ios(mrioc)) > - retval = SUCCESS; > + if (mpi3mr_get_fw_pending_ios(mrioc)) > + retval = FAILED; > } > if (retval == FAILED) > mpi3mr_print_pending_host_io(mrioc); > > - sdev_printk(KERN_INFO, scmd->device, > - "Bus reset is %s for scmd(%p)\n", > - ((retval == SUCCESS) ? "SUCCESS" : "FAILED"), scmd); > + shost_printk(KERN_INFO, shost, > + "Bus reset is %s\n", > + ((retval == SUCCESS) ? "SUCCESS" : "FAILED")); > return retval; > } > > diff --git a/drivers/scsi/ncr53c8xx.c b/drivers/scsi/ncr53c8xx.c > index 4458449c960b..2d4470686a4b 100644 > --- a/drivers/scsi/ncr53c8xx.c > +++ b/drivers/scsi/ncr53c8xx.c > @@ -7936,9 +7936,9 @@ static void ncr53c8xx_timeout(struct timer_list *t) > ncr_flush_done_cmds(done_list); > } > > -static int ncr53c8xx_bus_reset(struct scsi_cmnd *cmd) > +static int ncr53c8xx_bus_reset(struct Scsi_Host *host, int channel) > { > - struct ncb *np = ((struct host_data *) cmd->device->host->hostdata)->ncb; > + struct ncb *np = ((struct host_data *) host->hostdata)->ncb; > int sts; > unsigned long flags; > struct scsi_cmnd *done_list; > diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c > index 4aa9737fa711..b1bce76c83b9 100644 > --- a/drivers/scsi/pcmcia/nsp_cs.c > +++ b/drivers/scsi/pcmcia/nsp_cs.c > @@ -1488,11 +1488,11 @@ static int nsp_bus_reset(nsp_hw_data *data) > return SUCCESS; > } > > -static int nsp_eh_bus_reset(struct scsi_cmnd *SCpnt) > +static int nsp_eh_bus_reset(struct Scsi_Host *host, int channel) > { > - nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; > + nsp_hw_data *data = (nsp_hw_data *)host->hostdata; > > - nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt); > + nsp_dbg(NSP_DEBUG_BUSRESET, "channel=0x%d", channel); > > return nsp_bus_reset(data); > } > diff --git a/drivers/scsi/pcmcia/nsp_cs.h b/drivers/scsi/pcmcia/nsp_cs.h > index f532adb5f166..8636f0053c02 100644 > --- a/drivers/scsi/pcmcia/nsp_cs.h > +++ b/drivers/scsi/pcmcia/nsp_cs.h > @@ -299,7 +299,7 @@ static int nsp_queuecommand(struct Scsi_Host *h, struct scsi_cmnd *SCpnt); > /* Error handler */ > /*static int nsp_eh_abort (struct scsi_cmnd *SCpnt);*/ > /*static int nsp_eh_device_reset(struct scsi_cmnd *SCpnt);*/ > -static int nsp_eh_bus_reset (struct scsi_cmnd *SCpnt); > +static int nsp_eh_bus_reset (struct Scsi_Host *host, int channel); > static int nsp_eh_host_reset (struct Scsi_Host *host); > static int nsp_bus_reset (nsp_hw_data *data); > > diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c > index 79ca737ac75b..14e90807d38c 100644 > --- a/drivers/scsi/pmcraid.c > +++ b/drivers/scsi/pmcraid.c > @@ -3023,9 +3023,8 @@ static int pmcraid_eh_device_reset_handler(struct scsi_cmnd *scmd) > RESET_DEVICE_LUN); > } > > -static int pmcraid_eh_bus_reset_handler(struct scsi_cmnd *scmd) > +static int pmcraid_eh_bus_reset_handler(struct Scsi_Host *host, int channel) > { > - struct Scsi_Host *host = scmd->device->host; > struct pmcraid_instance *pinstance = > (struct pmcraid_instance *)host->hostdata; > struct pmcraid_resource_entry *res = NULL; > @@ -3039,11 +3038,11 @@ static int pmcraid_eh_bus_reset_handler(struct scsi_cmnd *scmd) > */ > spin_lock_irqsave(&pinstance->resource_lock, lock_flags); > list_for_each_entry(temp, &pinstance->used_res_q, queue) { > - if (scmd->device->channel == PMCRAID_VSET_BUS_ID && > + if (channel == PMCRAID_VSET_BUS_ID && > RES_IS_VSET(temp->cfg_entry)) { > res = temp; > break; > - } else if (scmd->device->channel == PMCRAID_PHYS_BUS_ID && > + } else if (channel == PMCRAID_PHYS_BUS_ID && > RES_IS_GSCSI(temp->cfg_entry)) { > res = temp; > break; > diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c > index cd4c7126c1c9..f32f00c7a390 100644 > --- a/drivers/scsi/qla1280.c > +++ b/drivers/scsi/qla1280.c > @@ -979,13 +979,15 @@ qla1280_eh_device_reset(struct scsi_cmnd *cmd) > * Reset the specified bus. > **************************************************************************/ > static int > -qla1280_eh_bus_reset(struct scsi_cmnd *cmd) > +qla1280_eh_bus_reset(struct Scsi_Host *shost, int bus) > { > - int rc; > + int rc = FAILED; > + struct scsi_qla_host *ha = (struct scsi_qla_host *)shost->hostdata; > > - spin_lock_irq(cmd->device->host->host_lock); > - rc = qla1280_error_action(cmd, BUS_RESET); > - spin_unlock_irq(cmd->device->host->host_lock); > + spin_lock_irq(shost->host_lock); > + if (qla1280_bus_reset(ha, bus) == 0) > + rc = qla1280_wait_for_pending_commands(ha, 1, 0); > + spin_unlock_irq(shost->host_lock); > > return rc; > } > diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c > index 5f86e7bd5a0e..11e7dc22b94d 100644 > --- a/drivers/scsi/qla2xxx/qla_os.c > +++ b/drivers/scsi/qla2xxx/qla_os.c > @@ -1537,7 +1537,7 @@ qla2xxx_eh_target_reset(struct scsi_cmnd *cmd) > * commands. > * > * Input: > -* cmd = Linux SCSI command packet of the command that cause the > +* host = Linux SCSI command packet of the command that cause the > * bus reset. > * > * Returns: > @@ -1545,12 +1545,10 @@ qla2xxx_eh_target_reset(struct scsi_cmnd *cmd) > * > **************************************************************************/ > static int > -qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) > +qla2xxx_eh_bus_reset(struct Scsi_Host *shost, int channel) > { > - scsi_qla_host_t *vha = shost_priv(cmd->device->host); > + scsi_qla_host_t *vha = shost_priv(shost); > int ret = FAILED; > - unsigned int id; > - uint64_t lun; > struct qla_hw_data *ha = vha->hw; > > if (qla2x00_isp_reg_stat(ha)) { > @@ -1560,14 +1558,11 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) > return FAILED; > } > > - id = cmd->device->id; > - lun = cmd->device->lun; > - > if (qla2x00_chip_is_down(vha)) > return ret; > > ql_log(ql_log_info, vha, 0x8012, > - "BUS RESET ISSUED nexus=%ld:%d:%llu.\n", vha->host_no, id, lun); > + "BUS RESET ISSUED nexus=%ld:%d.\n", vha->host_no, channel); > > if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) { > ql_log(ql_log_fatal, vha, 0x8013, > @@ -1591,8 +1586,8 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) > > eh_bus_reset_done: > ql_log(ql_log_warn, vha, 0x802b, > - "BUS RESET %s nexus=%ld:%d:%llu.\n", > - (ret == FAILED) ? "FAILED" : "SUCCEEDED", vha->host_no, id, lun); > + "BUS RESET %s nexus=%ld:%d.\n", > + (ret == FAILED) ? "FAILED" : "SUCCEEDED", vha->host_no, channel); > > return ret; > } > diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c > index 6292ac7aef7a..f2d3271bc80b 100644 > --- a/drivers/scsi/scsi_debug.c > +++ b/drivers/scsi/scsi_debug.c > @@ -5324,36 +5324,27 @@ static int scsi_debug_target_reset(struct scsi_cmnd *SCpnt) > return SUCCESS; > } > > -static int scsi_debug_bus_reset(struct scsi_cmnd *SCpnt) > +static int scsi_debug_bus_reset(struct Scsi_Host * hp, int channel) > { > - struct sdebug_host_info *sdbg_host; > + struct sdebug_host_info *sdbg_host = > + *(struct sdebug_host_info **)shost_priv(hp); > struct sdebug_dev_info *devip; > - struct scsi_device *sdp; > - struct Scsi_Host *hp; > int k = 0; > > ++num_bus_resets; > - if (!(SCpnt && SCpnt->device)) > - goto lie; > - sdp = SCpnt->device; > if (SDEBUG_OPT_ALL_NOISE & sdebug_opts) > - sdev_printk(KERN_INFO, sdp, "%s\n", __func__); > - hp = sdp->host; > - if (hp) { > - sdbg_host = *(struct sdebug_host_info **)shost_priv(hp); > - if (sdbg_host) { > - list_for_each_entry(devip, > - &sdbg_host->dev_info_list, > - dev_list) { > - set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm); > - ++k; > - } > + shost_printk(KERN_INFO, hp, "%s\n", __func__); > + if (sdbg_host) { > + list_for_each_entry(devip, > + &sdbg_host->dev_info_list, > + dev_list) { > + set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm); > + ++k; > } > } > if (SDEBUG_OPT_RESET_NOISE & sdebug_opts) > - sdev_printk(KERN_INFO, sdp, > + shost_printk(KERN_INFO, hp, > "%s: %d device(s) found in host\n", __func__, k); > -lie: > return SUCCESS; > } > > diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c > index 747131ca8970..148cab3e61c0 100644 > --- a/drivers/scsi/scsi_error.c > +++ b/drivers/scsi/scsi_error.c > @@ -871,7 +871,7 @@ static enum scsi_disposition scsi_try_bus_reset(struct scsi_cmnd *scmd) > if (!hostt->eh_bus_reset_handler) > return FAILED; > > - rtn = hostt->eh_bus_reset_handler(scmd); > + rtn = hostt->eh_bus_reset_handler(host, scmd_channel(scmd)); > > if (rtn == SUCCESS) { > if (!hostt->skip_settle_delay) > diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c > index a573baa5bdf2..aef828731995 100644 > --- a/drivers/scsi/sym53c8xx_2/sym_glue.c > +++ b/drivers/scsi/sym53c8xx_2/sym_glue.c > @@ -670,14 +670,13 @@ static int sym53c8xx_eh_target_reset_handler(struct scsi_cmnd *cmd) > return SCSI_SUCCESS; > } > > -static int sym53c8xx_eh_bus_reset_handler(struct scsi_cmnd *cmd) > +static int sym53c8xx_eh_bus_reset_handler(struct Scsi_Host *shost, int channel) > { > - struct Scsi_Host *shost = cmd->device->host; > struct sym_data *sym_data = shost_priv(shost); > struct pci_dev *pdev = sym_data->pdev; > struct sym_hcb *np = sym_data->ncb; > > - scmd_printk(KERN_WARNING, cmd, "BUS RESET operation started\n"); > + shost_printk(KERN_WARNING, shost, "BUS RESET operation started\n"); > > /* > * Escalate to host reset if the PCI bus went down > @@ -689,7 +688,7 @@ static int sym53c8xx_eh_bus_reset_handler(struct scsi_cmnd *cmd) > sym_reset_scsi_bus(np, 1); > spin_unlock_irq(shost->host_lock); > > - dev_warn(&cmd->device->sdev_gendev, "BUS RESET operation complete.\n"); > + shost_printk(KERN_WARNING, shost, "BUS RESET operation complete.\n"); > return SCSI_SUCCESS; > } > > diff --git a/drivers/scsi/vmw_pvscsi.c b/drivers/scsi/vmw_pvscsi.c > index ddf1837babc0..9c62d446ea9e 100644 > --- a/drivers/scsi/vmw_pvscsi.c > +++ b/drivers/scsi/vmw_pvscsi.c > @@ -947,13 +947,12 @@ static int pvscsi_host_reset(struct Scsi_Host *host) > return SUCCESS; > } > > -static int pvscsi_bus_reset(struct scsi_cmnd *cmd) > +static int pvscsi_bus_reset(struct Scsi_Host *host, int channel) > { > - struct Scsi_Host *host = cmd->device->host; > struct pvscsi_adapter *adapter = shost_priv(host); > unsigned long flags; > > - scmd_printk(KERN_INFO, cmd, "SCSI Bus reset\n"); > + shost_printk(KERN_INFO, host, "SCSI Bus reset\n"); > > /* > * We don't want to queue new requests for this bus after > diff --git a/drivers/scsi/wd719x.c b/drivers/scsi/wd719x.c > index 02b8eb153944..fd297c7517cd 100644 > --- a/drivers/scsi/wd719x.c > +++ b/drivers/scsi/wd719x.c > @@ -484,11 +484,11 @@ static int wd719x_abort(struct scsi_cmnd *cmd) > return SUCCESS; > } > > -static int wd719x_reset(struct scsi_cmnd *cmd, u8 opcode, u8 device) > +static int wd719x_reset(struct Scsi_Host *shost, u8 opcode, u8 device) > { > int result; > unsigned long flags; > - struct wd719x *wd = shost_priv(cmd->device->host); > + struct wd719x *wd = shost_priv(shost); > struct wd719x_scb *scb, *tmp; > > dev_info(&wd->pdev->dev, "%s reset requested\n", > @@ -512,12 +512,13 @@ static int wd719x_reset(struct scsi_cmnd *cmd, u8 opcode, u8 device) > > static int wd719x_dev_reset(struct scsi_cmnd *cmd) > { > - return wd719x_reset(cmd, WD719X_CMD_RESET, cmd->device->id); > + return wd719x_reset(cmd->device->host, WD719X_CMD_RESET, > + cmd->device->id); > } > > -static int wd719x_bus_reset(struct scsi_cmnd *cmd) > +static int wd719x_bus_reset(struct Scsi_Host *host, int channel) > { > - return wd719x_reset(cmd, WD719X_CMD_BUSRESET, 0); > + return wd719x_reset(host, WD719X_CMD_BUSRESET, 0); > } > > static int wd719x_host_reset(struct Scsi_Host *host) > diff --git a/drivers/staging/unisys/visorhba/visorhba_main.c b/drivers/staging/unisys/visorhba/visorhba_main.c > index 0de0dd09cf9d..28c59218077d 100644 > --- a/drivers/staging/unisys/visorhba/visorhba_main.c > +++ b/drivers/staging/unisys/visorhba/visorhba_main.c > @@ -366,14 +366,15 @@ static int visorhba_device_reset_handler(struct scsi_cmnd *scsicmd) > * > * Return: SUCCESS if inserted, FAILED otherwise > */ > -static int visorhba_bus_reset_handler(struct scsi_cmnd *scsicmd) > +static int visorhba_bus_reset_handler(struct Scsi_Host *scsihost, int channel) > { > struct scsi_device *scsidev; > struct visordisk_info *vdisk; > int rtn; > > - scsidev = scsicmd->device; > - shost_for_each_device(scsidev, scsidev->host) { > + shost_for_each_device(scsidev, scsihost) { > + if (scsidev->channel != channel) > + continue; > vdisk = scsidev->hostdata; > if (atomic_read(&vdisk->error_count) < VISORHBA_ERROR_COUNT) > atomic_inc(&vdisk->error_count); > diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c > index 8931df5a85fd..17dabfba6b2b 100644 > --- a/drivers/usb/storage/scsiglue.c > +++ b/drivers/usb/storage/scsiglue.c > @@ -464,9 +464,9 @@ static int device_reset(struct scsi_cmnd *srb) > } > > /* Simulate a SCSI bus reset by resetting the device's USB port. */ > -static int bus_reset(struct scsi_cmnd *srb) > +static int bus_reset(struct Scsi_Host *shost, int channel) > { > - struct us_data *us = host_to_us(srb->device->host); > + struct us_data *us = host_to_us(shost); > int result; > > usb_stor_dbg(us, "%s called\n", __func__); > diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h > index 3b8d9e65ea57..73c9971e7334 100644 > --- a/include/scsi/scsi_host.h > +++ b/include/scsi/scsi_host.h > @@ -140,7 +140,7 @@ struct scsi_host_template { > int (* eh_abort_handler)(struct scsi_cmnd *); > int (* eh_device_reset_handler)(struct scsi_cmnd *); > int (* eh_target_reset_handler)(struct scsi_cmnd *); > - int (* eh_bus_reset_handler)(struct scsi_cmnd *); > + int (* eh_bus_reset_handler)(struct Scsi_Host *, int); > int (* eh_host_reset_handler)(struct Scsi_Host *); > > /* > -- > 2.29.2 >
diff --git a/Documentation/scsi/scsi_eh.rst b/Documentation/scsi/scsi_eh.rst index 12113cca5ad9..5e2d04e64005 100644 --- a/Documentation/scsi/scsi_eh.rst +++ b/Documentation/scsi/scsi_eh.rst @@ -214,7 +214,7 @@ considered to fail always. int (* eh_abort_handler)(struct scsi_cmnd *); int (* eh_device_reset_handler)(struct scsi_cmnd *); - int (* eh_bus_reset_handler)(struct scsi_cmnd *); + int (* eh_bus_reset_handler)(struct Scsi_Host *, int); int (* eh_host_reset_handler)(struct Scsi_Host *); Higher-severity actions are taken only when lower-severity actions diff --git a/Documentation/scsi/scsi_mid_low_api.rst b/Documentation/scsi/scsi_mid_low_api.rst index 784587ea7eee..1b1c37445580 100644 --- a/Documentation/scsi/scsi_mid_low_api.rst +++ b/Documentation/scsi/scsi_mid_low_api.rst @@ -741,7 +741,8 @@ Details:: /** * eh_bus_reset_handler - issue SCSI bus reset - * @scp: SCSI bus that contains this device should be reset + * @host: SCSI Host that contains the channel which should be reset + * @channel: channel to be reset * * Returns SUCCESS if command aborted else FAILED * @@ -754,7 +755,7 @@ Details:: * * Optionally defined in: LLD **/ - int eh_bus_reset_handler(struct scsi_cmnd * scp) + int eh_bus_reset_handler(struct Scsi_Host * host, int channel) /** diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c index 4a621380a4eb..bc62f0cc0cbd 100644 --- a/drivers/message/fusion/mptfc.c +++ b/drivers/message/fusion/mptfc.c @@ -103,7 +103,7 @@ static void mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout); static void mptfc_remove(struct pci_dev *pdev); static int mptfc_abort(struct scsi_cmnd *SCpnt); static int mptfc_dev_reset(struct scsi_cmnd *SCpnt); -static int mptfc_bus_reset(struct scsi_cmnd *SCpnt); +static int mptfc_bus_reset(struct Scsi_Host *shost, int channel); static struct scsi_host_template mptfc_driver_template = { .module = THIS_MODULE, @@ -259,11 +259,9 @@ mptfc_dev_reset(struct scsi_cmnd *SCpnt) } static int -mptfc_bus_reset(struct scsi_cmnd *SCpnt) +mptfc_bus_reset(struct Scsi_Host *shost, int channel) { - struct Scsi_Host *shost = SCpnt->device->host; MPT_SCSI_HOST __maybe_unused *hd = shost_priv(shost); - int channel = SCpnt->device->channel; struct mptfc_rport_info *ri; int rtn; @@ -280,10 +278,9 @@ mptfc_bus_reset(struct scsi_cmnd *SCpnt) } if (rtn == 0) { dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT - "%s.%d: %d:%llu, executing recovery.\n", __func__, - hd->ioc->name, shost->host_no, - SCpnt->device->id, SCpnt->device->lun)); - rtn = mptscsih_bus_reset(SCpnt); + "%s.%d: 0:0, executing recovery.\n", __func__, + hd->ioc->name, shost->host_no)); + rtn = mptscsih_bus_reset(shost, channel); } return rtn; } diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c index 3df07e024026..afdbc8138346 100644 --- a/drivers/message/fusion/mptscsih.c +++ b/drivers/message/fusion/mptscsih.c @@ -1914,39 +1914,34 @@ mptscsih_target_reset(struct scsi_cmnd * SCpnt) * Returns SUCCESS or FAILED. **/ int -mptscsih_bus_reset(struct scsi_cmnd * SCpnt) +mptscsih_bus_reset(struct Scsi_Host * shost, int channel) { MPT_SCSI_HOST *hd; int retval; - VirtDevice *vdevice; MPT_ADAPTER *ioc; /* If we can't locate our host adapter structure, return FAILED status. */ - if ((hd = shost_priv(SCpnt->device->host)) == NULL){ + if ((hd = shost_priv(shost)) == NULL){ printk(KERN_ERR MYNAM ": bus reset: " - "Can't locate host! (sc=%p)\n", SCpnt); + "Can't locate host!\n"); return FAILED; } ioc = hd->ioc; - printk(MYIOC_s_INFO_FMT "attempting bus reset! (sc=%p)\n", - ioc->name, SCpnt); - scsi_print_command(SCpnt); + printk(MYIOC_s_INFO_FMT "attempting bus reset!\n", + ioc->name); if (ioc->timeouts < -1) ioc->timeouts++; - vdevice = SCpnt->device->hostdata; - if (!vdevice || !vdevice->vtarget) - return SUCCESS; retval = mptscsih_IssueTaskMgmt(hd, MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS, - vdevice->vtarget->channel, 0, 0, 0, + channel, 0, 0, 0, mptscsih_get_tm_timeout(ioc)); - printk(MYIOC_s_INFO_FMT "bus reset: %s (sc=%p)\n", - ioc->name, ((retval == 0) ? "SUCCESS" : "FAILED" ), SCpnt); + printk(MYIOC_s_INFO_FMT "bus reset: %s\n", + ioc->name, ((retval == 0) ? "SUCCESS" : "FAILED" )); if (retval == 0) return SUCCESS; diff --git a/drivers/message/fusion/mptscsih.h b/drivers/message/fusion/mptscsih.h index 0faefe9c7541..9f3756bd25eb 100644 --- a/drivers/message/fusion/mptscsih.h +++ b/drivers/message/fusion/mptscsih.h @@ -121,7 +121,7 @@ extern int mptscsih_slave_configure(struct scsi_device *device); extern int mptscsih_abort(struct scsi_cmnd * SCpnt); extern int mptscsih_dev_reset(struct scsi_cmnd * SCpnt); extern int mptscsih_target_reset(struct scsi_cmnd * SCpnt); -extern int mptscsih_bus_reset(struct scsi_cmnd * SCpnt); +extern int mptscsih_bus_reset(struct Scsi_Host *, int); extern int mptscsih_host_reset(struct Scsi_Host *sh); extern int mptscsih_bios_param(struct scsi_device * sdev, struct block_device *bdev, sector_t capacity, int geom[]); extern int mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r); diff --git a/drivers/scsi/a100u2w.c b/drivers/scsi/a100u2w.c index bf552c818958..dab79824e2f6 100644 --- a/drivers/scsi/a100u2w.c +++ b/drivers/scsi/a100u2w.c @@ -934,10 +934,10 @@ static int inia100_abort(struct scsi_cmnd * cmd) Output : None. Return : pSRB - Pointer to SCSI request block. *****************************************************************************/ -static int inia100_bus_reset(struct scsi_cmnd * cmd) +static int inia100_bus_reset(struct Scsi_Host * shost, int channel) { /* I need Host Control Block Information */ struct orc_host *host; - host = (struct orc_host *) cmd->device->host->hostdata; + host = (struct orc_host *) shost->hostdata; return orc_reset_scsi_bus(host); } diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index 19a012c9a3c9..de7e0985ac2b 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c @@ -1025,20 +1025,18 @@ static int aac_eh_target_reset(struct scsi_cmnd *cmd) /* * aac_eh_bus_reset - Bus reset command handling - * @scsi_cmd: SCSI command block causing the reset + * @host: SCSI host causing the reset + * @channel: Number of the bus to be reset * */ -static int aac_eh_bus_reset(struct scsi_cmnd* cmd) +static int aac_eh_bus_reset(struct Scsi_Host *host, int channel) { - struct scsi_device * dev = cmd->device; - struct Scsi_Host * host = dev->host; struct aac_dev * aac = (struct aac_dev *)host->hostdata; int count; u32 cmd_bus; int status = 0; - - cmd_bus = aac_logical_to_phys(scmd_channel(cmd)); + cmd_bus = aac_logical_to_phys(channel); /* Mark the assoc. FIB to not complete, eh handler does this */ for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) { struct fib *fib = &aac->fibs[count]; @@ -1046,6 +1044,7 @@ static int aac_eh_bus_reset(struct scsi_cmnd* cmd) if (fib->hw_fib_va->header.XferState && (fib->flags & FIB_CONTEXT_FLAG) && (fib->flags & FIB_CONTEXT_FLAG_SCSI_CMD)) { + struct scsi_cmnd *cmd; struct aac_hba_map_info *info; u32 bus, cid; diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c index 7e58f25c599b..1312dc5ef6d2 100644 --- a/drivers/scsi/aha152x.c +++ b/drivers/scsi/aha152x.c @@ -1192,9 +1192,9 @@ static int aha152x_bus_reset_host(struct Scsi_Host *shpnt) * Reset the bus * */ -static int aha152x_bus_reset(struct scsi_cmnd *SCpnt) +static int aha152x_bus_reset(struct Scsi_Host *shpnt, int channel) { - return aha152x_bus_reset_host(SCpnt->device->host); + return aha152x_bus_reset_host(shpnt); } /* diff --git a/drivers/scsi/aha1542.c b/drivers/scsi/aha1542.c index 69063fe4aab8..797a49f927dd 100644 --- a/drivers/scsi/aha1542.c +++ b/drivers/scsi/aha1542.c @@ -980,9 +980,9 @@ static int aha1542_reset(struct Scsi_Host *sh, u8 reset_cmd) return SUCCESS; } -static int aha1542_bus_reset(struct scsi_cmnd *cmd) +static int aha1542_bus_reset(struct Scsi_Host *sh, int channel) { - return aha1542_reset(cmd->device->host, SCRST); + return aha1542_reset(sh, SCRST); } static int aha1542_host_reset(struct Scsi_Host *sh) diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c index c46e8152af28..00786c37f39f 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.c +++ b/drivers/scsi/aic7xxx/aic79xx_osm.c @@ -866,21 +866,21 @@ ahd_linux_dev_reset(struct scsi_cmnd *cmd) * Reset the SCSI bus. */ static int -ahd_linux_bus_reset(struct scsi_cmnd *cmd) +ahd_linux_bus_reset(struct Scsi_Host *shost, int channel) { struct ahd_softc *ahd; int found; unsigned long flags; - ahd = *(struct ahd_softc **)cmd->device->host->hostdata; + ahd = *(struct ahd_softc **)shost->hostdata; #ifdef AHD_DEBUG if ((ahd_debug & AHD_SHOW_RECOVERY) != 0) - printk("%s: Bus reset called for cmd %p\n", - ahd_name(ahd), cmd); + printk("%s: Bus reset called for channel %d\n", + ahd_name(ahd), channel); #endif ahd_lock(ahd, &flags); - found = ahd_reset_channel(ahd, scmd_channel(cmd) + 'A', + found = ahd_reset_channel(ahd, channel + 'A', /*initiate reset*/TRUE); ahd_unlock(ahd, &flags); diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c index 0ad429b7ebcf..f6c547cef26c 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm.c +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c @@ -753,16 +753,16 @@ ahc_linux_dev_reset(struct scsi_cmnd *cmd) * Reset the SCSI bus. */ static int -ahc_linux_bus_reset(struct scsi_cmnd *cmd) +ahc_linux_bus_reset(struct Scsi_Host *shost, int channel) { struct ahc_softc *ahc; int found; unsigned long flags; - ahc = *(struct ahc_softc **)cmd->device->host->hostdata; + ahc = *(struct ahc_softc **)shost->hostdata; ahc_lock(ahc, &flags); - found = ahc_reset_channel(ahc, scmd_channel(cmd) + 'A', + found = ahc_reset_channel(ahc, channel + 'A', /*initiate reset*/TRUE); ahc_unlock(ahc, &flags); diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c index d3fb8a9c1c39..baa03ead75d9 100644 --- a/drivers/scsi/arcmsr/arcmsr_hba.c +++ b/drivers/scsi/arcmsr/arcmsr_hba.c @@ -111,7 +111,7 @@ static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, struct scsi_cmnd *cmd); static int arcmsr_iop_confirm(struct AdapterControlBlock *acb); static int arcmsr_abort(struct scsi_cmnd *); -static int arcmsr_bus_reset(struct scsi_cmnd *); +static int arcmsr_bus_reset(struct Scsi_Host *, int); static int arcmsr_bios_param(struct scsi_device *sdev, struct block_device *bdev, sector_t capacity, int *info); static int arcmsr_queue_command(struct Scsi_Host *h, struct scsi_cmnd *cmd); @@ -4573,12 +4573,12 @@ static uint8_t arcmsr_iop_reset(struct AdapterControlBlock *acb) return rtnval; } -static int arcmsr_bus_reset(struct scsi_cmnd *cmd) +static int arcmsr_bus_reset(struct Scsi_Host *shost, int channel) { struct AdapterControlBlock *acb; int retry_count = 0; int rtn = FAILED; - acb = (struct AdapterControlBlock *) cmd->device->host->hostdata; + acb = (struct AdapterControlBlock *) shost->hostdata; if (acb->acb_flags & ACB_F_ADAPTER_REMOVED) return SUCCESS; pr_notice("arcmsr: executing bus reset eh.....num_resets = %d," diff --git a/drivers/scsi/arm/fas216.c b/drivers/scsi/arm/fas216.c index 38eec967155d..c27b49c42c4f 100644 --- a/drivers/scsi/arm/fas216.c +++ b/drivers/scsi/arm/fas216.c @@ -2550,15 +2550,16 @@ int fas216_eh_device_reset(struct scsi_cmnd *SCpnt) /** * fas216_eh_bus_reset - Reset the bus associated with the command - * @SCpnt: command specifing bus to reset + * @shost: host to be reset + * @channel: bus number to reset * - * Reset the bus associated with the command. + * Reset the bus. * Returns: FAILED if unable to reset. * Notes: Further commands are blocked. */ -int fas216_eh_bus_reset(struct scsi_cmnd *SCpnt) +int fas216_eh_bus_reset(struct Scsi_Host *shost, int channel) { - FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata; + FAS216_Info *info = (FAS216_Info *)shost->hostdata; unsigned long flags; struct scsi_device *SDpnt; diff --git a/drivers/scsi/arm/fas216.h b/drivers/scsi/arm/fas216.h index f17583f143b3..27a4b564f054 100644 --- a/drivers/scsi/arm/fas216.h +++ b/drivers/scsi/arm/fas216.h @@ -389,10 +389,11 @@ extern int fas216_eh_device_reset(struct scsi_cmnd *SCpnt); /* Function: int fas216_eh_bus_reset(struct scsi_cmnd *SCpnt) * Purpose : Reset the complete bus associated with this command - * Params : SCpnt - command specifing bus to reset + * Params : shost - host to be reset + * channel - bus to be reset * Returns : FAILED if unable to reset */ -extern int fas216_eh_bus_reset(struct scsi_cmnd *SCpnt); +extern int fas216_eh_bus_reset(struct Scsi_Host *shost, int channel); /* Function: int fas216_eh_host_reset(struct Scsi_Host *shost) * Purpose : Reset the host associated with this command diff --git a/drivers/scsi/dc395x.c b/drivers/scsi/dc395x.c index 67a89715c863..7374eda8cffa 100644 --- a/drivers/scsi/dc395x.c +++ b/drivers/scsi/dc395x.c @@ -1144,19 +1144,18 @@ static void reset_dev_param(struct AdapterCtlBlk *acb) * @cmd - some command for this host (for fetching hooks) * Returns: SUCCESS (0x2002) on success, else FAILED (0x2003). */ -static int __dc395x_eh_bus_reset(struct scsi_cmnd *cmd) +static int __dc395x_eh_bus_reset(struct Scsi_Host *shost, int channel) { struct AdapterCtlBlk *acb = - (struct AdapterCtlBlk *)cmd->device->host->hostdata; + (struct AdapterCtlBlk *)shost->hostdata; dprintkl(KERN_INFO, - "eh_bus_reset: (0%p) target=<%02i-%i> cmd=%p\n", - cmd, cmd->device->id, (u8)cmd->device->lun, cmd); + "eh_bus_reset: bus=<%02i>\n", channel); if (timer_pending(&acb->waiting_timer)) del_timer(&acb->waiting_timer); /* - * disable interrupt + * disable interrupt */ DC395x_write8(acb, TRM_S1040_DMA_INTEN, 0x00); DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0x00); @@ -1172,7 +1171,7 @@ static int __dc395x_eh_bus_reset(struct scsi_cmnd *cmd) HZ * acb->eeprom.delay_time; /* - * re-enable interrupt + * re-enable interrupt */ /* Clear SCSI FIFO */ DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO); @@ -1182,7 +1181,7 @@ static int __dc395x_eh_bus_reset(struct scsi_cmnd *cmd) set_basic_config(acb); reset_dev_param(acb); - doing_srb_done(acb, DID_RESET, cmd, 0); + doing_srb_done(acb, DID_RESET, NULL, 0); acb->active_dcb = NULL; acb->acb_flag = 0; /* RESET_DETECT, RESET_DONE ,RESET_DEV */ waiting_process_next(acb); @@ -1190,13 +1189,13 @@ static int __dc395x_eh_bus_reset(struct scsi_cmnd *cmd) return SUCCESS; } -static int dc395x_eh_bus_reset(struct scsi_cmnd *cmd) +static int dc395x_eh_bus_reset(struct Scsi_Host *shost, int channel) { int rc; - spin_lock_irq(cmd->device->host->host_lock); - rc = __dc395x_eh_bus_reset(cmd); - spin_unlock_irq(cmd->device->host->host_lock); + spin_lock_irq(shost->host_lock); + rc = __dc395x_eh_bus_reset(shost, channel); + spin_unlock_irq(shost->host_lock); return rc; } @@ -3338,7 +3337,7 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, /* abort all cmds in our queues */ static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag, - struct scsi_cmnd *cmd, u8 force) + struct scsi_cmnd *cmd, u8 force) { struct DeviceCtlBlk *dcb; dprintkl(KERN_INFO, "doing_srb_done: pids "); @@ -3386,7 +3385,7 @@ static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag, set_status_byte(p, SAM_STAT_GOOD); pci_unmap_srb_sense(acb, srb); pci_unmap_srb(acb, srb); - if (force) { + if (force && cmd) { /* For new EH, we normally don't need to give commands back, * as they all complete or all time out */ scsi_done(cmd); diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c index 6e3ad0e5b533..b1ab772aff0e 100644 --- a/drivers/scsi/dpt_i2o.c +++ b/drivers/scsi/dpt_i2o.c @@ -718,17 +718,18 @@ static int adpt_device_reset(struct scsi_cmnd* cmd) #define I2O_HBA_BUS_RESET 0x87 // This version of bus reset is called by the eh_error handler -static int adpt_bus_reset(struct scsi_cmnd* cmd) +static int adpt_bus_reset(struct Scsi_Host *shost, int channel) { adpt_hba* pHba; u32 msg[4]; u32 rcode; - pHba = (adpt_hba*)cmd->device->host->hostdata[0]; + pHba = (adpt_hba*)shost->hostdata[0]; memset(msg, 0, sizeof(msg)); - printk(KERN_WARNING"%s: Bus reset: SCSI Bus %d: tid: %d\n",pHba->name, cmd->device->channel,pHba->channel[cmd->device->channel].tid ); + printk(KERN_WARNING"%s: Bus reset: SCSI Bus %d: tid: %d\n", + pHba->name, channel, pHba->channel[channel].tid ); msg[0] = FOUR_WORD_MSG_SIZE|SGL_OFFSET_0; - msg[1] = (I2O_HBA_BUS_RESET<<24|HOST_TID<<12|pHba->channel[cmd->device->channel].tid); + msg[1] = (I2O_HBA_BUS_RESET<<24|HOST_TID<<12|pHba->channel[channel].tid); msg[2] = 0; msg[3] = 0; if (pHba->host) diff --git a/drivers/scsi/dpti.h b/drivers/scsi/dpti.h index b77a3625fa6f..48878e69ab2c 100644 --- a/drivers/scsi/dpti.h +++ b/drivers/scsi/dpti.h @@ -35,7 +35,7 @@ static const char *adpt_info(struct Scsi_Host *pSHost); static int adpt_bios_param(struct scsi_device * sdev, struct block_device *dev, sector_t, int geom[]); -static int adpt_bus_reset(struct scsi_cmnd* cmd); +static int adpt_bus_reset(struct Scsi_Host* shost, int channel); static int adpt_device_reset(struct scsi_cmnd* cmd); diff --git a/drivers/scsi/esas2r/esas2r.h b/drivers/scsi/esas2r/esas2r.h index a104d1a3a9da..5c1eeaffc090 100644 --- a/drivers/scsi/esas2r/esas2r.h +++ b/drivers/scsi/esas2r/esas2r.h @@ -977,7 +977,7 @@ long esas2r_proc_ioctl(struct file *fp, unsigned int cmd, unsigned long arg); int esas2r_eh_abort(struct scsi_cmnd *cmd); int esas2r_device_reset(struct scsi_cmnd *cmd); int esas2r_host_reset(struct Scsi_Host *shost); -int esas2r_bus_reset(struct scsi_cmnd *cmd); +int esas2r_bus_reset(struct Scsi_Host *shost, int channel); int esas2r_target_reset(struct scsi_cmnd *cmd); /* Internal functions */ diff --git a/drivers/scsi/esas2r/esas2r_main.c b/drivers/scsi/esas2r/esas2r_main.c index 52494c8bb656..315b8a61d0d7 100644 --- a/drivers/scsi/esas2r/esas2r_main.c +++ b/drivers/scsi/esas2r/esas2r_main.c @@ -1094,10 +1094,8 @@ int esas2r_host_reset(struct Scsi_Host *shost) return esas2r_host_bus_reset(shost, true); } -int esas2r_bus_reset(struct scsi_cmnd *cmd) +int esas2r_bus_reset(struct Scsi_Host *shost, int channel) { - struct Scsi_Host *shost = cmd->device->host; - esas2r_log(ESAS2R_LOG_INFO, "bus_reset (%p)", shost); return esas2r_host_bus_reset(shost, false); diff --git a/drivers/scsi/esp_scsi.c b/drivers/scsi/esp_scsi.c index b41eac8b5e0f..2fa53100df24 100644 --- a/drivers/scsi/esp_scsi.c +++ b/drivers/scsi/esp_scsi.c @@ -2604,9 +2604,9 @@ static int esp_eh_abort_handler(struct scsi_cmnd *cmd) return FAILED; } -static int esp_eh_bus_reset_handler(struct scsi_cmnd *cmd) +static int esp_eh_bus_reset_handler(struct Scsi_Host *shost, int channel) { - struct esp *esp = shost_priv(cmd->device->host); + struct esp *esp = shost_priv(shost); struct completion eh_reset; unsigned long flags; diff --git a/drivers/scsi/initio.c b/drivers/scsi/initio.c index f585d6e5fab9..adddedfdbcc7 100644 --- a/drivers/scsi/initio.c +++ b/drivers/scsi/initio.c @@ -2625,20 +2625,21 @@ static DEF_SCSI_QCMD(i91u_queuecommand) /** * i91u_bus_reset - reset the SCSI bus - * @cmnd: Command block we want to trigger the reset for + * @shost: SCSI host to be reset + * @channel: Bus number to be reset * * Initiate a SCSI bus reset sequence */ -static int i91u_bus_reset(struct scsi_cmnd * cmnd) +static int i91u_bus_reset(struct Scsi_Host * shost, int channel) { struct initio_host *host; - host = (struct initio_host *) cmnd->device->host->hostdata; + host = (struct initio_host *) shost->hostdata; - spin_lock_irq(cmnd->device->host->host_lock); + spin_lock_irq(shost->host_lock); initio_reset_scsi(host, 0); - spin_unlock_irq(cmnd->device->host->host_lock); + spin_unlock_irq(shost->host_lock); return SUCCESS; } diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c index bd42d3a56590..88fbd01c05d0 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_os.c +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c @@ -3362,39 +3362,46 @@ static int mpi3mr_eh_host_reset(struct Scsi_Host *shost) /** * mpi3mr_eh_bus_reset - Bus reset error handling callback - * @scmd: SCSI command reference + * @shost: SCSI host reference + * @channel: bus number * * Checks whether pending I/Os are present for the RAID volume; * if not there's no need to reset the adapter. * * Return: SUCCESS of successful reset else FAILED */ -static int mpi3mr_eh_bus_reset(struct scsi_cmnd *scmd) +static int mpi3mr_eh_bus_reset(struct Scsi_Host *shost, int channel) { - struct mpi3mr_ioc *mrioc = shost_priv(scmd->device->host); + struct mpi3mr_ioc *mrioc = shost_priv(shost); + struct mpi3mr_tgt_dev *tgtdev; struct mpi3mr_stgt_priv_data *stgt_priv_data; - struct mpi3mr_sdev_priv_data *sdev_priv_data; - u8 dev_type = MPI3_DEVICE_DEVFORM_VD; int retval = FAILED; - sdev_priv_data = scmd->device->hostdata; - if (sdev_priv_data && sdev_priv_data->tgt_priv_data) { - stgt_priv_data = sdev_priv_data->tgt_priv_data; - dev_type = stgt_priv_data->dev_type; + spin_lock(&mrioc->tgtdev_lock); + list_for_each_entry(tgtdev, &mrioc->tgtdev_list, list) { + if (!tgtdev->starget || !tgtdev->starget->hostdata) + continue; + stgt_priv_data = (struct mpi3mr_stgt_priv_data *) + tgtdev->starget->hostdata; + if (stgt_priv_data->dev_type == MPI3_DEVICE_DEVFORM_VD) { + retval = SUCCESS; + break; + } } + spin_unlock(&mrioc->tgtdev_lock); - if (dev_type == MPI3_DEVICE_DEVFORM_VD) { + if (retval == SUCCESS) { mpi3mr_wait_for_host_io(mrioc, MPI3MR_RAID_ERRREC_RESET_TIMEOUT); - if (!mpi3mr_get_fw_pending_ios(mrioc)) - retval = SUCCESS; + if (mpi3mr_get_fw_pending_ios(mrioc)) + retval = FAILED; } if (retval == FAILED) mpi3mr_print_pending_host_io(mrioc); - sdev_printk(KERN_INFO, scmd->device, - "Bus reset is %s for scmd(%p)\n", - ((retval == SUCCESS) ? "SUCCESS" : "FAILED"), scmd); + shost_printk(KERN_INFO, shost, + "Bus reset is %s\n", + ((retval == SUCCESS) ? "SUCCESS" : "FAILED")); return retval; } diff --git a/drivers/scsi/ncr53c8xx.c b/drivers/scsi/ncr53c8xx.c index 4458449c960b..2d4470686a4b 100644 --- a/drivers/scsi/ncr53c8xx.c +++ b/drivers/scsi/ncr53c8xx.c @@ -7936,9 +7936,9 @@ static void ncr53c8xx_timeout(struct timer_list *t) ncr_flush_done_cmds(done_list); } -static int ncr53c8xx_bus_reset(struct scsi_cmnd *cmd) +static int ncr53c8xx_bus_reset(struct Scsi_Host *host, int channel) { - struct ncb *np = ((struct host_data *) cmd->device->host->hostdata)->ncb; + struct ncb *np = ((struct host_data *) host->hostdata)->ncb; int sts; unsigned long flags; struct scsi_cmnd *done_list; diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c index 4aa9737fa711..b1bce76c83b9 100644 --- a/drivers/scsi/pcmcia/nsp_cs.c +++ b/drivers/scsi/pcmcia/nsp_cs.c @@ -1488,11 +1488,11 @@ static int nsp_bus_reset(nsp_hw_data *data) return SUCCESS; } -static int nsp_eh_bus_reset(struct scsi_cmnd *SCpnt) +static int nsp_eh_bus_reset(struct Scsi_Host *host, int channel) { - nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; + nsp_hw_data *data = (nsp_hw_data *)host->hostdata; - nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt); + nsp_dbg(NSP_DEBUG_BUSRESET, "channel=0x%d", channel); return nsp_bus_reset(data); } diff --git a/drivers/scsi/pcmcia/nsp_cs.h b/drivers/scsi/pcmcia/nsp_cs.h index f532adb5f166..8636f0053c02 100644 --- a/drivers/scsi/pcmcia/nsp_cs.h +++ b/drivers/scsi/pcmcia/nsp_cs.h @@ -299,7 +299,7 @@ static int nsp_queuecommand(struct Scsi_Host *h, struct scsi_cmnd *SCpnt); /* Error handler */ /*static int nsp_eh_abort (struct scsi_cmnd *SCpnt);*/ /*static int nsp_eh_device_reset(struct scsi_cmnd *SCpnt);*/ -static int nsp_eh_bus_reset (struct scsi_cmnd *SCpnt); +static int nsp_eh_bus_reset (struct Scsi_Host *host, int channel); static int nsp_eh_host_reset (struct Scsi_Host *host); static int nsp_bus_reset (nsp_hw_data *data); diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c index 79ca737ac75b..14e90807d38c 100644 --- a/drivers/scsi/pmcraid.c +++ b/drivers/scsi/pmcraid.c @@ -3023,9 +3023,8 @@ static int pmcraid_eh_device_reset_handler(struct scsi_cmnd *scmd) RESET_DEVICE_LUN); } -static int pmcraid_eh_bus_reset_handler(struct scsi_cmnd *scmd) +static int pmcraid_eh_bus_reset_handler(struct Scsi_Host *host, int channel) { - struct Scsi_Host *host = scmd->device->host; struct pmcraid_instance *pinstance = (struct pmcraid_instance *)host->hostdata; struct pmcraid_resource_entry *res = NULL; @@ -3039,11 +3038,11 @@ static int pmcraid_eh_bus_reset_handler(struct scsi_cmnd *scmd) */ spin_lock_irqsave(&pinstance->resource_lock, lock_flags); list_for_each_entry(temp, &pinstance->used_res_q, queue) { - if (scmd->device->channel == PMCRAID_VSET_BUS_ID && + if (channel == PMCRAID_VSET_BUS_ID && RES_IS_VSET(temp->cfg_entry)) { res = temp; break; - } else if (scmd->device->channel == PMCRAID_PHYS_BUS_ID && + } else if (channel == PMCRAID_PHYS_BUS_ID && RES_IS_GSCSI(temp->cfg_entry)) { res = temp; break; diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c index cd4c7126c1c9..f32f00c7a390 100644 --- a/drivers/scsi/qla1280.c +++ b/drivers/scsi/qla1280.c @@ -979,13 +979,15 @@ qla1280_eh_device_reset(struct scsi_cmnd *cmd) * Reset the specified bus. **************************************************************************/ static int -qla1280_eh_bus_reset(struct scsi_cmnd *cmd) +qla1280_eh_bus_reset(struct Scsi_Host *shost, int bus) { - int rc; + int rc = FAILED; + struct scsi_qla_host *ha = (struct scsi_qla_host *)shost->hostdata; - spin_lock_irq(cmd->device->host->host_lock); - rc = qla1280_error_action(cmd, BUS_RESET); - spin_unlock_irq(cmd->device->host->host_lock); + spin_lock_irq(shost->host_lock); + if (qla1280_bus_reset(ha, bus) == 0) + rc = qla1280_wait_for_pending_commands(ha, 1, 0); + spin_unlock_irq(shost->host_lock); return rc; } diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 5f86e7bd5a0e..11e7dc22b94d 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -1537,7 +1537,7 @@ qla2xxx_eh_target_reset(struct scsi_cmnd *cmd) * commands. * * Input: -* cmd = Linux SCSI command packet of the command that cause the +* host = Linux SCSI command packet of the command that cause the * bus reset. * * Returns: @@ -1545,12 +1545,10 @@ qla2xxx_eh_target_reset(struct scsi_cmnd *cmd) * **************************************************************************/ static int -qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) +qla2xxx_eh_bus_reset(struct Scsi_Host *shost, int channel) { - scsi_qla_host_t *vha = shost_priv(cmd->device->host); + scsi_qla_host_t *vha = shost_priv(shost); int ret = FAILED; - unsigned int id; - uint64_t lun; struct qla_hw_data *ha = vha->hw; if (qla2x00_isp_reg_stat(ha)) { @@ -1560,14 +1558,11 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) return FAILED; } - id = cmd->device->id; - lun = cmd->device->lun; - if (qla2x00_chip_is_down(vha)) return ret; ql_log(ql_log_info, vha, 0x8012, - "BUS RESET ISSUED nexus=%ld:%d:%llu.\n", vha->host_no, id, lun); + "BUS RESET ISSUED nexus=%ld:%d.\n", vha->host_no, channel); if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) { ql_log(ql_log_fatal, vha, 0x8013, @@ -1591,8 +1586,8 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) eh_bus_reset_done: ql_log(ql_log_warn, vha, 0x802b, - "BUS RESET %s nexus=%ld:%d:%llu.\n", - (ret == FAILED) ? "FAILED" : "SUCCEEDED", vha->host_no, id, lun); + "BUS RESET %s nexus=%ld:%d.\n", + (ret == FAILED) ? "FAILED" : "SUCCEEDED", vha->host_no, channel); return ret; } diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index 6292ac7aef7a..f2d3271bc80b 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c @@ -5324,36 +5324,27 @@ static int scsi_debug_target_reset(struct scsi_cmnd *SCpnt) return SUCCESS; } -static int scsi_debug_bus_reset(struct scsi_cmnd *SCpnt) +static int scsi_debug_bus_reset(struct Scsi_Host * hp, int channel) { - struct sdebug_host_info *sdbg_host; + struct sdebug_host_info *sdbg_host = + *(struct sdebug_host_info **)shost_priv(hp); struct sdebug_dev_info *devip; - struct scsi_device *sdp; - struct Scsi_Host *hp; int k = 0; ++num_bus_resets; - if (!(SCpnt && SCpnt->device)) - goto lie; - sdp = SCpnt->device; if (SDEBUG_OPT_ALL_NOISE & sdebug_opts) - sdev_printk(KERN_INFO, sdp, "%s\n", __func__); - hp = sdp->host; - if (hp) { - sdbg_host = *(struct sdebug_host_info **)shost_priv(hp); - if (sdbg_host) { - list_for_each_entry(devip, - &sdbg_host->dev_info_list, - dev_list) { - set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm); - ++k; - } + shost_printk(KERN_INFO, hp, "%s\n", __func__); + if (sdbg_host) { + list_for_each_entry(devip, + &sdbg_host->dev_info_list, + dev_list) { + set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm); + ++k; } } if (SDEBUG_OPT_RESET_NOISE & sdebug_opts) - sdev_printk(KERN_INFO, sdp, + shost_printk(KERN_INFO, hp, "%s: %d device(s) found in host\n", __func__, k); -lie: return SUCCESS; } diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 747131ca8970..148cab3e61c0 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c @@ -871,7 +871,7 @@ static enum scsi_disposition scsi_try_bus_reset(struct scsi_cmnd *scmd) if (!hostt->eh_bus_reset_handler) return FAILED; - rtn = hostt->eh_bus_reset_handler(scmd); + rtn = hostt->eh_bus_reset_handler(host, scmd_channel(scmd)); if (rtn == SUCCESS) { if (!hostt->skip_settle_delay) diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c index a573baa5bdf2..aef828731995 100644 --- a/drivers/scsi/sym53c8xx_2/sym_glue.c +++ b/drivers/scsi/sym53c8xx_2/sym_glue.c @@ -670,14 +670,13 @@ static int sym53c8xx_eh_target_reset_handler(struct scsi_cmnd *cmd) return SCSI_SUCCESS; } -static int sym53c8xx_eh_bus_reset_handler(struct scsi_cmnd *cmd) +static int sym53c8xx_eh_bus_reset_handler(struct Scsi_Host *shost, int channel) { - struct Scsi_Host *shost = cmd->device->host; struct sym_data *sym_data = shost_priv(shost); struct pci_dev *pdev = sym_data->pdev; struct sym_hcb *np = sym_data->ncb; - scmd_printk(KERN_WARNING, cmd, "BUS RESET operation started\n"); + shost_printk(KERN_WARNING, shost, "BUS RESET operation started\n"); /* * Escalate to host reset if the PCI bus went down @@ -689,7 +688,7 @@ static int sym53c8xx_eh_bus_reset_handler(struct scsi_cmnd *cmd) sym_reset_scsi_bus(np, 1); spin_unlock_irq(shost->host_lock); - dev_warn(&cmd->device->sdev_gendev, "BUS RESET operation complete.\n"); + shost_printk(KERN_WARNING, shost, "BUS RESET operation complete.\n"); return SCSI_SUCCESS; } diff --git a/drivers/scsi/vmw_pvscsi.c b/drivers/scsi/vmw_pvscsi.c index ddf1837babc0..9c62d446ea9e 100644 --- a/drivers/scsi/vmw_pvscsi.c +++ b/drivers/scsi/vmw_pvscsi.c @@ -947,13 +947,12 @@ static int pvscsi_host_reset(struct Scsi_Host *host) return SUCCESS; } -static int pvscsi_bus_reset(struct scsi_cmnd *cmd) +static int pvscsi_bus_reset(struct Scsi_Host *host, int channel) { - struct Scsi_Host *host = cmd->device->host; struct pvscsi_adapter *adapter = shost_priv(host); unsigned long flags; - scmd_printk(KERN_INFO, cmd, "SCSI Bus reset\n"); + shost_printk(KERN_INFO, host, "SCSI Bus reset\n"); /* * We don't want to queue new requests for this bus after diff --git a/drivers/scsi/wd719x.c b/drivers/scsi/wd719x.c index 02b8eb153944..fd297c7517cd 100644 --- a/drivers/scsi/wd719x.c +++ b/drivers/scsi/wd719x.c @@ -484,11 +484,11 @@ static int wd719x_abort(struct scsi_cmnd *cmd) return SUCCESS; } -static int wd719x_reset(struct scsi_cmnd *cmd, u8 opcode, u8 device) +static int wd719x_reset(struct Scsi_Host *shost, u8 opcode, u8 device) { int result; unsigned long flags; - struct wd719x *wd = shost_priv(cmd->device->host); + struct wd719x *wd = shost_priv(shost); struct wd719x_scb *scb, *tmp; dev_info(&wd->pdev->dev, "%s reset requested\n", @@ -512,12 +512,13 @@ static int wd719x_reset(struct scsi_cmnd *cmd, u8 opcode, u8 device) static int wd719x_dev_reset(struct scsi_cmnd *cmd) { - return wd719x_reset(cmd, WD719X_CMD_RESET, cmd->device->id); + return wd719x_reset(cmd->device->host, WD719X_CMD_RESET, + cmd->device->id); } -static int wd719x_bus_reset(struct scsi_cmnd *cmd) +static int wd719x_bus_reset(struct Scsi_Host *host, int channel) { - return wd719x_reset(cmd, WD719X_CMD_BUSRESET, 0); + return wd719x_reset(host, WD719X_CMD_BUSRESET, 0); } static int wd719x_host_reset(struct Scsi_Host *host) diff --git a/drivers/staging/unisys/visorhba/visorhba_main.c b/drivers/staging/unisys/visorhba/visorhba_main.c index 0de0dd09cf9d..28c59218077d 100644 --- a/drivers/staging/unisys/visorhba/visorhba_main.c +++ b/drivers/staging/unisys/visorhba/visorhba_main.c @@ -366,14 +366,15 @@ static int visorhba_device_reset_handler(struct scsi_cmnd *scsicmd) * * Return: SUCCESS if inserted, FAILED otherwise */ -static int visorhba_bus_reset_handler(struct scsi_cmnd *scsicmd) +static int visorhba_bus_reset_handler(struct Scsi_Host *scsihost, int channel) { struct scsi_device *scsidev; struct visordisk_info *vdisk; int rtn; - scsidev = scsicmd->device; - shost_for_each_device(scsidev, scsidev->host) { + shost_for_each_device(scsidev, scsihost) { + if (scsidev->channel != channel) + continue; vdisk = scsidev->hostdata; if (atomic_read(&vdisk->error_count) < VISORHBA_ERROR_COUNT) atomic_inc(&vdisk->error_count); diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c index 8931df5a85fd..17dabfba6b2b 100644 --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c @@ -464,9 +464,9 @@ static int device_reset(struct scsi_cmnd *srb) } /* Simulate a SCSI bus reset by resetting the device's USB port. */ -static int bus_reset(struct scsi_cmnd *srb) +static int bus_reset(struct Scsi_Host *shost, int channel) { - struct us_data *us = host_to_us(srb->device->host); + struct us_data *us = host_to_us(shost); int result; usb_stor_dbg(us, "%s called\n", __func__); diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index 3b8d9e65ea57..73c9971e7334 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h @@ -140,7 +140,7 @@ struct scsi_host_template { int (* eh_abort_handler)(struct scsi_cmnd *); int (* eh_device_reset_handler)(struct scsi_cmnd *); int (* eh_target_reset_handler)(struct scsi_cmnd *); - int (* eh_bus_reset_handler)(struct scsi_cmnd *); + int (* eh_bus_reset_handler)(struct Scsi_Host *, int); int (* eh_host_reset_handler)(struct Scsi_Host *); /*
The bus reset should not depend on any command, but rather only use the SCSI Host and the channel/bus number as argument. Signed-off-by: Hannes Reinecke <hare@suse.com> --- Documentation/scsi/scsi_eh.rst | 2 +- Documentation/scsi/scsi_mid_low_api.rst | 5 ++- drivers/message/fusion/mptfc.c | 13 +++---- drivers/message/fusion/mptscsih.c | 21 ++++------- drivers/message/fusion/mptscsih.h | 2 +- drivers/scsi/a100u2w.c | 4 +- drivers/scsi/aacraid/linit.c | 11 +++--- drivers/scsi/aha152x.c | 4 +- drivers/scsi/aha1542.c | 4 +- drivers/scsi/aic7xxx/aic79xx_osm.c | 10 ++--- drivers/scsi/aic7xxx/aic7xxx_osm.c | 6 +-- drivers/scsi/arcmsr/arcmsr_hba.c | 6 +-- drivers/scsi/arm/fas216.c | 9 +++-- drivers/scsi/arm/fas216.h | 5 ++- drivers/scsi/dc395x.c | 25 ++++++------- drivers/scsi/dpt_i2o.c | 9 +++-- drivers/scsi/dpti.h | 2 +- drivers/scsi/esas2r/esas2r.h | 2 +- drivers/scsi/esas2r/esas2r_main.c | 4 +- drivers/scsi/esp_scsi.c | 4 +- drivers/scsi/initio.c | 11 +++--- drivers/scsi/mpi3mr/mpi3mr_os.c | 37 +++++++++++-------- drivers/scsi/ncr53c8xx.c | 4 +- drivers/scsi/pcmcia/nsp_cs.c | 6 +-- drivers/scsi/pcmcia/nsp_cs.h | 2 +- drivers/scsi/pmcraid.c | 7 ++-- drivers/scsi/qla1280.c | 12 +++--- drivers/scsi/qla2xxx/qla_os.c | 17 +++------ drivers/scsi/scsi_debug.c | 31 ++++++---------- drivers/scsi/scsi_error.c | 2 +- drivers/scsi/sym53c8xx_2/sym_glue.c | 7 ++-- drivers/scsi/vmw_pvscsi.c | 5 +-- drivers/scsi/wd719x.c | 11 +++--- .../staging/unisys/visorhba/visorhba_main.c | 7 ++-- drivers/usb/storage/scsiglue.c | 4 +- include/scsi/scsi_host.h | 2 +- 36 files changed, 150 insertions(+), 163 deletions(-)