lockd: Use sockaddr_storage + length for h_addr field
authorChuck Lever <chuck.lever@oracle.com>
Wed, 3 Sep 2008 18:35:39 +0000 (14:35 -0400)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Mon, 29 Sep 2008 22:13:39 +0000 (18:13 -0400)
To store larger addresses in the nlm_host structure, make h_addr a
sockaddr_storage, and add an address length field.

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 0b45fd3a4bfd6dfdb9e6e8d426a46489954822bb..0df5587f804e8af82cb784a9c4ac4df212c3fafe 100644 (file)
@@ -166,7 +166,7 @@ __be32 nlmclnt_grant(const struct sockaddr_in *addr, const struct nlm_lock *lock
                 */
                if (fl_blocked->fl_u.nfs_fl.owner->pid != lock->svid)
                        continue;
-               if (!nlm_cmp_addr(&block->b_host->h_addr, addr))
+               if (!nlm_cmp_addr(nlm_addr_in(block->b_host), addr))
                        continue;
                if (nfs_compare_fh(NFS_FH(fl_blocked->fl_file->f_path.dentry->d_inode) ,fh) != 0)
                        continue;
index 008e4026f540ca29ac86c7003cd1a0eeb5fc7290..8c7022eeae65bb99a9b5715393dabca63e5c1af1 100644 (file)
@@ -116,7 +116,7 @@ static struct nlm_host *nlm_lookup_host(int server,
         */
        chain = &nlm_hosts[hash];
        hlist_for_each_entry(host, pos, chain, h_hash) {
-               if (!nlm_cmp_addr(&host->h_addr, sin))
+               if (!nlm_cmp_addr(nlm_addr_in(host), sin))
                        continue;
 
                /* See if we have an NSM handle for this client */
@@ -165,8 +165,9 @@ static struct nlm_host *nlm_lookup_host(int server,
                goto out;
        }
        host->h_name       = nsm->sm_name;
-       host->h_addr       = *sin;
-       nlm_clear_port((struct sockaddr *)&host->h_addr);
+       memcpy(nlm_addr(host), sin, sizeof(*sin));
+       host->h_addrlen = sizeof(*sin);
+       nlm_clear_port(nlm_addr(host));
        host->h_saddr      = *ssin;
        host->h_version    = version;
        host->h_proto      = proto;
@@ -291,8 +292,8 @@ nlm_bind_host(struct nlm_host *host)
                };
                struct rpc_create_args args = {
                        .protocol       = host->h_proto,
-                       .address        = (struct sockaddr *)&host->h_addr,
-                       .addrsize       = sizeof(host->h_addr),
+                       .address        = nlm_addr(host),
+                       .addrsize       = host->h_addrlen,
                        .saddress       = (struct sockaddr *)&host->h_saddr,
                        .timeout        = &timeparms,
                        .servername     = host->h_name,
index 0691efbd0b344bbc50da144b458de00672f392a8..41d7a8e61ceabc16732ee1b0ef6e8420dafbec41 100644 (file)
@@ -38,7 +38,8 @@
  */
 struct nlm_host {
        struct hlist_node       h_hash;         /* doubly linked list */
-       struct sockaddr_in      h_addr;         /* peer address */
+       struct sockaddr_storage h_addr;         /* peer address */
+       size_t                  h_addrlen;
        struct sockaddr_in      h_saddr;        /* our address (optional) */
        struct rpc_clnt *       h_rpcclnt;      /* RPC client to talk to peer */
        char *                  h_name;         /* remote hostname */
@@ -76,6 +77,19 @@ struct nsm_handle {
        char                    sm_addrbuf[48]; /* address eyecatcher */
 };
 
+/*
+ * Rigorous type checking on sockaddr type conversions
+ */
+static inline struct sockaddr_in *nlm_addr_in(const struct nlm_host *host)
+{
+       return (struct sockaddr_in *)&host->h_addr;
+}
+
+static inline struct sockaddr *nlm_addr(const struct nlm_host *host)
+{
+       return (struct sockaddr *)&host->h_addr;
+}
+
 /*
  * Map an fl_owner_t into a unique 32-bit "pid"
  */