]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/lockd/host.c
[PATCH] knfsd: nfsd: store export path in export
[linux-2.6-omap-h63xx.git] / fs / lockd / host.c
index 4449ef0b783716f6485894fab582b34f4658dc7d..fb24a97303458f1b282f81111895c105e2c0399f 100644 (file)
@@ -103,8 +103,8 @@ nlm_lookup_host(int server, const struct sockaddr_in *sin,
                        continue;
 
                /* See if we have an NSM handle for this client */
-               if (!nsm && (nsm = host->h_nsmhandle) != 0)
-                       atomic_inc(&nsm->sm_count);
+               if (!nsm)
+                       nsm = host->h_nsmhandle;
 
                if (host->h_proto != proto)
                        continue;
@@ -120,6 +120,8 @@ nlm_lookup_host(int server, const struct sockaddr_in *sin,
                nlm_get_host(host);
                goto out;
        }
+       if (nsm)
+               atomic_inc(&nsm->sm_count);
 
        host = NULL;
 
@@ -164,33 +166,34 @@ out:
        return host;
 }
 
-struct nlm_host *
-nlm_find_client(void)
+/*
+ * Destroy a host
+ */
+static void
+nlm_destroy_host(struct nlm_host *host)
 {
-       struct hlist_head *chain;
-       struct hlist_node *pos;
+       struct rpc_clnt *clnt;
+
+       BUG_ON(!list_empty(&host->h_lockowners));
+       BUG_ON(atomic_read(&host->h_count));
 
-       /* find a nlm_host for a client for which h_killed == 0.
-        * and return it
+       /*
+        * Release NSM handle and unmonitor host.
         */
-       mutex_lock(&nlm_host_mutex);
-       for (chain = nlm_hosts; chain < nlm_hosts + NLM_HOST_NRHASH; ++chain) {
-               struct nlm_host *host;
+       nsm_unmonitor(host);
 
-               hlist_for_each_entry(host, pos, chain, h_hash) {
-                       if (host->h_server &&
-                           host->h_killed == 0) {
-                               nlm_get_host(host);
-                               mutex_unlock(&nlm_host_mutex);
-                               return host;
-                       }
+       if ((clnt = host->h_rpcclnt) != NULL) {
+               if (atomic_read(&clnt->cl_users)) {
+                       printk(KERN_WARNING
+                               "lockd: active RPC handle\n");
+                       clnt->cl_dead = 1;
+               } else {
+                       rpc_destroy_client(host->h_rpcclnt);
                }
        }
-       mutex_unlock(&nlm_host_mutex);
-       return NULL;
+       kfree(host);
 }
 
-                               
 /*
  * Create the NLM RPC client for an NLM peer
  */
@@ -400,7 +403,6 @@ nlm_gc_hosts(void)
        struct hlist_head *chain;
        struct hlist_node *pos, *next;
        struct nlm_host *host;
-       struct rpc_clnt *clnt;
 
        dprintk("lockd: host garbage collection\n");
        for (chain = nlm_hosts; chain < nlm_hosts + NLM_HOST_NRHASH; ++chain) {
@@ -423,21 +425,7 @@ nlm_gc_hosts(void)
                        dprintk("lockd: delete host %s\n", host->h_name);
                        hlist_del_init(&host->h_hash);
 
-                       /*
-                        * Unmonitor unless host was invalidated (i.e. lockd restarted)
-                        */
-                       nsm_unmonitor(host);
-
-                       if ((clnt = host->h_rpcclnt) != NULL) {
-                               if (atomic_read(&clnt->cl_users)) {
-                                       printk(KERN_WARNING
-                                               "lockd: active RPC handle\n");
-                                       clnt->cl_dead = 1;
-                               } else {
-                                       rpc_destroy_client(host->h_rpcclnt);
-                               }
-                       }
-                       kfree(host);
+                       nlm_destroy_host(host);
                        nrhosts--;
                }
        }
@@ -450,7 +438,7 @@ nlm_gc_hosts(void)
  * Manage NSM handles
  */
 static LIST_HEAD(nsm_handles);
-static DECLARE_MUTEX(nsm_sema);
+static DEFINE_MUTEX(nsm_mutex);
 
 static struct nsm_handle *
 __nsm_find(const struct sockaddr_in *sin,
@@ -472,11 +460,15 @@ __nsm_find(const struct sockaddr_in *sin,
                return NULL;
        }
 
-       down(&nsm_sema);
+       mutex_lock(&nsm_mutex);
        list_for_each(pos, &nsm_handles) {
                nsm = list_entry(pos, struct nsm_handle, sm_link);
 
-               if (!nlm_cmp_addr(&nsm->sm_addr, sin))
+               if (hostname && nsm_use_hostnames) {
+                       if (strlen(nsm->sm_name) != hostname_len
+                        || memcmp(nsm->sm_name, hostname, hostname_len))
+                               continue;
+               } else if (!nlm_cmp_addr(&nsm->sm_addr, sin))
                        continue;
                atomic_inc(&nsm->sm_count);
                goto out;
@@ -498,7 +490,8 @@ __nsm_find(const struct sockaddr_in *sin,
                list_add(&nsm->sm_link, &nsm_handles);
        }
 
-out:   up(&nsm_sema);
+out:
+       mutex_unlock(&nsm_mutex);
        return nsm;
 }
 
@@ -517,11 +510,11 @@ nsm_release(struct nsm_handle *nsm)
        if (!nsm)
                return;
        if (atomic_dec_and_test(&nsm->sm_count)) {
-               down(&nsm_sema);
+               mutex_lock(&nsm_mutex);
                if (atomic_read(&nsm->sm_count) == 0) {
                        list_del(&nsm->sm_link);
                        kfree(nsm);
                }
-               up(&nsm_sema);
+               mutex_unlock(&nsm_mutex);
        }
 }