X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Fptlrpc%2Fconnection.c;h=9e19704276571f394cb0f83a7d39941336a12fce;hb=3c5bcaee9d357d312140be8fb3974dac89207b7b;hp=0307ecb9b1f562929004db5077f1bb94611e57d5;hpb=d0587baa07fc8ed8769319b6e96f509c82d4a5c3;p=fs%2Flustre-release.git diff --git a/lustre/ptlrpc/connection.c b/lustre/ptlrpc/connection.c index 0307ecb..9e19704 100644 --- a/lustre/ptlrpc/connection.c +++ b/lustre/ptlrpc/connection.c @@ -21,41 +21,54 @@ */ #define DEBUG_SUBSYSTEM S_RPC - +#ifdef __KERNEL__ #include +#include #include +#else +#include +#endif + +#include "ptlrpc_internal.h" static spinlock_t conn_lock; static struct list_head conn_list; static struct list_head conn_unused_list; -/* If UUID is NULL, c->c_remote_uuid must be all zeroes - * If UUID is non-NULL, c->c_remote_uuid must match. */ -static int match_connection_uuid(struct ptlrpc_connection *c, obd_uuid_t uuid) +void ptlrpc_dump_connections(void) { - obd_uuid_t zero_uuid = {0}; - - if (uuid) - return memcmp(c->c_remote_uuid, uuid, sizeof(uuid)); + char str[PTL_NALFMT_SIZE]; + struct list_head *tmp; + struct ptlrpc_connection *c; + ENTRY; - return memcmp(c->c_remote_uuid, zero_uuid, sizeof(zero_uuid)); + list_for_each(tmp, &conn_list) { + c = list_entry(tmp, struct ptlrpc_connection, c_link); + CERROR("Connection %p/%s has refcount %d (nid=%s on %s)\n", + c, c->c_remote_uuid.uuid, atomic_read(&c->c_refcount), + ptlrpc_peernid2str(&c->c_peer, str), + c->c_peer.peer_ni->pni_name); + } + EXIT; } -struct ptlrpc_connection *ptlrpc_get_connection(struct lustre_peer *peer, - obd_uuid_t uuid) +struct ptlrpc_connection *ptlrpc_get_connection(struct ptlrpc_peer *peer, + struct obd_uuid *uuid) { + char str[PTL_NALFMT_SIZE]; struct list_head *tmp, *pos; struct ptlrpc_connection *c; ENTRY; - CDEBUG(D_INFO, "peer is %08x %08lx %08lx\n", - peer->peer_nid, peer->peer_ni.nal_idx, peer->peer_ni.handle_idx); + + CDEBUG(D_INFO, "peer is %s on %s\n", + ptlrpc_id2str(peer, str), peer->peer_ni->pni_name); spin_lock(&conn_lock); list_for_each(tmp, &conn_list) { c = list_entry(tmp, struct ptlrpc_connection, c_link); if (memcmp(peer, &c->c_peer, sizeof(*peer)) == 0 && - !match_connection_uuid(c, uuid)) { + peer->peer_ni == c->c_peer.peer_ni) { ptlrpc_connection_addref(c); GOTO(out, c); } @@ -64,7 +77,7 @@ struct ptlrpc_connection *ptlrpc_get_connection(struct lustre_peer *peer, list_for_each_safe(tmp, pos, &conn_unused_list) { c = list_entry(tmp, struct ptlrpc_connection, c_link); if (memcmp(peer, &c->c_peer, sizeof(*peer)) == 0 && - !match_connection_uuid(c, uuid)) { + peer->peer_ni == c->c_peer.peer_ni) { ptlrpc_connection_addref(c); list_del(&c->c_link); list_add(&c->c_link, &conn_list); @@ -74,28 +87,18 @@ struct ptlrpc_connection *ptlrpc_get_connection(struct lustre_peer *peer, /* FIXME: this should be a slab once we can validate slab addresses * without OOPSing */ - OBD_ALLOC(c, sizeof(*c)); + OBD_ALLOC_GFP(c, sizeof(*c), GFP_ATOMIC); + if (c == NULL) GOTO(out, c); - c->c_level = LUSTRE_CONN_NEW; - c->c_xid_in = 1; - c->c_xid_out = 1; - c->c_generation = 1; - c->c_epoch = 1; - c->c_bootcount = 0; - if (uuid) - strcpy(c->c_remote_uuid, uuid); - INIT_LIST_HEAD(&c->c_delayed_head); - INIT_LIST_HEAD(&c->c_sending_head); - INIT_LIST_HEAD(&c->c_dying_head); - INIT_LIST_HEAD(&c->c_imports); - INIT_LIST_HEAD(&c->c_exports); + if (uuid && uuid->uuid) /* XXX ???? */ + obd_str2uuid(&c->c_remote_uuid, (char *)uuid->uuid); atomic_set(&c->c_refcount, 0); + memcpy(&c->c_peer, peer, sizeof(c->c_peer)); + ptlrpc_connection_addref(c); - spin_lock_init(&c->c_lock); - memcpy(&c->c_peer, peer, sizeof(c->c_peer)); list_add(&c->c_link, &conn_list); EXIT; @@ -106,6 +109,7 @@ struct ptlrpc_connection *ptlrpc_get_connection(struct lustre_peer *peer, int ptlrpc_put_connection(struct ptlrpc_connection *c) { + char str[PTL_NALFMT_SIZE]; int rc = 0; ENTRY; @@ -114,8 +118,11 @@ int ptlrpc_put_connection(struct ptlrpc_connection *c) RETURN(0); } - CDEBUG(D_INFO, "connection=%p refcount %d\n", - c, atomic_read(&c->c_refcount) - 1); + CDEBUG (D_INFO, "connection=%p refcount %d to %s on %s\n", + c, atomic_read(&c->c_refcount) - 1, + ptlrpc_peernid2str(&c->c_peer, str), + c->c_peer.peer_ni->pni_name); + if (atomic_dec_and_test(&c->c_refcount)) { spin_lock(&conn_lock); list_del(&c->c_link); @@ -132,10 +139,13 @@ int ptlrpc_put_connection(struct ptlrpc_connection *c) struct ptlrpc_connection *ptlrpc_connection_addref(struct ptlrpc_connection *c) { + char str[PTL_NALFMT_SIZE]; ENTRY; - CDEBUG(D_INFO, "connection=%p refcount %d\n", - c, atomic_read(&c->c_refcount) + 1); atomic_inc(&c->c_refcount); + CDEBUG (D_INFO, "connection=%p refcount %d to %s on %s\n", + c, atomic_read(&c->c_refcount), + ptlrpc_peernid2str(&c->c_peer, str), + c->c_peer.peer_ni->pni_name); RETURN(c); } @@ -148,6 +158,7 @@ void ptlrpc_init_connection(void) void ptlrpc_cleanup_connection(void) { + char str[PTL_NALFMT_SIZE]; struct list_head *tmp, *pos; struct ptlrpc_connection *c; @@ -159,9 +170,10 @@ void ptlrpc_cleanup_connection(void) } list_for_each_safe(tmp, pos, &conn_list) { c = list_entry(tmp, struct ptlrpc_connection, c_link); - CERROR("Connection %p has refcount %d at cleanup (nid=%lu)!\n", - c, atomic_read(&c->c_refcount), - (unsigned long)c->c_peer.peer_nid); + CERROR("Connection %p/%s has refcount %d (nid=%s on %s)\n", + c, c->c_remote_uuid.uuid, atomic_read(&c->c_refcount), + ptlrpc_peernid2str(&c->c_peer, str), + c->c_peer.peer_ni->pni_name); list_del(&c->c_link); OBD_FREE(c, sizeof(*c)); }