|
@@ -2190,10 +2190,12 @@ static int ibmvfc_cancel_all(struct scsi_device *sdev, int type)
|
|
|
tmf->common.length = sizeof(*tmf);
|
|
|
tmf->scsi_id = rport->port_id;
|
|
|
int_to_scsilun(sdev->lun, &tmf->lun);
|
|
|
+ if (!(vhost->login_buf->resp.capabilities & IBMVFC_CAN_SUPPRESS_ABTS))
|
|
|
+ type &= ~IBMVFC_TMF_SUPPRESS_ABTS;
|
|
|
if (vhost->state == IBMVFC_ACTIVE)
|
|
|
tmf->flags = (type | IBMVFC_TMF_LUA_VALID);
|
|
|
else
|
|
|
- tmf->flags = IBMVFC_TMF_LUA_VALID;
|
|
|
+ tmf->flags = ((type & IBMVFC_TMF_SUPPRESS_ABTS) | IBMVFC_TMF_LUA_VALID);
|
|
|
tmf->cancel_key = (unsigned long)sdev->hostdata;
|
|
|
tmf->my_cancel_key = (unsigned long)starget->hostdata;
|
|
|
|
|
@@ -2402,7 +2404,7 @@ static int ibmvfc_eh_abort_handler(struct scsi_cmnd *cmd)
|
|
|
cancel_rc = ibmvfc_cancel_all(sdev, IBMVFC_TMF_ABORT_TASK_SET);
|
|
|
ibmvfc_abort_task_set(sdev);
|
|
|
} else
|
|
|
- cancel_rc = ibmvfc_cancel_all(sdev, 0);
|
|
|
+ cancel_rc = ibmvfc_cancel_all(sdev, IBMVFC_TMF_SUPPRESS_ABTS);
|
|
|
|
|
|
if (!cancel_rc)
|
|
|
rc = ibmvfc_wait_for_ops(vhost, sdev, ibmvfc_match_lun);
|
|
@@ -2435,7 +2437,7 @@ static int ibmvfc_eh_device_reset_handler(struct scsi_cmnd *cmd)
|
|
|
cancel_rc = ibmvfc_cancel_all(sdev, IBMVFC_TMF_LUN_RESET);
|
|
|
reset_rc = ibmvfc_reset_device(sdev, IBMVFC_LUN_RESET, "LUN");
|
|
|
} else
|
|
|
- cancel_rc = ibmvfc_cancel_all(sdev, 0);
|
|
|
+ cancel_rc = ibmvfc_cancel_all(sdev, IBMVFC_TMF_SUPPRESS_ABTS);
|
|
|
|
|
|
if (!cancel_rc && !reset_rc)
|
|
|
rc = ibmvfc_wait_for_ops(vhost, sdev, ibmvfc_match_lun);
|
|
@@ -2456,7 +2458,7 @@ static int ibmvfc_eh_device_reset_handler(struct scsi_cmnd *cmd)
|
|
|
static void ibmvfc_dev_cancel_all_noreset(struct scsi_device *sdev, void *data)
|
|
|
{
|
|
|
unsigned long *rc = data;
|
|
|
- *rc |= ibmvfc_cancel_all(sdev, 0);
|
|
|
+ *rc |= ibmvfc_cancel_all(sdev, IBMVFC_TMF_SUPPRESS_ABTS);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -2547,8 +2549,7 @@ static void ibmvfc_terminate_rport_io(struct fc_rport *rport)
|
|
|
dev_rport = starget_to_rport(scsi_target(sdev));
|
|
|
if (dev_rport != rport)
|
|
|
continue;
|
|
|
- ibmvfc_cancel_all(sdev, IBMVFC_TMF_ABORT_TASK_SET);
|
|
|
- ibmvfc_abort_task_set(sdev);
|
|
|
+ ibmvfc_cancel_all(sdev, IBMVFC_TMF_SUPPRESS_ABTS);
|
|
|
}
|
|
|
|
|
|
rc = ibmvfc_wait_for_ops(vhost, rport, ibmvfc_match_rport);
|