OSDN Git Service

NFS/pnfs: Separate NFSv3 DS and MDS traffic
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 17 Oct 2019 13:49:45 +0000 (09:49 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 4 Nov 2019 02:28:45 +0000 (21:28 -0500)
If a NFSv3 server is being used as both a DS and as a regular NFSv3 server,
we may want to keep the IO traffic on a separate TCP connection, since
it will typically have very different timeout characteristics.

This patch therefore sets up a flag to separate the two modes of operation
for the nfs_client.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/client.c
fs/nfs/nfs3client.c
include/linux/nfs_fs_sb.h

index fa7d923..bd6575e 100644 (file)
@@ -312,6 +312,12 @@ again:
                /* Match nfsv4 minorversion */
                if (clp->cl_minorversion != data->minorversion)
                        continue;
+
+               /* Match request for a dedicated DS */
+               if (test_bit(NFS_CS_DS, &data->init_flags) !=
+                   test_bit(NFS_CS_DS, &clp->cl_flags))
+                       continue;
+
                /* Match the full socket address */
                if (!rpc_cmp_addr_port(sap, clap))
                        /* Match all xprt_switch full socket addresses */
index 793fa42..223904b 100644 (file)
@@ -109,6 +109,7 @@ struct nfs_client *nfs3_set_ds_client(struct nfs_server *mds_srv,
                __set_bit(NFS_CS_NORESVPORT, &cl_init.init_flags);
 
        __set_bit(NFS_CS_NOPING, &cl_init.init_flags);
+       __set_bit(NFS_CS_DS, &cl_init.init_flags);
 
        /* Use the MDS nfs_client cl_ipaddr. */
        nfs_init_timeout_values(&ds_timeout, ds_proto, ds_timeo, ds_retrans);
index a50dd43..69e80ce 100644 (file)
@@ -46,6 +46,7 @@ struct nfs_client {
 #define NFS_CS_NO_RETRANS_TIMEOUT      4       /* - Disable retransmit timeouts */
 #define NFS_CS_TSM_POSSIBLE    5               /* - Maybe state migration */
 #define NFS_CS_NOPING          6               /* - don't ping on connect */
+#define NFS_CS_DS              7               /* - Server is a DS */
        struct sockaddr_storage cl_addr;        /* server identifier */
        size_t                  cl_addrlen;
        char *                  cl_hostname;    /* hostname of server */