Commit d9987d4b authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Martin K. Petersen
Browse files

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: default avatarHannes Reinecke <hare@suse.de>
Link: https://lore.kernel.org/r/20231002154328.43718-2-hare@suse.de


Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 0bb80ecc
Loading
Loading
Loading
Loading
+54 −29
Original line number Diff line number Diff line
@@ -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;
	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