int ptlrpc_connection_put(struct ptlrpc_connection *conn) { int rc = 0; ENTRY; if (!conn) RETURN(rc); LASSERT(!cfs_hlist_unhashed(&conn->c_hash)); /* * We do not remove connection from hashtable and * do not free it even if last caller released ref, * as we want to have it cached for the case it is * needed again. * * Deallocating it and later creating new connection * again would be wastful. This way we also avoid * expensive locking to protect things from get/put * race when found cached connection is freed by * ptlrpc_connection_put(). * * It will be freed later in module unload time, * when ptlrpc_connection_fini()->lh_exit->conn_exit() * path is called. */ if (cfs_atomic_dec_return(&conn->c_refcount) == 1) rc = 1; CDEBUG(D_INFO, "PUT conn=%p refcount %d to %s\n", conn, cfs_atomic_read(&conn->c_refcount), libcfs_nid2str(conn->c_peer.nid)); RETURN(rc); }
int lov_free_memmd(struct lov_stripe_md **lsmp) { struct lov_stripe_md *lsm = *lsmp; int refc; *lsmp = NULL; LASSERT(cfs_atomic_read(&lsm->lsm_refc) > 0); if ((refc = cfs_atomic_dec_return(&lsm->lsm_refc)) == 0) { LASSERT(lsm_op_find(lsm->lsm_magic) != NULL); lsm_op_find(lsm->lsm_magic)->lsm_free(lsm); } return refc; }