NLM: Decode "priv" argument of NLMPROC_SM_NOTIFY as an opaque
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>
This commit is contained in:
parent
7fefc9cb9d
commit
576df4634e
|
@ -453,9 +453,10 @@ void nlm_release_host(struct nlm_host *host)
|
||||||
*/
|
*/
|
||||||
void nlm_host_rebooted(const struct nlm_reboot *info)
|
void nlm_host_rebooted(const struct nlm_reboot *info)
|
||||||
{
|
{
|
||||||
|
__be32 *p = (__be32 *)&info->priv.data;
|
||||||
const struct sockaddr_in sin = {
|
const struct sockaddr_in sin = {
|
||||||
.sin_family = AF_INET,
|
.sin_family = AF_INET,
|
||||||
.sin_addr.s_addr = info->addr,
|
.sin_addr.s_addr = *p,
|
||||||
};
|
};
|
||||||
struct hlist_head *chain;
|
struct hlist_head *chain;
|
||||||
struct hlist_node *pos;
|
struct hlist_node *pos;
|
||||||
|
|
|
@ -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)))
|
if (!(p = xdr_decode_string_inplace(p, &argp->mon, &argp->len, SM_MAXSTRLEN)))
|
||||||
return 0;
|
return 0;
|
||||||
argp->state = ntohl(*p++);
|
argp->state = ntohl(*p++);
|
||||||
/* Preserve the address in network byte order */
|
memcpy(&argp->priv.data, p, sizeof(argp->priv.data));
|
||||||
argp->addr = *p++;
|
p += XDR_QUADLEN(SM_PRIV_SIZE);
|
||||||
return xdr_argsize_check(rqstp, p);
|
return xdr_argsize_check(rqstp, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)))
|
if (!(p = xdr_decode_string_inplace(p, &argp->mon, &argp->len, SM_MAXSTRLEN)))
|
||||||
return 0;
|
return 0;
|
||||||
argp->state = ntohl(*p++);
|
argp->state = ntohl(*p++);
|
||||||
/* Preserve the address in network byte order */
|
memcpy(&argp->priv.data, p, sizeof(argp->priv.data));
|
||||||
argp->addr = *p++;
|
p += XDR_QUADLEN(SM_PRIV_SIZE);
|
||||||
return xdr_argsize_check(rqstp, p);
|
return xdr_argsize_check(rqstp, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,10 +83,10 @@ struct nlm_res {
|
||||||
* statd callback when client has rebooted
|
* statd callback when client has rebooted
|
||||||
*/
|
*/
|
||||||
struct nlm_reboot {
|
struct nlm_reboot {
|
||||||
char * mon;
|
char *mon;
|
||||||
unsigned int len;
|
unsigned int len;
|
||||||
u32 state;
|
u32 state;
|
||||||
__be32 addr;
|
struct nsm_private priv;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue