[PATCH] knfsd: lockd: Make nlm_host_rebooted use the nsm_handle
This patch makes the SM_NOTIFY handling understand and use the nsm_handle. To make it a bit clear what is happening: nlmclent_prepare_reclaim and nlmclnt_finish_reclaim get open-coded into 'reclaimer' The result is tidied up. Then some of that functionality is moved out into nlm_host_rebooted (which calls nlmclnt_recovery which starts a thread which runs reclaimer). Also host_rebooted now finds an nsm_handle rather than a host, then then iterates over all hosts and deals with each host that shares that nsm_handle. Signed-off-by: Olaf Kirch <okir@suse.de> Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
f0737a39a6
commit
5c8dd29ca7
@ -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) {
|
||||
|
Reference in New Issue
Block a user