aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlaf Kirch <okir@suse.de>2006-10-04 05:15:52 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-10-04 10:55:16 -0400
commitcf712c24d72341effcfd28330b83b49f77cb627b (patch)
tree88fcb932f3c85d83601e45473bee2c99a22ba9c2
parent977faf392fc898407554bbe7338d57b29e3660cf (diff)
[PATCH] knfsd: consolidate common code for statd->lockd notification
Common code from nlm4svc_proc_sm_notify and nlmsvc_proc_sm_notify is moved into a new nlm_host_rebooted. This is in preparation of a patch that will change the reboot notification handling entirely. 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>
-rw-r--r--fs/lockd/host.c30
-rw-r--r--fs/lockd/svc4proc.c19
-rw-r--r--fs/lockd/svcproc.c17
-rw-r--r--include/linux/lockd/lockd.h5
4 files changed, 35 insertions, 36 deletions
diff --git a/fs/lockd/host.c b/fs/lockd/host.c
index 637ec9567066..bcc21b05808a 100644
--- a/fs/lockd/host.c
+++ b/fs/lockd/host.c
@@ -39,7 +39,7 @@ static void nlm_gc_hosts(void);
39 * Find an NLM server handle in the cache. If there is none, create it. 39 * Find an NLM server handle in the cache. If there is none, create it.
40 */ 40 */
41struct nlm_host * 41struct nlm_host *
42nlmclnt_lookup_host(struct sockaddr_in *sin, int proto, int version) 42nlmclnt_lookup_host(const struct sockaddr_in *sin, int proto, int version)
43{ 43{
44 return nlm_lookup_host(0, sin, proto, version); 44 return nlm_lookup_host(0, sin, proto, version);
45} 45}
@@ -58,7 +58,7 @@ nlmsvc_lookup_host(struct svc_rqst *rqstp)
58 * Common host lookup routine for server & client 58 * Common host lookup routine for server & client
59 */ 59 */
60struct nlm_host * 60struct nlm_host *
61nlm_lookup_host(int server, struct sockaddr_in *sin, 61nlm_lookup_host(int server, const struct sockaddr_in *sin,
62 int proto, int version) 62 int proto, int version)
63{ 63{
64 struct nlm_host *host, **hp; 64 struct nlm_host *host, **hp;
@@ -260,6 +260,32 @@ void nlm_release_host(struct nlm_host *host)
260} 260}
261 261
262/* 262/*
263 * We were notified that the host indicated by address &sin
264 * has rebooted.
265 * Release all resources held by that peer.
266 */
267void nlm_host_rebooted(const struct sockaddr_in *sin, const struct nlm_reboot *argp)
268{
269 struct nlm_host *host;
270
271 /* Obtain the host pointer for this NFS server and try to
272 * reclaim all locks we hold on this server.
273 */
274 if ((argp->proto & 1)==0) {
275 /* We are client, he's the server: try to reclaim all locks. */
276 if ((host = nlmclnt_lookup_host(sin, argp->proto >> 1, argp->vers)) == NULL)
277 return;
278 nlmclnt_recovery(host, argp->state);
279 } else {
280 /* He's the client, we're the server: delete all locks held by the client */
281 if ((host = nlm_lookup_host(1, sin, argp->proto >> 1, argp->vers)) == NULL)
282 return;
283 nlmsvc_free_host_resources(host);
284 }
285 nlm_release_host(host);
286}
287
288/*
263 * Shut down the hosts module. 289 * Shut down the hosts module.
264 * Note that this routine is called only at server shutdown time. 290 * Note that this routine is called only at server shutdown time.
265 */ 291 */
diff --git a/fs/lockd/svc4proc.c b/fs/lockd/svc4proc.c
index b5aceb83f8cb..97bd36c09a5b 100644
--- a/fs/lockd/svc4proc.c
+++ b/fs/lockd/svc4proc.c
@@ -420,10 +420,6 @@ nlm4svc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
420 void *resp) 420 void *resp)
421{ 421{
422 struct sockaddr_in saddr = rqstp->rq_addr; 422 struct sockaddr_in saddr = rqstp->rq_addr;
423 int vers = argp->vers;
424 int prot = argp->proto >> 1;
425
426 struct nlm_host *host;
427 423
428 dprintk("lockd: SM_NOTIFY called\n"); 424 dprintk("lockd: SM_NOTIFY called\n");
429 if (saddr.sin_addr.s_addr != htonl(INADDR_LOOPBACK) 425 if (saddr.sin_addr.s_addr != htonl(INADDR_LOOPBACK)
@@ -438,21 +434,10 @@ nlm4svc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
438 /* Obtain the host pointer for this NFS server and try to 434 /* Obtain the host pointer for this NFS server and try to
439 * reclaim all locks we hold on this server. 435 * reclaim all locks we hold on this server.
440 */ 436 */
437 memset(&saddr, 0, sizeof(saddr));
441 saddr.sin_addr.s_addr = argp->addr; 438 saddr.sin_addr.s_addr = argp->addr;
439 nlm_host_rebooted(&saddr, argp);
442 440
443 if ((argp->proto & 1)==0) {
444 if ((host = nlmclnt_lookup_host(&saddr, prot, vers)) != NULL) {
445 nlmclnt_recovery(host, argp->state);
446 nlm_release_host(host);
447 }
448 } else {
449 /* If we run on an NFS server, delete all locks held by the client */
450
451 if ((host = nlm_lookup_host(1, &saddr, prot, vers)) != NULL) {
452 nlmsvc_free_host_resources(host);
453 nlm_release_host(host);
454 }
455 }
456 return rpc_success; 441 return rpc_success;
457} 442}
458 443
diff --git a/fs/lockd/svcproc.c b/fs/lockd/svcproc.c
index dbc4ea2638c9..452eb5e5ea44 100644
--- a/fs/lockd/svcproc.c
+++ b/fs/lockd/svcproc.c
@@ -449,9 +449,6 @@ nlmsvc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
449 void *resp) 449 void *resp)
450{ 450{
451 struct sockaddr_in saddr = rqstp->rq_addr; 451 struct sockaddr_in saddr = rqstp->rq_addr;
452 int vers = argp->vers;
453 int prot = argp->proto >> 1;
454 struct nlm_host *host;
455 452
456 dprintk("lockd: SM_NOTIFY called\n"); 453 dprintk("lockd: SM_NOTIFY called\n");
457 if (saddr.sin_addr.s_addr != htonl(INADDR_LOOPBACK) 454 if (saddr.sin_addr.s_addr != htonl(INADDR_LOOPBACK)
@@ -466,19 +463,9 @@ nlmsvc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
466 /* Obtain the host pointer for this NFS server and try to 463 /* Obtain the host pointer for this NFS server and try to
467 * reclaim all locks we hold on this server. 464 * reclaim all locks we hold on this server.
468 */ 465 */
466 memset(&saddr, 0, sizeof(saddr));
469 saddr.sin_addr.s_addr = argp->addr; 467 saddr.sin_addr.s_addr = argp->addr;
470 if ((argp->proto & 1)==0) { 468 nlm_host_rebooted(&saddr, argp);
471 if ((host = nlmclnt_lookup_host(&saddr, prot, vers)) != NULL) {
472 nlmclnt_recovery(host, argp->state);
473 nlm_release_host(host);
474 }
475 } else {
476 /* If we run on an NFS server, delete all locks held by the client */
477 if ((host = nlm_lookup_host(1, &saddr, prot, vers)) != NULL) {
478 nlmsvc_free_host_resources(host);
479 nlm_release_host(host);
480 }
481 }
482 469
483 return rpc_success; 470 return rpc_success;
484} 471}
diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h
index 47b7dbd647a6..5f886695ac90 100644
--- a/include/linux/lockd/lockd.h
+++ b/include/linux/lockd/lockd.h
@@ -161,15 +161,16 @@ int nlmclnt_reclaim(struct nlm_host *, struct file_lock *);
161/* 161/*
162 * Host cache 162 * Host cache
163 */ 163 */
164struct nlm_host * nlmclnt_lookup_host(struct sockaddr_in *, int, int); 164struct nlm_host * nlmclnt_lookup_host(const struct sockaddr_in *, int, int);
165struct nlm_host * nlmsvc_lookup_host(struct svc_rqst *); 165struct nlm_host * nlmsvc_lookup_host(struct svc_rqst *);
166struct nlm_host * nlm_lookup_host(int server, struct sockaddr_in *, int, int); 166struct nlm_host * nlm_lookup_host(int server, const struct sockaddr_in *, int, int);
167struct rpc_clnt * nlm_bind_host(struct nlm_host *); 167struct rpc_clnt * nlm_bind_host(struct nlm_host *);
168void nlm_rebind_host(struct nlm_host *); 168void nlm_rebind_host(struct nlm_host *);
169struct nlm_host * nlm_get_host(struct nlm_host *); 169struct nlm_host * nlm_get_host(struct nlm_host *);
170void nlm_release_host(struct nlm_host *); 170void nlm_release_host(struct nlm_host *);
171void nlm_shutdown_hosts(void); 171void nlm_shutdown_hosts(void);
172extern struct nlm_host *nlm_find_client(void); 172extern struct nlm_host *nlm_find_client(void);
173extern void nlm_host_rebooted(const struct sockaddr_in *, const struct nlm_reboot *);
173 174
174 175
175/* 176/*