lockd: Adjust nlmclnt_lookup_host() signature to accomodate non-AF_INET
Chuck Lever [Fri, 3 Oct 2008 16:50:21 +0000 (12:50 -0400)]
Pass a struct sockaddr * and a length to nlmclnt_lookup_host() to
accomodate non-AF_INET family addresses.

As a side benefit, eliminate the hostname_len argument, as the hostname
is always NUL-terminated.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>

fs/lockd/clntlock.c
fs/lockd/host.c
include/linux/lockd/lockd.h

index 237224a..9eaf306 100644 (file)
@@ -58,10 +58,9 @@ struct nlm_host *nlmclnt_init(const struct nlmclnt_initdata *nlm_init)
        if (status < 0)
                return ERR_PTR(status);
 
-       host = nlmclnt_lookup_host((struct sockaddr_in *)nlm_init->address,
+       host = nlmclnt_lookup_host(nlm_init->address, nlm_init->addrlen,
                                   nlm_init->protocol, nlm_version,
-                                  nlm_init->hostname,
-                                  strlen(nlm_init->hostname));
+                                  nlm_init->hostname);
        if (host == NULL) {
                lockd_down();
                return ERR_PTR(-ENOLCK);
index 5876b0e..cbd2398 100644 (file)
@@ -264,32 +264,42 @@ nlm_destroy_host(struct nlm_host *host)
        kfree(host);
 }
 
-/*
- * Find an NLM server handle in the cache. If there is none, create it.
+/**
+ * nlmclnt_lookup_host - Find an NLM host handle matching a remote server
+ * @sap: network address of server
+ * @salen: length of server address
+ * @protocol: transport protocol to use
+ * @version: NLM protocol version
+ * @hostname: '\0'-terminated hostname of server
+ *
+ * Returns an nlm_host structure that matches the passed-in
+ * [server address, transport protocol, NLM version, server hostname].
+ * If one doesn't already exist in the host cache, a new handle is
+ * created and returned.
  */
-struct nlm_host *nlmclnt_lookup_host(const struct sockaddr_in *sin,
-                                    int proto, u32 version,
-                                    const char *hostname,
-                                    unsigned int hostname_len)
+struct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap,
+                                    const size_t salen,
+                                    const unsigned short protocol,
+                                    const u32 version, const char *hostname)
 {
        const struct sockaddr source = {
                .sa_family      = AF_UNSPEC,
        };
        struct nlm_lookup_host_info ni = {
                .server         = 0,
-               .sap            = (struct sockaddr *)sin,
-               .salen          = sizeof(*sin),
-               .protocol       = proto,
+               .sap            = sap,
+               .salen          = salen,
+               .protocol       = protocol,
                .version        = version,
                .hostname       = hostname,
-               .hostname_len   = hostname_len,
+               .hostname_len   = strlen(hostname),
                .src_sap        = &source,
                .src_len        = sizeof(source),
        };
 
        dprintk("lockd: %s(host='%s', vers=%u, proto=%s)\n", __func__,
                        (hostname ? hostname : "<none>"), version,
-                       (proto == IPPROTO_UDP ? "udp" : "tcp"));
+                       (protocol == IPPROTO_UDP ? "udp" : "tcp"));
 
        return nlm_lookup_host(&ni);
 }
index 973ab1d..90a996d 100644 (file)
@@ -215,10 +215,11 @@ void                nlmclnt_next_cookie(struct nlm_cookie *);
 /*
  * Host cache
  */
-struct nlm_host  *nlmclnt_lookup_host(const struct sockaddr_in *sin,
-                                       int proto, u32 version,
-                                       const char *hostname,
-                                       unsigned int hostname_len);
+struct nlm_host  *nlmclnt_lookup_host(const struct sockaddr *sap,
+                                       const size_t salen,
+                                       const unsigned short protocol,
+                                       const u32 version,
+                                       const char *hostname);
 struct nlm_host  *nlmsvc_lookup_host(struct svc_rqst *, const char *,
                                        unsigned int);
 struct rpc_clnt * nlm_bind_host(struct nlm_host *);