Commit 7fefc9cb authored by Chuck Lever's avatar Chuck Lever Committed by J. Bruce Fields

NLM: Change nlm_host_rebooted() to take a single nlm_reboot argument

Pass the nlm_reboot data structure directly from the NLMPROC_SM_NOTIFY
XDR decoders to nlm_host_rebooted().  This eliminates some packing and
unpacking of the NLMPROC_SM_NOTIFY results, and prepares for passing
these results, including the "priv" cookie, directly to a lookup
routine in fs/lockd/mon.c.

This patch changes code organization but should not cause any
behavioral change.
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
parent cab2d3c9
...@@ -444,31 +444,34 @@ void nlm_release_host(struct nlm_host *host) ...@@ -444,31 +444,34 @@ void nlm_release_host(struct nlm_host *host)
} }
} }
/* /**
* We were notified that the host indicated by address &sin * nlm_host_rebooted - Release all resources held by rebooted host
* has rebooted. * @info: pointer to decoded results of NLM_SM_NOTIFY call
* Release all resources held by that peer. *
* We were notified that the specified host has rebooted. Release
* all resources held by that peer.
*/ */
void nlm_host_rebooted(const struct sockaddr_in *sin, void nlm_host_rebooted(const struct nlm_reboot *info)
const char *hostname,
unsigned int hostname_len,
u32 new_state)
{ {
const struct sockaddr_in sin = {
.sin_family = AF_INET,
.sin_addr.s_addr = info->addr,
};
struct hlist_head *chain; struct hlist_head *chain;
struct hlist_node *pos; struct hlist_node *pos;
struct nsm_handle *nsm; struct nsm_handle *nsm;
struct nlm_host *host; struct nlm_host *host;
nsm = nsm_find((struct sockaddr *)sin, sizeof(*sin), nsm = nsm_find((struct sockaddr *)&sin, sizeof(sin),
hostname, hostname_len, 0); info->mon, info->len, 0);
if (nsm == NULL) { if (nsm == NULL) {
dprintk("lockd: never saw rebooted peer '%.*s' before\n", dprintk("lockd: never saw rebooted peer '%.*s' before\n",
hostname_len, hostname); info->len, info->mon);
return; return;
} }
dprintk("lockd: nlm_host_rebooted(%.*s, %s)\n", dprintk("lockd: nlm_host_rebooted(%.*s, %s)\n",
hostname_len, hostname, nsm->sm_addrbuf); info->len, info->mon, nsm->sm_addrbuf);
/* When reclaiming locks on this peer, make sure that /* When reclaiming locks on this peer, make sure that
* we set up a new notification */ * we set up a new notification */
...@@ -483,8 +486,8 @@ again: mutex_lock(&nlm_host_mutex); ...@@ -483,8 +486,8 @@ again: mutex_lock(&nlm_host_mutex);
for (chain = nlm_hosts; chain < nlm_hosts + NLM_HOST_NRHASH; ++chain) { for (chain = nlm_hosts; chain < nlm_hosts + NLM_HOST_NRHASH; ++chain) {
hlist_for_each_entry(host, pos, chain, h_hash) { hlist_for_each_entry(host, pos, chain, h_hash) {
if (host->h_nsmhandle == nsm if (host->h_nsmhandle == nsm
&& host->h_nsmstate != new_state) { && host->h_nsmstate != info->state) {
host->h_nsmstate = new_state; host->h_nsmstate = info->state;
host->h_state++; host->h_state++;
nlm_get_host(host); nlm_get_host(host);
......
...@@ -419,8 +419,6 @@ static __be32 ...@@ -419,8 +419,6 @@ static __be32
nlm4svc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp, nlm4svc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
void *resp) void *resp)
{ {
struct sockaddr_in saddr;
dprintk("lockd: SM_NOTIFY called\n"); dprintk("lockd: SM_NOTIFY called\n");
if (!nlm_privileged_requester(rqstp)) { if (!nlm_privileged_requester(rqstp)) {
...@@ -430,14 +428,7 @@ nlm4svc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp, ...@@ -430,14 +428,7 @@ nlm4svc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
return rpc_system_err; return rpc_system_err;
} }
/* Obtain the host pointer for this NFS server and try to nlm_host_rebooted(argp);
* reclaim all locks we hold on this server.
*/
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = argp->addr;
nlm_host_rebooted(&saddr, argp->mon, argp->len, argp->state);
return rpc_success; return rpc_success;
} }
......
...@@ -451,8 +451,6 @@ static __be32 ...@@ -451,8 +451,6 @@ static __be32
nlmsvc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp, nlmsvc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
void *resp) void *resp)
{ {
struct sockaddr_in saddr;
dprintk("lockd: SM_NOTIFY called\n"); dprintk("lockd: SM_NOTIFY called\n");
if (!nlm_privileged_requester(rqstp)) { if (!nlm_privileged_requester(rqstp)) {
...@@ -462,14 +460,7 @@ nlmsvc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp, ...@@ -462,14 +460,7 @@ nlmsvc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
return rpc_system_err; return rpc_system_err;
} }
/* Obtain the host pointer for this NFS server and try to nlm_host_rebooted(argp);
* reclaim all locks we hold on this server.
*/
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = argp->addr;
nlm_host_rebooted(&saddr, argp->mon, argp->len, argp->state);
return rpc_success; return rpc_success;
} }
......
...@@ -239,8 +239,7 @@ void nlm_rebind_host(struct nlm_host *); ...@@ -239,8 +239,7 @@ void nlm_rebind_host(struct nlm_host *);
struct nlm_host * nlm_get_host(struct nlm_host *); struct nlm_host * nlm_get_host(struct nlm_host *);
void nlm_release_host(struct nlm_host *); void nlm_release_host(struct nlm_host *);
void nlm_shutdown_hosts(void); void nlm_shutdown_hosts(void);
extern void nlm_host_rebooted(const struct sockaddr_in *, const char *, void nlm_host_rebooted(const struct nlm_reboot *);
unsigned int, u32);
/* /*
* Host monitoring * Host monitoring
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment