Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 576df463 authored by Chuck Lever's avatar Chuck Lever Committed by J. Bruce Fields
Browse files

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: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
parent 7fefc9cb
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -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;
+2 −2
Original line number Original line Diff line number Diff line
@@ -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);
}
}


+2 −2
Original line number Original line Diff line number Diff line
@@ -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);
}
}


+4 −4
Original line number Original line Diff line number Diff line
@@ -86,7 +86,7 @@ struct nlm_reboot {
	char			*mon;
	char			*mon;
	unsigned int		len;
	unsigned int		len;
	u32			state;
	u32			state;
	__be32		addr;
	struct nsm_private	priv;
};
};


/*
/*