mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
scsi: message: fusion: Simplify mptfc_block_error_handler()
Instead of passing in a function to mptfc_block_error_handler() we can as well return a status and call the function afterwards. Signed-off-by: Hannes Reinecke <hare@suse.de> Link: https://lore.kernel.org/r/20231002154328.43718-2-hare@suse.de Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
0bb80ecc33
commit
d9987d4b96
@ -183,73 +183,98 @@ static struct fc_function_template mptfc_transport_functions = {
|
||||
};
|
||||
|
||||
static int
|
||||
mptfc_block_error_handler(struct scsi_cmnd *SCpnt,
|
||||
int (*func)(struct scsi_cmnd *SCpnt),
|
||||
const char *caller)
|
||||
mptfc_block_error_handler(struct fc_rport *rport)
|
||||
{
|
||||
MPT_SCSI_HOST *hd;
|
||||
struct scsi_device *sdev = SCpnt->device;
|
||||
struct Scsi_Host *shost = sdev->host;
|
||||
struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
|
||||
struct Scsi_Host *shost = rport_to_shost(rport);
|
||||
unsigned long flags;
|
||||
int ready;
|
||||
MPT_ADAPTER *ioc;
|
||||
MPT_ADAPTER *ioc;
|
||||
int loops = 40; /* seconds */
|
||||
|
||||
hd = shost_priv(SCpnt->device->host);
|
||||
hd = shost_priv(shost);
|
||||
ioc = hd->ioc;
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
while ((ready = fc_remote_port_chkready(rport) >> 16) == DID_IMM_RETRY
|
||||
|| (loops > 0 && ioc->active == 0)) {
|
||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||
dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"mptfc_block_error_handler.%d: %d:%llu, port status is "
|
||||
"%x, active flag %d, deferring %s recovery.\n",
|
||||
"mptfc_block_error_handler.%d: %s, port status is "
|
||||
"%x, active flag %d, deferring recovery.\n",
|
||||
ioc->name, ioc->sh->host_no,
|
||||
SCpnt->device->id, SCpnt->device->lun,
|
||||
ready, ioc->active, caller));
|
||||
dev_name(&rport->dev), ready, ioc->active));
|
||||
msleep(1000);
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
loops --;
|
||||
}
|
||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||
|
||||
if (ready == DID_NO_CONNECT || !SCpnt->device->hostdata
|
||||
|| ioc->active == 0) {
|
||||
if (ready == DID_NO_CONNECT || ioc->active == 0) {
|
||||
dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"%s.%d: %d:%llu, failing recovery, "
|
||||
"port state %x, active %d, vdevice %p.\n", caller,
|
||||
"mpt_block_error_handler.%d: %s, failing recovery, "
|
||||
"port state %x, active %d.\n",
|
||||
ioc->name, ioc->sh->host_no,
|
||||
SCpnt->device->id, SCpnt->device->lun, ready,
|
||||
ioc->active, SCpnt->device->hostdata));
|
||||
dev_name(&rport->dev), ready, ioc->active));
|
||||
return FAILED;
|
||||
}
|
||||
dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"%s.%d: %d:%llu, executing recovery.\n", caller,
|
||||
ioc->name, ioc->sh->host_no,
|
||||
SCpnt->device->id, SCpnt->device->lun));
|
||||
return (*func)(SCpnt);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
static int
|
||||
mptfc_abort(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
return
|
||||
mptfc_block_error_handler(SCpnt, mptscsih_abort, __func__);
|
||||
struct Scsi_Host *shost = SCpnt->device->host;
|
||||
struct fc_rport *rport = starget_to_rport(scsi_target(SCpnt->device));
|
||||
MPT_SCSI_HOST __maybe_unused *hd = shost_priv(shost);
|
||||
int rtn;
|
||||
|
||||
rtn = mptfc_block_error_handler(rport);
|
||||
if (rtn == SUCCESS) {
|
||||
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_abort(SCpnt);
|
||||
}
|
||||
return rtn;
|
||||
}
|
||||
|
||||
static int
|
||||
mptfc_dev_reset(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
return
|
||||
mptfc_block_error_handler(SCpnt, mptscsih_dev_reset, __func__);
|
||||
struct Scsi_Host *shost = SCpnt->device->host;
|
||||
struct fc_rport *rport = starget_to_rport(scsi_target(SCpnt->device));
|
||||
MPT_SCSI_HOST __maybe_unused *hd = shost_priv(shost);
|
||||
int rtn;
|
||||
|
||||
rtn = mptfc_block_error_handler(rport);
|
||||
if (rtn == SUCCESS) {
|
||||
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_dev_reset(SCpnt);
|
||||
}
|
||||
return rtn;
|
||||
}
|
||||
|
||||
static int
|
||||
mptfc_bus_reset(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
return
|
||||
mptfc_block_error_handler(SCpnt, mptscsih_bus_reset, __func__);
|
||||
struct Scsi_Host *shost = SCpnt->device->host;
|
||||
struct fc_rport *rport = starget_to_rport(scsi_target(SCpnt->device));
|
||||
MPT_SCSI_HOST __maybe_unused *hd = shost_priv(shost);
|
||||
int rtn;
|
||||
|
||||
rtn = mptfc_block_error_handler(rport);
|
||||
if (rtn == SUCCESS) {
|
||||
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);
|
||||
}
|
||||
return rtn;
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user