From eaa7a2718a00fe94cf97b0fc50deedb49f16ba44 Mon Sep 17 00:00:00 2001 From: yury Date: Sat, 13 Oct 2007 09:37:37 +0000 Subject: [PATCH] b=13807 r=adilger,nathan - fixed race in ldlm_namespace_new() when new ns could be added to its list before finishing pool init. --- lustre/ldlm/ldlm_pool.c | 5 +---- lustre/ldlm/ldlm_resource.c | 30 ++++++++++++++---------------- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/lustre/ldlm/ldlm_pool.c b/lustre/ldlm/ldlm_pool.c index 139c205..70c6eb9 100644 --- a/lustre/ldlm/ldlm_pool.c +++ b/lustre/ldlm/ldlm_pool.c @@ -337,11 +337,8 @@ EXPORT_SYMBOL(ldlm_pool_shrink); int ldlm_pool_setup(struct ldlm_pool *pl, __u32 limit) { ENTRY; - if (ldlm_pl2ns(pl)->ns_client == LDLM_NAMESPACE_SERVER) { - spin_lock(&pl->pl_lock); + if (ldlm_pl2ns(pl)->ns_client == LDLM_NAMESPACE_SERVER) ldlm_pool_set_limit(pl, limit); - spin_unlock(&pl->pl_lock); - } RETURN(0); } EXPORT_SYMBOL(ldlm_pool_setup); diff --git a/lustre/ldlm/ldlm_resource.c b/lustre/ldlm/ldlm_resource.c index cf3b2b1..5c12ea3 100644 --- a/lustre/ldlm/ldlm_resource.c +++ b/lustre/ldlm/ldlm_resource.c @@ -247,7 +247,7 @@ struct ldlm_namespace *ldlm_namespace_new(char *name, ldlm_side_t client, { struct ldlm_namespace *ns = NULL; struct list_head *bucket; - int rc, idx; + int rc, idx, namelen; ENTRY; rc = ldlm_get_ref(client); @@ -265,7 +265,8 @@ struct ldlm_namespace *ldlm_namespace_new(char *name, ldlm_side_t client, GOTO(out_ns, NULL); ns->ns_appetite = apt; - OBD_ALLOC(ns->ns_name, strlen(name) + 1); + namelen = strlen(name); + OBD_ALLOC(ns->ns_name, namelen + 1); if (!ns->ns_name) GOTO(out_hash, NULL); @@ -288,29 +289,26 @@ struct ldlm_namespace *ldlm_namespace_new(char *name, ldlm_side_t client, ns->ns_max_unused = LDLM_DEFAULT_LRU_SIZE; ns->ns_max_age = LDLM_DEFAULT_MAX_ALIVE; spin_lock_init(&ns->ns_unused_lock); - ns->ns_connect_flags = 0; - mutex_down(ldlm_namespace_lock(client)); - list_add(&ns->ns_list_chain, ldlm_namespace_list(client)); - idx = atomic_read(ldlm_namespace_nr(client)); - atomic_inc(ldlm_namespace_nr(client)); - mutex_up(ldlm_namespace_lock(client)); ldlm_proc_namespace(ns); - + + idx = atomic_read(ldlm_namespace_nr(client)); rc = ldlm_pool_init(&ns->ns_pool, ns, idx, client); if (rc) { - CERROR("can't initialize lock pool, rc %d\n", rc); - GOTO(out_del, rc); + CERROR("Can't initialize lock pool, rc %d\n", rc); + GOTO(out_proc, rc); } - RETURN(ns); -out_del: mutex_down(ldlm_namespace_lock(client)); - list_del(&ns->ns_list_chain); - atomic_dec(ldlm_namespace_nr(client)); + list_add(&ns->ns_list_chain, ldlm_namespace_list(client)); + atomic_inc(ldlm_namespace_nr(client)); mutex_up(ldlm_namespace_lock(client)); + + RETURN(ns); +out_proc: + ldlm_namespace_cleanup(ns, 0); + OBD_FREE(ns->ns_name, namelen + 1); out_hash: - POISON(ns->ns_hash, 0x5a, sizeof(*ns->ns_hash) * RES_HASH_SIZE); OBD_VFREE(ns->ns_hash, sizeof(*ns->ns_hash) * RES_HASH_SIZE); out_ns: OBD_FREE_PTR(ns); -- 1.8.3.1