diff options
author | Olaf Kirch <okir@suse.de> | 2006-10-04 05:15:52 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-04 10:55:16 -0400 |
commit | cf712c24d72341effcfd28330b83b49f77cb627b (patch) | |
tree | 88fcb932f3c85d83601e45473bee2c99a22ba9c2 | |
parent | 977faf392fc898407554bbe7338d57b29e3660cf (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.c | 30 | ||||
-rw-r--r-- | fs/lockd/svc4proc.c | 19 | ||||
-rw-r--r-- | fs/lockd/svcproc.c | 17 | ||||
-rw-r--r-- | include/linux/lockd/lockd.h | 5 |
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 | */ |
41 | struct nlm_host * | 41 | struct nlm_host * |
42 | nlmclnt_lookup_host(struct sockaddr_in *sin, int proto, int version) | 42 | nlmclnt_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 | */ |
60 | struct nlm_host * | 60 | struct nlm_host * |
61 | nlm_lookup_host(int server, struct sockaddr_in *sin, | 61 | nlm_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 | */ | ||
267 | void 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 | */ |
164 | struct nlm_host * nlmclnt_lookup_host(struct sockaddr_in *, int, int); | 164 | struct nlm_host * nlmclnt_lookup_host(const struct sockaddr_in *, int, int); |
165 | struct nlm_host * nlmsvc_lookup_host(struct svc_rqst *); | 165 | struct nlm_host * nlmsvc_lookup_host(struct svc_rqst *); |
166 | struct nlm_host * nlm_lookup_host(int server, struct sockaddr_in *, int, int); | 166 | struct nlm_host * nlm_lookup_host(int server, const struct sockaddr_in *, int, int); |
167 | struct rpc_clnt * nlm_bind_host(struct nlm_host *); | 167 | struct rpc_clnt * nlm_bind_host(struct nlm_host *); |
168 | void nlm_rebind_host(struct nlm_host *); | 168 | void nlm_rebind_host(struct nlm_host *); |
169 | struct nlm_host * nlm_get_host(struct nlm_host *); | 169 | struct nlm_host * nlm_get_host(struct nlm_host *); |
170 | void nlm_release_host(struct nlm_host *); | 170 | void nlm_release_host(struct nlm_host *); |
171 | void nlm_shutdown_hosts(void); | 171 | void nlm_shutdown_hosts(void); |
172 | extern struct nlm_host *nlm_find_client(void); | 172 | extern struct nlm_host *nlm_find_client(void); |
173 | extern void nlm_host_rebooted(const struct sockaddr_in *, const struct nlm_reboot *); | ||
173 | 174 | ||
174 | 175 | ||
175 | /* | 176 | /* |