|
@@ -59,6 +59,8 @@ static char *dif_op_str[] = {
|
|
|
};
|
|
|
static void
|
|
|
lpfc_release_scsi_buf_s4(struct lpfc_hba *phba, struct lpfc_scsi_buf *psb);
|
|
|
+static void
|
|
|
+lpfc_release_scsi_buf_s3(struct lpfc_hba *phba, struct lpfc_scsi_buf *psb);
|
|
|
|
|
|
static void
|
|
|
lpfc_debug_save_data(struct lpfc_hba *phba, struct scsi_cmnd *cmnd)
|
|
@@ -596,7 +598,7 @@ lpfc_new_scsi_buf_s3(struct lpfc_vport *vport, int num_to_alloc)
|
|
|
iocb->ulpClass = CLASS3;
|
|
|
psb->status = IOSTAT_SUCCESS;
|
|
|
/* Put it back into the SCSI buffer list */
|
|
|
- lpfc_release_scsi_buf_s4(phba, psb);
|
|
|
+ lpfc_release_scsi_buf_s3(phba, psb);
|
|
|
|
|
|
}
|
|
|
|
|
@@ -2766,7 +2768,7 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *))
|
|
|
struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
|
|
|
struct lpfc_hba *phba = vport->phba;
|
|
|
struct lpfc_rport_data *rdata = cmnd->device->hostdata;
|
|
|
- struct lpfc_nodelist *ndlp = rdata->pnode;
|
|
|
+ struct lpfc_nodelist *ndlp;
|
|
|
struct lpfc_scsi_buf *lpfc_cmd;
|
|
|
struct fc_rport *rport = starget_to_rport(scsi_target(cmnd->device));
|
|
|
int err;
|
|
@@ -2776,6 +2778,7 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *))
|
|
|
cmnd->result = err;
|
|
|
goto out_fail_command;
|
|
|
}
|
|
|
+ ndlp = rdata->pnode;
|
|
|
|
|
|
if (!(phba->sli3_options & LPFC_SLI3_BG_ENABLED) &&
|
|
|
scsi_get_prot_op(cmnd) != SCSI_PROT_NORMAL) {
|
|
@@ -3154,9 +3157,15 @@ static int
|
|
|
lpfc_chk_tgt_mapped(struct lpfc_vport *vport, struct scsi_cmnd *cmnd)
|
|
|
{
|
|
|
struct lpfc_rport_data *rdata = cmnd->device->hostdata;
|
|
|
- struct lpfc_nodelist *pnode = rdata->pnode;
|
|
|
+ struct lpfc_nodelist *pnode;
|
|
|
unsigned long later;
|
|
|
|
|
|
+ if (!rdata) {
|
|
|
+ lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP,
|
|
|
+ "0797 Tgt Map rport failure: rdata x%p\n", rdata);
|
|
|
+ return FAILED;
|
|
|
+ }
|
|
|
+ pnode = rdata->pnode;
|
|
|
/*
|
|
|
* If target is not in a MAPPED state, delay until
|
|
|
* target is rediscovered or devloss timeout expires.
|
|
@@ -3241,12 +3250,18 @@ lpfc_device_reset_handler(struct scsi_cmnd *cmnd)
|
|
|
struct Scsi_Host *shost = cmnd->device->host;
|
|
|
struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
|
|
|
struct lpfc_rport_data *rdata = cmnd->device->hostdata;
|
|
|
- struct lpfc_nodelist *pnode = rdata->pnode;
|
|
|
+ struct lpfc_nodelist *pnode;
|
|
|
unsigned tgt_id = cmnd->device->id;
|
|
|
unsigned int lun_id = cmnd->device->lun;
|
|
|
struct lpfc_scsi_event_header scsi_event;
|
|
|
int status;
|
|
|
|
|
|
+ if (!rdata) {
|
|
|
+ lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
|
|
|
+ "0798 Device Reset rport failure: rdata x%p\n", rdata);
|
|
|
+ return FAILED;
|
|
|
+ }
|
|
|
+ pnode = rdata->pnode;
|
|
|
fc_block_scsi_eh(cmnd);
|
|
|
|
|
|
status = lpfc_chk_tgt_mapped(vport, cmnd);
|
|
@@ -3300,12 +3315,18 @@ lpfc_target_reset_handler(struct scsi_cmnd *cmnd)
|
|
|
struct Scsi_Host *shost = cmnd->device->host;
|
|
|
struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
|
|
|
struct lpfc_rport_data *rdata = cmnd->device->hostdata;
|
|
|
- struct lpfc_nodelist *pnode = rdata->pnode;
|
|
|
+ struct lpfc_nodelist *pnode;
|
|
|
unsigned tgt_id = cmnd->device->id;
|
|
|
unsigned int lun_id = cmnd->device->lun;
|
|
|
struct lpfc_scsi_event_header scsi_event;
|
|
|
int status;
|
|
|
|
|
|
+ if (!rdata) {
|
|
|
+ lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
|
|
|
+ "0799 Target Reset rport failure: rdata x%p\n", rdata);
|
|
|
+ return FAILED;
|
|
|
+ }
|
|
|
+ pnode = rdata->pnode;
|
|
|
fc_block_scsi_eh(cmnd);
|
|
|
|
|
|
status = lpfc_chk_tgt_mapped(vport, cmnd);
|
|
@@ -3486,6 +3507,8 @@ lpfc_slave_alloc(struct scsi_device *sdev)
|
|
|
"Allocated %d buffers.\n",
|
|
|
num_to_alloc, num_allocated);
|
|
|
}
|
|
|
+ if (num_allocated > 0)
|
|
|
+ phba->total_scsi_bufs += num_allocated;
|
|
|
return 0;
|
|
|
}
|
|
|
|