aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2008-12-05 19:03:39 -0500
committerJ. Bruce Fields <bfields@citi.umich.edu>2009-01-06 11:53:54 -0500
commit576df4634e37e46b441fefb91915184edb13bb94 (patch)
tree85dc6dc6dcf7eec104b7c78885a9e38123bb220f
parent7fefc9cb9d5f129c238d93166f705c96ca2e7e51 (diff)
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>
-rw-r--r--fs/lockd/host.c3
-rw-r--r--fs/lockd/xdr.c4
-rw-r--r--fs/lockd/xdr4.c4
-rw-r--r--include/linux/lockd/xdr.h8
4 files changed, 10 insertions, 9 deletions
diff --git a/fs/lockd/host.c b/fs/lockd/host.c
index ed103387964d..dc41e46ef74c 100644
--- a/fs/lockd/host.c
+++ b/fs/lockd/host.c
@@ -453,9 +453,10 @@ void nlm_release_host(struct nlm_host *host)
453 */ 453 */
454void nlm_host_rebooted(const struct nlm_reboot *info) 454void nlm_host_rebooted(const struct nlm_reboot *info)
455{ 455{
456 __be32 *p = (__be32 *)&info->priv.data;
456 const struct sockaddr_in sin = { 457 const struct sockaddr_in sin = {
457 .sin_family = AF_INET, 458 .sin_family = AF_INET,
458 .sin_addr.s_addr = info->addr, 459 .sin_addr.s_addr = *p,
459 }; 460 };
460 struct hlist_head *chain; 461 struct hlist_head *chain;
461 struct hlist_node *pos; 462 struct hlist_node *pos;
diff --git a/fs/lockd/xdr.c b/fs/lockd/xdr.c
index 1f226290c67c..4cc7d01a1eb5 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)
349 if (!(p = xdr_decode_string_inplace(p, &argp->mon, &argp->len, SM_MAXSTRLEN))) 349 if (!(p = xdr_decode_string_inplace(p, &argp->mon, &argp->len, SM_MAXSTRLEN)))
350 return 0; 350 return 0;
351 argp->state = ntohl(*p++); 351 argp->state = ntohl(*p++);
352 /* Preserve the address in network byte order */ 352 memcpy(&argp->priv.data, p, sizeof(argp->priv.data));
353 argp->addr = *p++; 353 p += XDR_QUADLEN(SM_PRIV_SIZE);
354 return xdr_argsize_check(rqstp, p); 354 return xdr_argsize_check(rqstp, p);
355} 355}
356 356
diff --git a/fs/lockd/xdr4.c b/fs/lockd/xdr4.c
index 50c493a8ad8e..61d1714a470e 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
356 if (!(p = xdr_decode_string_inplace(p, &argp->mon, &argp->len, SM_MAXSTRLEN))) 356 if (!(p = xdr_decode_string_inplace(p, &argp->mon, &argp->len, SM_MAXSTRLEN)))
357 return 0; 357 return 0;
358 argp->state = ntohl(*p++); 358 argp->state = ntohl(*p++);
359 /* Preserve the address in network byte order */ 359 memcpy(&argp->priv.data, p, sizeof(argp->priv.data));
360 argp->addr = *p++; 360 p += XDR_QUADLEN(SM_PRIV_SIZE);
361 return xdr_argsize_check(rqstp, p); 361 return xdr_argsize_check(rqstp, p);
362} 362}
363 363
diff --git a/include/linux/lockd/xdr.h b/include/linux/lockd/xdr.h
index 6b5199263858..6338866222a8 100644
--- a/include/linux/lockd/xdr.h
+++ b/include/linux/lockd/xdr.h
@@ -83,10 +83,10 @@ struct nlm_res {
83 * statd callback when client has rebooted 83 * statd callback when client has rebooted
84 */ 84 */
85struct nlm_reboot { 85struct nlm_reboot {
86 char * mon; 86 char *mon;
87 unsigned int len; 87 unsigned int len;
88 u32 state; 88 u32 state;
89 __be32 addr; 89 struct nsm_private priv;
90}; 90};
91 91
92/* 92/*