lockd: Make nlm_host_rebooted use the nsm_handle
Subsystems (2)
PATCH 7/22 lockd: Make nlm_host_rebooted use the nsm_handle
From: Olaf Kirch <[email protected]>
Subject: lockd: Make nlm_host_rebooted use the nsm_handle
This patch makes the SM_NOTIFY handling understand and use the nsm_handle.
Signed-off-by Olaf Kirch <[email protected]>
fs/lockd/clntlock.c | 53 ++++++++++++----------------------- fs/lockd/host.c | 65 +++++++++++++++++++++++++++++++------------- fs/lockd/svc4proc.c | 2 - fs/lockd/svcproc.c | 2 - include/linux/lockd/lockd.h | 4 +- 5 files changed, 70 insertions(+), 56 deletions(-)
fs/lockd/clntlock.c +19 -34
@@ -144,41 +144,12 @@ u32 nlmclnt_grant(const struct sockaddr_*/ /* -* 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); - 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" , 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 );
@@ -198,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 (); -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 )
@@ -217,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) {
fs/lockd/host.c +47 -18
75 lines not on this page · raw message
fs/lockd/svc4proc.c +1 -1
@@ -436,7 +436,7 @@ nlm4svc_proc_sm_notify(struct svc_rqst **/ memset (&saddr,0 ,sizeof (saddr)); saddr.sin_addr.s_addr = argp->addr; -nlm_host_rebooted (&saddr, argp); +nlm_host_rebooted (&saddr, argp->mon, argp->len, argp->state);return rpc_success; }
fs/lockd/svcproc.c +1 -1
@@ -465,7 +465,7 @@ nlmsvc_proc_sm_notify(struct svc_rqst *r*/ memset (&saddr,0 ,sizeof (saddr)); saddr.sin_addr.s_addr = argp->addr; -nlm_host_rebooted (&saddr, argp); +nlm_host_rebooted (&saddr, argp->mon, argp->len, argp->state);return rpc_success; }
include/linux/lockd/lockd.h +2 -2
@@ -166,7 +166,7 @@ struct nlm_wait * nlmclnt_prepare_block(void nlmclnt_finish_block (struct nlm_wait *block);int nlmclnt_block (struct nlm_wait *block,struct nlm_rqst *req,long timeout);u32 nlmclnt_grant (const struct sockaddr_in *addr,const struct nlm_lock *); -void nlmclnt_recovery (struct nlm_host *,u32 ); +void nlmclnt_recovery (struct nlm_host *);int nlmclnt_reclaim (struct nlm_host *,struct file_lock *);/*
@@ -181,7 +181,7 @@ struct nlm_host * nlm_get_host(struct nlvoid nlm_release_host (struct nlm_host *);void nlm_shutdown_hosts (void );extern struct nlm_host *nlm_find_client (void ); -extern void nlm_host_rebooted (const struct sockaddr_in *,const struct nlm_reboot *); +extern void nlm_host_rebooted (const struct sockaddr_in *,const char *,int ,u32 );struct nsm_handle *nsm_find (const struct sockaddr_in *,const char *,int );void nsm_release (struct nsm_handle *);
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs