Prepare for managing larger addresses in the NFS client by widening the
nfs_client struct's cl_addr field and adding a field to store the address's
length.

Signed-off-by: Chuck Lever <[EMAIL PROTECTED]>
Cc: Aurelien Charbon <[EMAIL PROTECTED]>
---

 fs/nfs/client.c           |   11 +++++++----
 fs/nfs/super.c            |    9 ++++++---
 include/linux/nfs_fs_sb.h |    3 ++-
 3 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index 5ab1ca1..53bf8ab 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -117,7 +117,8 @@ static struct nfs_client *nfs_alloc_client(const char 
*hostname,
        atomic_set(&clp->cl_count, 1);
        clp->cl_cons_state = NFS_CS_INITING;
 
-       memcpy(&clp->cl_addr, addr, sizeof(clp->cl_addr));
+       clp->cl_addrlen = sizeof(*addr);        /* for now */
+       memcpy(&clp->cl_addr, addr, clp->cl_addrlen);
 
        if (hostname) {
                clp->cl_hostname = kstrdup(hostname, GFP_KERNEL);
@@ -214,6 +215,8 @@ static struct nfs_client *__nfs_find_client(const struct 
sockaddr_in *addr,
        struct nfs_client *clp;
 
        list_for_each_entry(clp, &nfs_client_list, cl_share_link) {
+               struct sockaddr_in *clap = (struct sockaddr_in *)&clp->cl_addr;
+
                /* Don't match clients that failed to initialise properly */
                if (clp->cl_cons_state < 0)
                        continue;
@@ -222,10 +225,10 @@ static struct nfs_client *__nfs_find_client(const struct 
sockaddr_in *addr,
                if (clp->rpc_ops->version != nfsversion)
                        continue;
 
-               if (clp->cl_addr.sin_addr.s_addr != addr->sin_addr.s_addr)
+               if (clap->sin_addr.s_addr != addr->sin_addr.s_addr)
                        continue;
 
-               if (!match_port || clp->cl_addr.sin_port == addr->sin_port)
+               if (!match_port || clap->sin_port == addr->sin_port)
                        goto found;
        }
 
@@ -380,7 +383,7 @@ static int nfs_create_rpc_client(struct nfs_client *clp, 
int proto,
        struct rpc_create_args args = {
                .protocol       = proto,
                .address        = (struct sockaddr *)&clp->cl_addr,
-               .addrsize       = sizeof(clp->cl_addr),
+               .addrsize       = clp->cl_addrlen,
                .timeout        = &timeparms,
                .servername     = clp->cl_hostname,
                .program        = &nfs_program,
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 5a742a8..6258a19 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -1332,10 +1332,13 @@ static int nfs_compare_super(struct super_block *sb, 
void *data)
        struct nfs_server *server = sb_mntdata->server, *old = NFS_SB(sb);
        int mntflags = sb_mntdata->mntflags;
 
-       if (memcmp(&old->nfs_client->cl_addr,
-                               &server->nfs_client->cl_addr,
-                               sizeof(old->nfs_client->cl_addr)) != 0)
+       /* Check family, address, and port */
+       if (old->nfs_client->cl_addrlen != server->nfs_client->cl_addrlen)
                return 0;
+       if (memcmp(&old->nfs_client->cl_addr, &server->nfs_client->cl_addr,
+                  old->nfs_client->cl_addrlen) != 0)
+               return 0;
+
        /* Note: NFS_MOUNT_UNSHARED == NFS4_MOUNT_UNSHARED */
        if (old->flags & NFS_MOUNT_UNSHARED)
                return 0;
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h
index f2a0f20..5e3a43b 100644
--- a/include/linux/nfs_fs_sb.h
+++ b/include/linux/nfs_fs_sb.h
@@ -20,7 +20,8 @@ struct nfs_client {
 #define NFS_CS_IDMAP           2               /* - idmap started */
 #define NFS_CS_RENEWD          3               /* - renewd started */
 
-       struct sockaddr_in      cl_addr;        /* server identifier */
+       struct sockaddr_storage cl_addr;        /* server identifier */
+       size_t                  cl_addrlen;
        char *                  cl_hostname;    /* hostname of server */
        struct list_head        cl_share_link;  /* link in global client list */
        struct list_head        cl_superblocks; /* List of nfs_server structs */

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to