|
@@ -143,44 +143,13 @@ u32 nlmclnt_grant(const struct sockaddr_in *addr, const struct nlm_lock *lock)
|
|
|
* server crash.
|
|
|
*/
|
|
|
|
|
|
-/*
|
|
|
- * 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) {
|