******************************************************************************
*/
+/**
+ * Free Fibre Channel upper-layer protocol
+ *
+ * @v refcnt Reference count
+ */
+static void fc_ulp_free ( struct refcnt *refcnt ) {
+ struct fc_ulp *ulp = container_of ( refcnt, struct fc_ulp, refcnt );
+
+ fc_peer_put ( ulp->peer );
+ free ( ulp );
+}
+
/**
* Close Fibre Channel upper-layer protocol
*
/* Remove from list of ULPs */
list_del ( &ulp->list );
INIT_LIST_HEAD ( &ulp->list );
-
- /* Drop peer reference */
- fc_peer_put ( ulp->peer );
- ulp->peer = NULL;
}
/**
* @v ulp Fibre Channel ulp
*/
void fc_ulp_decrement ( struct fc_ulp *ulp ) {
- struct fc_peer *peer = ulp->peer;
/* Sanity check */
assert ( ulp->usage > 0 );
fc_ulp_logout ( ulp, 0 );
/* Decrement our peer's usage count */
- fc_peer_decrement ( peer );
+ fc_peer_decrement ( ulp->peer );
}
/**
ulp = zalloc ( sizeof ( *ulp ) );
if ( ! ulp )
return NULL;
- ref_init ( &ulp->refcnt, NULL );
+ ref_init ( &ulp->refcnt, fc_ulp_free );
fc_link_init ( &ulp->link, fc_ulp_examine, &ulp->refcnt );
intf_init ( &ulp->prli, &fc_ulp_prli_desc, &ulp->refcnt );
ulp->peer = fc_peer_get ( peer );