[PATCH] knfsd: lockd: Make nlm_host_rebooted use the nsm_handle
[platform/kernel/linux-rpi.git] / fs / lockd / clntlock.c
index 54e63dd..a4ab6dd 100644 (file)
@@ -144,43 +144,12 @@ u32 nlmclnt_grant(const struct sockaddr_in *addr, const struct nlm_lock *lock)
  */
 
 /*
- * Someone has sent us an SM_NOTIFY. Ensure we bind to the new port number,
- * that we mark locks for reclaiming, and that we bump the pseudo NSM state.
- */
-static void nlmclnt_prepare_reclaim(struct nlm_host *host)
-{
-       down_write(&host->h_rwsem);
-       if (host->h_nsmhandle)
-               host->h_nsmhandle->sm_monitored = 0;
-       host->h_state++;
-       host->h_nextrebind = 0;
-       nlm_rebind_host(host);
-
-       /*
-        * Mark the locks for reclaiming.
-        */
-       list_splice_init(&host->h_granted, &host->h_reclaim);
-
-       dprintk("NLM: reclaiming locks for host %s\n", host->h_name);
-}
-
-static void nlmclnt_finish_reclaim(struct nlm_host *host)
-{
-       host->h_reclaiming = 0;
-       up_write(&host->h_rwsem);
-       dprintk("NLM: done reclaiming locks for host %s", host->h_name);
-}
-
-/*
  * Reclaim all locks on server host. We do this by spawning a separate
  * reclaimer thread.
  */
 void
-nlmclnt_recovery(struct nlm_host *host, u32 newstate)
+nlmclnt_recovery(struct nlm_host *host)
 {
-       if (host->h_nsmstate == newstate)
-               return;
-       host->h_nsmstate = newstate;
        if (!host->h_reclaiming++) {
                nlm_get_host(host);
                __module_get(THIS_MODULE);
@@ -200,18 +169,30 @@ reclaimer(void *ptr)
        daemonize("%s-reclaim", host->h_name);
        allow_signal(SIGKILL);
 
+       down_write(&host->h_rwsem);
+
        /* This one ensures that our parent doesn't terminate while the
         * reclaim is in progress */
        lock_kernel();
        lockd_up(0); /* note: this cannot fail as lockd is already running */
 
-       nlmclnt_prepare_reclaim(host);
-       /* First, reclaim all locks that have been marked. */
+       dprintk("lockd: reclaiming locks for host %s", host->h_name);
+
 restart:
        nsmstate = host->h_nsmstate;
+
+       /* Force a portmap getport - the peer's lockd will
+        * most likely end up on a different port.
+        */
+       host->h_nextrebind = 0;
+       nlm_rebind_host(host);
+
+       /* First, reclaim all locks that have been granted. */
+       list_splice_init(&host->h_granted, &host->h_reclaim);
        list_for_each_entry_safe(fl, next, &host->h_reclaim, fl_u.nfs_fl.list) {
                list_del_init(&fl->fl_u.nfs_fl.list);
 
+               /* Why are we leaking memory here? --okir */
                if (signalled())
                        continue;
                if (nlmclnt_reclaim(host, fl) != 0)
@@ -219,11 +200,13 @@ restart:
                list_add_tail(&fl->fl_u.nfs_fl.list, &host->h_granted);
                if (host->h_nsmstate != nsmstate) {
                        /* Argh! The server rebooted again! */
-                       list_splice_init(&host->h_granted, &host->h_reclaim);
                        goto restart;
                }
        }
-       nlmclnt_finish_reclaim(host);
+
+       host->h_reclaiming = 0;
+       up_write(&host->h_rwsem);
+       dprintk("NLM: done reclaiming locks for host %s", host->h_name);
 
        /* Now, wake up all processes that sleep on a blocked lock */
        list_for_each_entry(block, &nlm_blocked, b_list) {