X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fptlrpc%2Fconnection.c;h=e643013ca681e843605a1ce01444434898488d5f;hb=9b3c3ccd736930af497398305f0e6186a88a635b;hp=ef4dd4fc99a145e87cf04072115213ee7bb0e798;hpb=a936bf41113858ee55f8c292a41b462ed2b02dc3;p=fs%2Flustre-release.git diff --git a/lustre/ptlrpc/connection.c b/lustre/ptlrpc/connection.c index ef4dd4f..e643013 100644 --- a/lustre/ptlrpc/connection.c +++ b/lustre/ptlrpc/connection.c @@ -29,6 +29,18 @@ 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) +{ + obd_uuid_t zero_uuid = {0}; + + if (uuid) + return memcmp(c->c_remote_uuid, uuid, sizeof(uuid)); + + return memcmp(c->c_remote_uuid, zero_uuid, sizeof(zero_uuid)); +} + struct ptlrpc_connection *ptlrpc_get_connection(struct lustre_peer *peer, obd_uuid_t uuid) { @@ -43,7 +55,7 @@ struct ptlrpc_connection *ptlrpc_get_connection(struct lustre_peer *peer, list_for_each(tmp, &conn_list) { c = list_entry(tmp, struct ptlrpc_connection, c_link); if (memcmp(peer, &c->c_peer, sizeof(*peer)) == 0 && - (!uuid || !memcmp(c->c_remote_uuid, uuid, sizeof(uuid)))) { + !match_connection_uuid(c, uuid)) { ptlrpc_connection_addref(c); GOTO(out, c); } @@ -52,7 +64,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 && - (!uuid || strcmp(c->c_remote_uuid, uuid) == 0)) { + !match_connection_uuid(c, uuid)) { ptlrpc_connection_addref(c); list_del(&c->c_link); list_add(&c->c_link, &conn_list); @@ -72,12 +84,15 @@ struct ptlrpc_connection *ptlrpc_get_connection(struct lustre_peer *peer, c->c_generation = 1; c->c_epoch = 1; c->c_bootcount = 0; - strcpy(c->c_remote_uuid, uuid); + c->c_flags = 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); + INIT_LIST_HEAD(&c->c_sb_chain); atomic_set(&c->c_refcount, 0); ptlrpc_connection_addref(c); spin_lock_init(&c->c_lock); @@ -96,6 +111,11 @@ int ptlrpc_put_connection(struct ptlrpc_connection *c) int rc = 0; ENTRY; + if (c == NULL) { + CERROR("NULL connection\n"); + RETURN(0); + } + CDEBUG(D_INFO, "connection=%p refcount %d\n", c, atomic_read(&c->c_refcount) - 1); if (atomic_dec_and_test(&c->c_refcount)) {