diff options
| -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 | /* |
