diff options
Diffstat (limited to 'fs/lockd/host.c')
-rw-r--r-- | fs/lockd/host.c | 30 |
1 files changed, 28 insertions, 2 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 | */ |