lpfc: Fix host reset escalation killing all IOs.
Subsystems (2)
PATCH 6/21 lpfc: Fix host reset escalation killing all IOs.
--- drivers/scsi/lpfc/lpfc_crtn.h | 1 + drivers/scsi/lpfc/lpfc_init.c | 11 ++++++++--- drivers/scsi/lpfc/lpfc_scsi.c | 25 +++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 3 deletions(-)
drivers/scsi/lpfc/lpfc_crtn.h +1 -0
@@ -354,6 +354,7 @@ void lpfc_free_sysfs_attr(struct lpfc_vport *);extern struct device_attribute *lpfc_hba_attrs[];extern struct device_attribute *lpfc_vport_attrs[];extern struct scsi_host_template lpfc_template; +extern struct scsi_host_template lpfc_template_s3;extern struct scsi_host_template lpfc_vport_template;extern struct fc_function_template lpfc_transport_functions;extern struct fc_function_template lpfc_vport_transport_functions;
drivers/scsi/lpfc/lpfc_init.c +8 -3
@@ -3257,12 +3257,17 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)struct Scsi_Host *shost;int error =0 ; -if (dev != &phba->pcidev->dev) +if (dev != &phba->pcidev->dev) { shost =scsi_host_alloc (&lpfc_vport_template,sizeof (struct lpfc_vport )); -else - shost =scsi_host_alloc (&lpfc_template, + }else { +if (phba->sli_rev ==LPFC_SLI_REV4 ) + shost =scsi_host_alloc (&lpfc_template,sizeof (struct lpfc_vport )); +else + shost =scsi_host_alloc (&lpfc_template_s3, +sizeof (struct lpfc_vport )); + }if (!shost) goto out;
drivers/scsi/lpfc/lpfc_scsi.c +25 -0
@@ -5857,6 +5857,31 @@ lpfc_disable_oas_lun(struct lpfc_hba *phba, struct lpfc_name *vport_wwpn,return false; } +struct scsi_host_template lpfc_template_s3 = { + .module =THIS_MODULE , + .name =LPFC_DRIVER_NAME , + .info = lpfc_info, + .queuecommand = lpfc_queuecommand, + .eh_abort_handler = lpfc_abort_handler, + .eh_device_reset_handler = lpfc_device_reset_handler, + .eh_target_reset_handler = lpfc_target_reset_handler, + .eh_bus_reset_handler = lpfc_bus_reset_handler, + .slave_alloc = lpfc_slave_alloc, + .slave_configure = lpfc_slave_configure, + .slave_destroy = lpfc_slave_destroy, + .scan_finished = lpfc_scan_finished, + .this_id =-1 , + .sg_tablesize =LPFC_DEFAULT_SG_SEG_CNT , + .cmd_per_lun =LPFC_CMD_PER_LUN , + .use_clustering =ENABLE_CLUSTERING , + .shost_attrs = lpfc_hba_attrs, + .max_sectors =0xFFFF , + .vendor_id =LPFC_NL_VENDOR_ID , + .change_queue_depth = scsi_change_queue_depth, + .use_blk_tags =1 , + .track_queue_depth =1 , +}; +struct scsi_host_template lpfc_template = { .module =THIS_MODULE , .name =LPFC_DRIVER_NAME ,
Signature · 4 lines
1.7.11.7 Signed-off-by: James Smart <[email protected]> Signed-off-by: Dick Kennedy <[email protected]>
James Bottomley
maintainerQuoted 1 line · James Smart
---
This one really requires more than a one-line explanation because the one liner doesn't really describe what you've done.
It looks like the description should be:
Only the SLI rev 4 card has a host reset capability, so only activate it in the host template for that card.
Which leads me to two questions:
1. Is the if condition the right way around? It seems from the previous code that SLI rev < 4 do support a host reset handler. At the very least, if the if clause is correct, explain how it relates to 27b01b8 [SCSI] lpfc 8.3.31: Fixed system crash due to not providing SCSI error-handling host reset handler.
2. Is this only a problem of SLI rev 4, so == is justified, or should it be 4 and above?
James