On Fri, Dec 05, 2008 at 07:03:39PM -0500, Chuck Lever wrote: > 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. OK, applied these four. --b. > > Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx> > --- > > fs/lockd/host.c | 3 ++- > fs/lockd/xdr.c | 4 ++-- > fs/lockd/xdr4.c | 4 ++-- > include/linux/lockd/xdr.h | 8 ++++---- > 4 files changed, 10 insertions(+), 9 deletions(-) > > diff --git a/fs/lockd/host.c b/fs/lockd/host.c > index ed10338..dc41e46 100644 > --- a/fs/lockd/host.c > +++ b/fs/lockd/host.c > @@ -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; > diff --git a/fs/lockd/xdr.c b/fs/lockd/xdr.c > index 1f22629..4cc7d01 100644 > --- a/fs/lockd/xdr.c > +++ b/fs/lockd/xdr.c > @@ -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); > } > > diff --git a/fs/lockd/xdr4.c b/fs/lockd/xdr4.c > index 50c493a..61d1714 100644 > --- a/fs/lockd/xdr4.c > +++ b/fs/lockd/xdr4.c > @@ -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); > } > > diff --git a/include/linux/lockd/xdr.h b/include/linux/lockd/xdr.h > index 6b51992..6338866 100644 > --- a/include/linux/lockd/xdr.h > +++ b/include/linux/lockd/xdr.h > @@ -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; > }; > > /* > -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html