Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 38371
b: refs/heads/master
c: cf712c2
h: refs/heads/master
i:
  38369: 83bead3
  38367: 413cead
v: v3
  • Loading branch information
Olaf Kirch authored and Linus Torvalds committed Oct 4, 2006
1 parent 9e436e2 commit 0fbd715
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 37 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 977faf392fc898407554bbe7338d57b29e3660cf
refs/heads/master: cf712c24d72341effcfd28330b83b49f77cb627b
30 changes: 28 additions & 2 deletions trunk/fs/lockd/host.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ static void nlm_gc_hosts(void);
* Find an NLM server handle in the cache. If there is none, create it.
*/
struct nlm_host *
nlmclnt_lookup_host(struct sockaddr_in *sin, int proto, int version)
nlmclnt_lookup_host(const struct sockaddr_in *sin, int proto, int version)
{
return nlm_lookup_host(0, sin, proto, version);
}
Expand All @@ -58,7 +58,7 @@ nlmsvc_lookup_host(struct svc_rqst *rqstp)
* Common host lookup routine for server & client
*/
struct nlm_host *
nlm_lookup_host(int server, struct sockaddr_in *sin,
nlm_lookup_host(int server, const struct sockaddr_in *sin,
int proto, int version)
{
struct nlm_host *host, **hp;
Expand Down Expand Up @@ -259,6 +259,32 @@ void nlm_release_host(struct nlm_host *host)
}
}

/*
* We were notified that the host indicated by address &sin
* has rebooted.
* Release all resources held by that peer.
*/
void nlm_host_rebooted(const struct sockaddr_in *sin, const struct nlm_reboot *argp)
{
struct nlm_host *host;

/* Obtain the host pointer for this NFS server and try to
* reclaim all locks we hold on this server.
*/
if ((argp->proto & 1)==0) {
/* We are client, he's the server: try to reclaim all locks. */
if ((host = nlmclnt_lookup_host(sin, argp->proto >> 1, argp->vers)) == NULL)
return;
nlmclnt_recovery(host, argp->state);
} else {
/* He's the client, we're the server: delete all locks held by the client */
if ((host = nlm_lookup_host(1, sin, argp->proto >> 1, argp->vers)) == NULL)
return;
nlmsvc_free_host_resources(host);
}
nlm_release_host(host);
}

/*
* Shut down the hosts module.
* Note that this routine is called only at server shutdown time.
Expand Down
19 changes: 2 additions & 17 deletions trunk/fs/lockd/svc4proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -420,10 +420,6 @@ nlm4svc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
void *resp)
{
struct sockaddr_in saddr = rqstp->rq_addr;
int vers = argp->vers;
int prot = argp->proto >> 1;

struct nlm_host *host;

dprintk("lockd: SM_NOTIFY called\n");
if (saddr.sin_addr.s_addr != htonl(INADDR_LOOPBACK)
Expand All @@ -438,21 +434,10 @@ nlm4svc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
/* Obtain the host pointer for this NFS server and try to
* reclaim all locks we hold on this server.
*/
memset(&saddr, 0, sizeof(saddr));
saddr.sin_addr.s_addr = argp->addr;
nlm_host_rebooted(&saddr, argp);

if ((argp->proto & 1)==0) {
if ((host = nlmclnt_lookup_host(&saddr, prot, vers)) != NULL) {
nlmclnt_recovery(host, argp->state);
nlm_release_host(host);
}
} else {
/* If we run on an NFS server, delete all locks held by the client */

if ((host = nlm_lookup_host(1, &saddr, prot, vers)) != NULL) {
nlmsvc_free_host_resources(host);
nlm_release_host(host);
}
}
return rpc_success;
}

Expand Down
17 changes: 2 additions & 15 deletions trunk/fs/lockd/svcproc.c
Original file line number Diff line number Diff line change
Expand Up @@ -449,9 +449,6 @@ nlmsvc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
void *resp)
{
struct sockaddr_in saddr = rqstp->rq_addr;
int vers = argp->vers;
int prot = argp->proto >> 1;
struct nlm_host *host;

dprintk("lockd: SM_NOTIFY called\n");
if (saddr.sin_addr.s_addr != htonl(INADDR_LOOPBACK)
Expand All @@ -466,19 +463,9 @@ nlmsvc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
/* Obtain the host pointer for this NFS server and try to
* reclaim all locks we hold on this server.
*/
memset(&saddr, 0, sizeof(saddr));
saddr.sin_addr.s_addr = argp->addr;
if ((argp->proto & 1)==0) {
if ((host = nlmclnt_lookup_host(&saddr, prot, vers)) != NULL) {
nlmclnt_recovery(host, argp->state);
nlm_release_host(host);
}
} else {
/* If we run on an NFS server, delete all locks held by the client */
if ((host = nlm_lookup_host(1, &saddr, prot, vers)) != NULL) {
nlmsvc_free_host_resources(host);
nlm_release_host(host);
}
}
nlm_host_rebooted(&saddr, argp);

return rpc_success;
}
Expand Down
5 changes: 3 additions & 2 deletions trunk/include/linux/lockd/lockd.h
Original file line number Diff line number Diff line change
Expand Up @@ -161,15 +161,16 @@ int nlmclnt_reclaim(struct nlm_host *, struct file_lock *);
/*
* Host cache
*/
struct nlm_host * nlmclnt_lookup_host(struct sockaddr_in *, int, int);
struct nlm_host * nlmclnt_lookup_host(const struct sockaddr_in *, int, int);
struct nlm_host * nlmsvc_lookup_host(struct svc_rqst *);
struct nlm_host * nlm_lookup_host(int server, struct sockaddr_in *, int, int);
struct nlm_host * nlm_lookup_host(int server, const struct sockaddr_in *, int, int);
struct rpc_clnt * nlm_bind_host(struct nlm_host *);
void nlm_rebind_host(struct nlm_host *);
struct nlm_host * nlm_get_host(struct nlm_host *);
void 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 *);


/*
Expand Down

0 comments on commit 0fbd715

Please sign in to comment.