Whamcloud - gitweb
b=13807
authoryury <yury>
Sat, 13 Oct 2007 09:37:37 +0000 (09:37 +0000)
committeryury <yury>
Sat, 13 Oct 2007 09:37:37 +0000 (09:37 +0000)
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
lustre/ldlm/ldlm_resource.c

index 139c205..70c6eb9 100644 (file)
@@ -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);
index cf3b2b1..5c12ea3 100644 (file)
@@ -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);