]> git.baikalelectronics.ru Git - kernel.git/commitdiff
NFS: allow deprecation of NFS UDP protocol
authorOlga Kornievskaia <olga.kornievskaia@gmail.com>
Mon, 16 Dec 2019 21:34:02 +0000 (16:34 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Fri, 24 Jan 2020 21:51:13 +0000 (16:51 -0500)
Add a kernel config CONFIG_NFS_DISABLE_UDP_SUPPORT to disallow NFS
UDP mounts and enable it by default.

Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/Kconfig
fs/nfs/client.c
fs/nfs/fs_context.c

index e7dd07f47825939ec9ecf04b3d79ef991149a7ed..40b6c5ac46c0cc17c621eddfa17ec7f514bdce88 100644 (file)
@@ -196,3 +196,12 @@ config NFS_DEBUG
        depends on NFS_FS && SUNRPC_DEBUG
        select CRC32
        default y
+
+config NFS_DISABLE_UDP_SUPPORT
+       bool "NFS: Disable NFS UDP protocol support"
+       depends on NFS_FS
+       default y
+       help
+        Choose Y here to disable the use of NFS over UDP. NFS over UDP
+        on modern networks (1Gb+) can lead to data corruption caused by
+        fragmentation during high loads.
index 8f760f23748c6d5ab47c86f67abe6433c709d8ff..989c30c98511d9d8404803803e4d1a9b7a462a9a 100644 (file)
@@ -474,6 +474,7 @@ void nfs_init_timeout_values(struct rpc_timeout *to, int proto,
                        to->to_maxval = to->to_initval;
                to->to_exponential = 0;
                break;
+#ifndef CONFIG_NFS_DISABLE_UDP_SUPPORT
        case XPRT_TRANSPORT_UDP:
                if (retrans == NFS_UNSPEC_RETRANS)
                        to->to_retries = NFS_DEF_UDP_RETRANS;
@@ -484,6 +485,7 @@ void nfs_init_timeout_values(struct rpc_timeout *to, int proto,
                to->to_maxval = NFS_MAX_UDP_TIMEOUT;
                to->to_exponential = 1;
                break;
+#endif
        default:
                BUG();
        }
@@ -580,8 +582,10 @@ static int nfs_start_lockd(struct nfs_server *server)
                default:
                        nlm_init.protocol = IPPROTO_TCP;
                        break;
+#ifndef CONFIG_NFS_DISABLE_UDP_SUPPORT
                case XPRT_TRANSPORT_UDP:
                        nlm_init.protocol = IPPROTO_UDP;
+#endif
        }
 
        host = nlmclnt_init(&nlm_init);
index 0247dcb7b316217ec06b56d1fb93c9c5125dc72a..dfd95847f005acf8e3b228e5c5610f0e7587b2fb 100644 (file)
@@ -1215,6 +1215,10 @@ static int nfs_fs_context_validate(struct fs_context *fc)
                }
        } else {
                nfs_set_mount_transport_protocol(ctx);
+#ifdef CONFIG_NFS_DISABLE_UDP_SUPPORT
+              if (ctx->nfs_server.protocol == XPRT_TRANSPORT_UDP)
+                      goto out_invalid_transport_udp;
+#endif
                if (ctx->nfs_server.protocol == XPRT_TRANSPORT_RDMA)
                        port = NFS_RDMA_PORT;
        }