NSM: Generate NSMPROC_MON's "priv" argument when nsm_handle is created

Introduce a new data type, used by both the in-kernel NLM and NSM
implementations, that is used to manage the opaque "priv" argument
for the NSMPROC_MON and NLMPROC_SM_NOTIFY calls.

Construct the "priv" cookie when the nsm_handle is created.

The nsm_init_private() function may look a little strange, but it is
roughly equivalent to how the XDR encoder formed the "priv" argument.
It's going to go away soon.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
This commit is contained in:
Chuck Lever
2008-12-05 19:03:16 -05:00
committed by J. Bruce Fields
parent 05f3a9af58
commit 7e44d3bea2
4 changed files with 23 additions and 1 deletions

View File

@@ -201,6 +201,21 @@ void nsm_unmonitor(const struct nlm_host *host)
}
}
/*
* Construct a unique cookie to match this nsm_handle to this monitored
* host. It is passed to the local rpc.statd via NSMPROC_MON, and
* returned via NLMPROC_SM_NOTIFY, in the "priv" field of these
* requests.
*
* Linux provides the raw IP address of the monitored host,
* left in network byte order.
*/
static void nsm_init_private(struct nsm_handle *nsm)
{
__be32 *p = (__be32 *)&nsm->sm_priv.data;
*p = nsm_addr_in(nsm)->sin_addr.s_addr;
}
/**
* nsm_find - Find or create a cached nsm_handle
* @sap: pointer to socket address of handle to find
@@ -271,6 +286,7 @@ retry:
nsm->sm_name = (char *) (nsm + 1);
memcpy(nsm->sm_name, hostname, hostname_len);
nsm->sm_name[hostname_len] = '\0';
nsm_init_private(nsm);
nsm_display_address((struct sockaddr *)&nsm->sm_addr,
nsm->sm_addrbuf, sizeof(nsm->sm_addrbuf));
atomic_set(&nsm->sm_count, 1);