david/ipxe
Archived
1
0

[fc] Hold reference to peers and ULPs while calling fc_link_examine()

Allow link examination methods to safely assume that their
self-reference remains valid for the duration of the method call.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2010-11-04 03:28:29 +00:00
parent 00cffae5f9
commit c09f87e3b7

View File

@ -982,8 +982,11 @@ int fc_port_login ( struct fc_port *port, struct fc_port_id *port_id,
fc_link_up ( &port->link ); fc_link_up ( &port->link );
/* Notify peers of link state change */ /* Notify peers of link state change */
list_for_each_entry_safe ( peer, tmp, &fc_peers, list ) list_for_each_entry_safe ( peer, tmp, &fc_peers, list ) {
fc_peer_get ( peer );
fc_link_examine ( &peer->link ); fc_link_examine ( &peer->link );
fc_peer_put ( peer );
}
return 0; return 0;
} }
@ -1008,8 +1011,11 @@ void fc_port_logout ( struct fc_port *port, int rc ) {
fc_link_err ( &port->link, rc ); fc_link_err ( &port->link, rc );
/* Notify peers of link state change */ /* Notify peers of link state change */
list_for_each_entry_safe ( peer, tmp, &fc_peers, list ) list_for_each_entry_safe ( peer, tmp, &fc_peers, list ) {
fc_peer_get ( peer );
fc_link_examine ( &peer->link ); fc_link_examine ( &peer->link );
fc_peer_put ( peer );
}
} }
/** /**
@ -1274,8 +1280,11 @@ int fc_peer_login ( struct fc_peer *peer, struct fc_port *port,
fc_link_up ( &peer->link ); fc_link_up ( &peer->link );
/* Notify ULPs of link state change */ /* Notify ULPs of link state change */
list_for_each_entry_safe ( ulp, tmp, &peer->ulps, list ) list_for_each_entry_safe ( ulp, tmp, &peer->ulps, list ) {
fc_ulp_get ( ulp );
fc_link_examine ( &ulp->link ); fc_link_examine ( &ulp->link );
fc_ulp_put ( ulp );
}
return 0; return 0;
} }
@ -1305,8 +1314,11 @@ void fc_peer_logout ( struct fc_peer *peer, int rc ) {
fc_link_err ( &peer->link, rc ); fc_link_err ( &peer->link, rc );
/* Notify ULPs of link state change */ /* Notify ULPs of link state change */
list_for_each_entry_safe ( ulp, tmp, &peer->ulps, list ) list_for_each_entry_safe ( ulp, tmp, &peer->ulps, list ) {
fc_ulp_get ( ulp );
fc_link_examine ( &ulp->link ); fc_link_examine ( &ulp->link );
fc_ulp_put ( ulp );
}
/* Close peer if there are no active users */ /* Close peer if there are no active users */
if ( peer->usage == 0 ) if ( peer->usage == 0 )