Skip to content

Commit

Permalink
NLM: Decode "priv" argument of NLMPROC_SM_NOTIFY as an opaque
Browse files Browse the repository at this point in the history
The NLM XDR decoders for the NLMPROC_SM_NOTIFY procedure should treat
their "priv" argument truly as an opaque, as defined by the protocol,
and let the upper layers figure out what is in it.

This will make it easier to modify the contents and interpretation of
the "priv" argument, and keep knowledge about what's in "priv" local
to fs/lockd/mon.c.

For now, the NLM and NSM implementations should behave exactly as they
did before.

The formation of the address of the rebooted host in
nlm_host_rebooted() may look a little strange, but it is the inverse
of how nsm_init_private() forms the private cookie.  Plus, it's
going away soon anyway.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
  • Loading branch information
Chuck Lever authored and J. Bruce Fields committed Jan 6, 2009
1 parent 7fefc9c commit 576df46
Show file tree
Hide file tree
Showing 4 changed files with 10 additions and 9 deletions.
3 changes: 2 additions & 1 deletion fs/lockd/host.c
Original file line number Diff line number Diff line change
Expand Up @@ -453,9 +453,10 @@ void nlm_release_host(struct nlm_host *host)
*/
void nlm_host_rebooted(const struct nlm_reboot *info)
{
__be32 *p = (__be32 *)&info->priv.data;
const struct sockaddr_in sin = {
.sin_family = AF_INET,
.sin_addr.s_addr = info->addr,
.sin_addr.s_addr = *p,
};
struct hlist_head *chain;
struct hlist_node *pos;
Expand Down
4 changes: 2 additions & 2 deletions fs/lockd/xdr.c
Original file line number Diff line number Diff line change
Expand Up @@ -349,8 +349,8 @@ nlmsvc_decode_reboot(struct svc_rqst *rqstp, __be32 *p, struct nlm_reboot *argp)
if (!(p = xdr_decode_string_inplace(p, &argp->mon, &argp->len, SM_MAXSTRLEN)))
return 0;
argp->state = ntohl(*p++);
/* Preserve the address in network byte order */
argp->addr = *p++;
memcpy(&argp->priv.data, p, sizeof(argp->priv.data));
p += XDR_QUADLEN(SM_PRIV_SIZE);
return xdr_argsize_check(rqstp, p);
}

Expand Down
4 changes: 2 additions & 2 deletions fs/lockd/xdr4.c
Original file line number Diff line number Diff line change
Expand Up @@ -356,8 +356,8 @@ nlm4svc_decode_reboot(struct svc_rqst *rqstp, __be32 *p, struct nlm_reboot *argp
if (!(p = xdr_decode_string_inplace(p, &argp->mon, &argp->len, SM_MAXSTRLEN)))
return 0;
argp->state = ntohl(*p++);
/* Preserve the address in network byte order */
argp->addr = *p++;
memcpy(&argp->priv.data, p, sizeof(argp->priv.data));
p += XDR_QUADLEN(SM_PRIV_SIZE);
return xdr_argsize_check(rqstp, p);
}

Expand Down
8 changes: 4 additions & 4 deletions include/linux/lockd/xdr.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,10 @@ struct nlm_res {
* statd callback when client has rebooted
*/
struct nlm_reboot {
char * mon;
unsigned int len;
u32 state;
__be32 addr;
char *mon;
unsigned int len;
u32 state;
struct nsm_private priv;
};

/*
Expand Down

0 comments on commit 576df46

Please sign in to comment.