lpfc 8.3.0 : Fix system crash due to uninitialized node access
Subsystems (2)
PATCH 4/14 lpfc 8.3.0 : Fix system crash due to uninitialized node access
lpfc 8.3.0 : Fix system crash due to uninitialized node access
In the IOCB completion handler, always check if the node is valid before accessing the node object. Added lpfc_initialize_node() to initialize nodes.
Signed-off-by James Smart <[email protected]>
---
drivers/scsi/lpfc/lpfc_hbadisc.c | 52 +++++++++++++++++++++----------------- drivers/scsi/lpfc/lpfc_scsi.c | 44 ++++++++++++++++++++------------ 2 files changed, 56 insertions(+), 40 deletions(-)
drivers/scsi/lpfc/lpfc_hbadisc.c +29 -23
@@ -1857,6 +1857,32 @@ lpfc_disable_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)lpfc_nlp_state_cleanup (vport, ndlp, ndlp->nlp_state,NLP_STE_UNUSED_NODE ); } +/** +* lpfc_initialize_node: Initialize all fields of node object. +* @vport: Pointer to Virtual Port object. +* @ndlp: Pointer to FC node object. +* @did: FC_ID of the node. +* This function is always called when node object need to +* be initialized. It initializes all the fields of the node +* object. +**/ +static inline void +lpfc_initialize_node (struct lpfc_vport *vport,struct lpfc_nodelist *ndlp, +uint32_t did) +{ +INIT_LIST_HEAD (&ndlp->els_retry_evt.evt_listp); +INIT_LIST_HEAD (&ndlp->dev_loss_evt.evt_listp); +init_timer (&ndlp->nlp_delayfunc); + ndlp->nlp_delayfunc.function = lpfc_els_retry_delay; + ndlp->nlp_delayfunc.data = (unsigned long )ndlp; + ndlp->nlp_DID = did; + ndlp->vport = vport; + ndlp->nlp_sid =NLP_NO_SID ; +kref_init (&ndlp->kref); +NLP_INT_NODE_ACT (ndlp); +atomic_set (&ndlp->cmd_pending,0 ); + ndlp->cmd_qdepth =LPFC_MAX_TGT_QDEPTH ; +}struct lpfc_nodelist * lpfc_enable_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
@@ -1897,17 +1923,7 @@ lpfc_enable_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,/* re-initialize ndlp except of ndlp linked list pointer */ memset ((((char *)ndlp) +sizeof (struct list_head )),0 ,sizeof (struct lpfc_nodelist ) -sizeof (struct list_head )); -INIT_LIST_HEAD (&ndlp->els_retry_evt.evt_listp); -INIT_LIST_HEAD (&ndlp->dev_loss_evt.evt_listp); -init_timer (&ndlp->nlp_delayfunc); - ndlp->nlp_delayfunc.function = lpfc_els_retry_delay; - ndlp->nlp_delayfunc.data = (unsigned long )ndlp; - ndlp->nlp_DID = did; - ndlp->vport = vport; - ndlp->nlp_sid =NLP_NO_SID ; -/* ndlp management re-initialize */ -kref_init (&ndlp->kref); -NLP_INT_NODE_ACT (ndlp); +lpfc_initialize_node (vport, ndlp, did);spin_unlock_irqrestore (&phba->ndlp_lock, flags);
@@ -3121,19 +3137,9 @@ lpfc_nlp_init(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, uint32_t did) {memset (ndlp,0 ,sizeof (struct lpfc_nodelist )); -INIT_LIST_HEAD (&ndlp->els_retry_evt.evt_listp); -INIT_LIST_HEAD (&ndlp->dev_loss_evt.evt_listp); -init_timer (&ndlp->nlp_delayfunc); - ndlp->nlp_delayfunc.function = lpfc_els_retry_delay; - ndlp->nlp_delayfunc.data = (unsigned long )ndlp; - ndlp->nlp_DID = did; - ndlp->vport = vport; - ndlp->nlp_sid =NLP_NO_SID ; + +lpfc_initialize_node (vport, ndlp, did);INIT_LIST_HEAD (&ndlp->nlp_listp); -kref_init (&ndlp->kref); -NLP_INT_NODE_ACT (ndlp); -atomic_set (&ndlp->cmd_pending,0 ); - ndlp->cmd_qdepth =LPFC_MAX_TGT_QDEPTH ; lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_NODE, "node init: did:x%x",
drivers/scsi/lpfc/lpfc_scsi.c +27 -17
64 lines not on this page · raw message