From: Andy Adamson <andros@xxxxxxxxxx> We currently only have one session per clientid. If the deviceid maps the MDS server as a data server, use the MDS session for the data server traffic only if EXCHGID4_FLAG_USE_PNFS_DS is set as an MDS clientid pNFS role. Squash into "pnfs: filelayout: device ops" Signed-off-by: Andy Adamson <andros@xxxxxxxxxx> --- fs/nfs/client.c | 3 ++- fs/nfs/internal.h | 2 ++ fs/nfs/nfs4filelayoutdev.c | 20 +++++++++++++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 0337330..1979831 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c @@ -348,7 +348,7 @@ static int nfs_sockaddr_match_ipaddr(const struct sockaddr *sa1, * Test if two socket addresses represent the same actual socket, * by comparing (only) relevant fields, including the port number. */ -static int nfs_sockaddr_cmp(const struct sockaddr *sa1, +int nfs_sockaddr_cmp(const struct sockaddr *sa1, const struct sockaddr *sa2) { if (sa1->sa_family != sa2->sa_family) @@ -362,6 +362,7 @@ static int nfs_sockaddr_cmp(const struct sockaddr *sa1, } return 0; } +EXPORT_SYMBOL(nfs_sockaddr_cmp); /* * Find a client by IP address and protocol version diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index 83f2953..92f3231 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h @@ -139,6 +139,8 @@ extern struct nfs_server *nfs_clone_server(struct nfs_server *, struct nfs_fattr *); extern void nfs_mark_client_ready(struct nfs_client *clp, int state); extern int nfs4_check_client_ready(struct nfs_client *clp); +extern int nfs_sockaddr_cmp(const struct sockaddr *sa1, + const struct sockaddr *sa2); extern int nfs4_set_client(struct nfs_server *server, const char *hostname, const struct sockaddr *addr, diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c index 462f6de..891c31d 100644 --- a/fs/nfs/nfs4filelayoutdev.c +++ b/fs/nfs/nfs4filelayoutdev.c @@ -126,7 +126,8 @@ nfs4_pnfs_ds_create(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds) }; struct sockaddr_in sin; struct rpc_clnt *mds_clnt = mds_srv->client; - struct nfs_client *clp; + struct nfs_client *clp = mds_srv->nfs_client; + struct sockaddr *mds_addr; char ip_addr[16]; int addrlen; int err = 0; @@ -138,6 +139,23 @@ nfs4_pnfs_ds_create(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds) sin.sin_addr.s_addr = ds->ds_ip_addr; sin.sin_port = ds->ds_port; + /* + * If this DS is also the MDS, use the MDS session only if the + * MDS exchangeid flags show the EXCHGID4_FLAG_USE_PNFS_DS pNFS role. + */ + mds_addr = (struct sockaddr *)&clp->cl_addr; + if (nfs_sockaddr_cmp((struct sockaddr *)&sin, mds_addr)) { + if (!(clp->cl_exchange_flags & EXCHGID4_FLAG_USE_PNFS_DS)) { + printk(KERN_INFO "ip:port %s is not a pNFS Data " + "Server\n", ds->r_addr); + err = -ENODEV; + } else { + atomic_inc(&clp->cl_count); + ds->ds_clp = clp; + dprintk("%s Using MDS Session for DS\n", __func__); + } + goto out; + } /* Set timeout to the mds rpc clnt value. * XXX - find the correct authflavor.... * -- 1.6.6 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html