2010-05-12 17:40:10

by Andy Adamson

[permalink] [raw]
Subject: [PATCH 0/3] Use MDS session for dual role MDS/DS


Plus some clean ups.

Use the MDS session for the data server traffic only
if EXCHGID4_FLAG_USE_PNFS_DS is set as an MDS clientid pNFS role

0001-SQUASHME-pnfs_submit-use-MDS-session-for-dual-MDS-DS.patch
0002-SQUASHME-pnfs_submit-update-DS-nfs4_set_client.patch
0003-SQUASHME-pnfs_submit-cleanup-DS-exchange-flag-proces.patch


Testing:
CONFIG_NFS_V4_1 set:
pNFS, NFSv41, NFSv4 mount passes Connectathon tests.

CONFIG_NFS_V4_1 not set:
NFSv4 mount passes Connectathon tests.

-->Andy



2010-05-13 19:13:50

by Batsakis, Alexandros

[permalink] [raw]
Subject: RE: [PATCH 2/3] SQUASHME pnfs_submit: update DS nfs4_set_client



> -----Original Message-----
> From: Adamson, Andy
> Sent: Wednesday, May 12, 2010 10:40 AM
> To: [email protected]
> Cc: [email protected]; Adamson, Andy
> Subject: [PATCH 2/3] SQUASHME pnfs_submit: update DS nfs4_set_client
>
> From: Andy Adamson <[email protected]>
>
> Dont bother using the hostname, use the client ipaddr field from the
> MDS
> nfs_client for construction of the co_ownrid field the DS EXCHANGE_ID.
>
> Clean up the comments.
>
> Squash into "pnfs: filelayout: device ops"
>
> Signed-off-by: Andy Adamson <[email protected]>
> ---
> fs/nfs/nfs4filelayoutdev.c | 28 +++++-----------------------
> 1 files changed, 5 insertions(+), 23 deletions(-)
>
> diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c
> index 891c31d..b41f437 100644
> --- a/fs/nfs/nfs4filelayoutdev.c
> +++ b/fs/nfs/nfs4filelayoutdev.c
> @@ -128,8 +128,6 @@ nfs4_pnfs_ds_create(struct nfs_server *mds_srv,
> struct nfs4_pnfs_ds *ds)
> struct rpc_clnt *mds_clnt = mds_srv->client;
> struct nfs_client *clp = mds_srv->nfs_client;
> struct sockaddr *mds_addr;
> - char ip_addr[16];
> - int addrlen;
> int err = 0;
>
> dprintk("--> %s ip:port %s au_flavor %d\n", __func__,
> @@ -156,32 +154,16 @@ nfs4_pnfs_ds_create(struct nfs_server *mds_srv,
> struct nfs4_pnfs_ds *ds)
> }
> goto out;
> }
> - /* Set timeout to the mds rpc clnt value.
> - * XXX - find the correct authflavor....
> - *
> - * Fake a client ipaddr (used for sessionid) with hostname
> - * Use hostname since it might be more unique than ipaddr (which
> - * could be set to the loopback 127.0.0/1.1
> - *
> - * XXX: Should sessions continue to use the cl_ipaddr field?
> - */
> - addrlen = strnlen(utsname()->nodename, sizeof(utsname()-
> >nodename));
> - if (addrlen > sizeof(ip_addr))
> - addrlen = sizeof(ip_addr);
> - memcpy(ip_addr, utsname()->nodename, addrlen);
> -
> - /* XXX need a non-nfs_client struct interface to set up
> - * data server sessions
> - *
> - * tmp: nfs4_set_client sets the nfs_server->nfs_client.
> - *
> - * We specify a retrans and timeout interval equual to MDS. ??
> + /*
> + * Set a retrans, timeout interval, and authflavor equual to the
> MDS
> + * values. Use the MDS nfs_client cl_ipaddr field so as to use
> the
> + * same co_ownerid as the MDS.
> */
> err = nfs4_set_client(&tmp,
> mds_srv->nfs_client->cl_hostname,
> (struct sockaddr *)&sin,
> sizeof(struct sockaddr),
> - ip_addr,
> + mds_srv->nfs_client->cl_ipaddr,
> mds_clnt->cl_auth->au_flavor,
> IPPROTO_TCP,
> mds_clnt->cl_xprt->timeout,
> --
> 1.6.6

Hi Andy,

Is there a way to avoid creating a new nfs_client altogether and just
re-use the existing one along with its session ?

-a

>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs"
in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html

2010-05-12 17:40:10

by Andy Adamson

[permalink] [raw]
Subject: [PATCH 1/3] SQUASHME pnfs_submit: use MDS session for dual MDS/DS

From: Andy Adamson <[email protected]>

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 <[email protected]>
---
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


2010-05-12 17:40:11

by Andy Adamson

[permalink] [raw]
Subject: [PATCH 3/3] SQUASHME pnfs_submit: cleanup DS exchange flag processing

From: Andy Adamson <[email protected]>

Squash into "pnfs: filelayout: device ops"

Signed-off-by: Andy Adamson <[email protected]>
---
fs/nfs/nfs4filelayoutdev.c | 12 ++++++++----
1 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c
index b41f437..b04c9d9 100644
--- a/fs/nfs/nfs4filelayoutdev.c
+++ b/fs/nfs/nfs4filelayoutdev.c
@@ -173,18 +173,16 @@ nfs4_pnfs_ds_create(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds)

clp = tmp.nfs_client;

- /* Set exchange id and create session flags and setup session */
+ /* Ask for only the EXCHGID4_FLAG_USE_PNFS_DS pNFS role */
dprintk("%s EXCHANGE_ID for clp %p\n", __func__, clp);
clp->cl_exchange_flags = EXCHGID4_FLAG_USE_PNFS_DS;
+
err = nfs4_recover_expired_lease(clp);
if (!err)
err = nfs4_check_client_ready(clp);
if (err)
goto out_put;

- /* mask out the server's MDS capability flag */
- clp->cl_exchange_flags &= ~EXCHGID4_FLAG_USE_PNFS_MDS;
-
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);
@@ -193,6 +191,12 @@ nfs4_pnfs_ds_create(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds)
}

/*
+ * Mask the (possibly) returned EXCHGID4_FLAG_USE_PNFS_MDS pNFS role
+ * The is_ds_only_session depends on this.
+ */
+ clp->cl_exchange_flags &= ~EXCHGID4_FLAG_USE_PNFS_MDS;
+
+ /*
* Set DS lease equal to the MDS lease, renewal is scheduled in
* create_session
*/
--
1.6.6


2010-05-12 17:40:11

by Andy Adamson

[permalink] [raw]
Subject: [PATCH 2/3] SQUASHME pnfs_submit: update DS nfs4_set_client

From: Andy Adamson <[email protected]>

Dont bother using the hostname, use the client ipaddr field from the MDS
nfs_client for construction of the co_ownrid field the DS EXCHANGE_ID.

Clean up the comments.

Squash into "pnfs: filelayout: device ops"

Signed-off-by: Andy Adamson <[email protected]>
---
fs/nfs/nfs4filelayoutdev.c | 28 +++++-----------------------
1 files changed, 5 insertions(+), 23 deletions(-)

diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c
index 891c31d..b41f437 100644
--- a/fs/nfs/nfs4filelayoutdev.c
+++ b/fs/nfs/nfs4filelayoutdev.c
@@ -128,8 +128,6 @@ nfs4_pnfs_ds_create(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds)
struct rpc_clnt *mds_clnt = mds_srv->client;
struct nfs_client *clp = mds_srv->nfs_client;
struct sockaddr *mds_addr;
- char ip_addr[16];
- int addrlen;
int err = 0;

dprintk("--> %s ip:port %s au_flavor %d\n", __func__,
@@ -156,32 +154,16 @@ nfs4_pnfs_ds_create(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds)
}
goto out;
}
- /* Set timeout to the mds rpc clnt value.
- * XXX - find the correct authflavor....
- *
- * Fake a client ipaddr (used for sessionid) with hostname
- * Use hostname since it might be more unique than ipaddr (which
- * could be set to the loopback 127.0.0/1.1
- *
- * XXX: Should sessions continue to use the cl_ipaddr field?
- */
- addrlen = strnlen(utsname()->nodename, sizeof(utsname()->nodename));
- if (addrlen > sizeof(ip_addr))
- addrlen = sizeof(ip_addr);
- memcpy(ip_addr, utsname()->nodename, addrlen);
-
- /* XXX need a non-nfs_client struct interface to set up
- * data server sessions
- *
- * tmp: nfs4_set_client sets the nfs_server->nfs_client.
- *
- * We specify a retrans and timeout interval equual to MDS. ??
+ /*
+ * Set a retrans, timeout interval, and authflavor equual to the MDS
+ * values. Use the MDS nfs_client cl_ipaddr field so as to use the
+ * same co_ownerid as the MDS.
*/
err = nfs4_set_client(&tmp,
mds_srv->nfs_client->cl_hostname,
(struct sockaddr *)&sin,
sizeof(struct sockaddr),
- ip_addr,
+ mds_srv->nfs_client->cl_ipaddr,
mds_clnt->cl_auth->au_flavor,
IPPROTO_TCP,
mds_clnt->cl_xprt->timeout,
--
1.6.6