Message ID | 20191121160651.5317-1-olga.kornievskaia@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] NFS: allow deprecation of NFS UDP protocol | expand |
hi Olga, On 21/11/2019 4:06 pm, Olga Kornievskaia wrote: > From: Olga Kornievskaia <kolga@netapp.com> > > 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> > --- > fs/nfs/Kconfig | 10 ++++++++++ > fs/nfs/client.c | 4 ++++ > fs/nfs/super.c | 4 ++++ > 3 files changed, 18 insertions(+) > > diff --git a/fs/nfs/Kconfig b/fs/nfs/Kconfig > index 295a7a2..ba5a681 100644 > --- a/fs/nfs/Kconfig > +++ b/fs/nfs/Kconfig > @@ -196,3 +196,13 @@ 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. > + The default is N because many deployments still use UDP. You've changed the default to 'y' for v2, but you've left in the 'N' comment. > diff --git a/fs/nfs/client.c b/fs/nfs/client.c > index 02110a3..24ca314 100644 > --- a/fs/nfs/client.c > +++ b/fs/nfs/client.c > @@ -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; > +#ifdef 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 Should the first two of your added ifdefs be ifndefs? cheers, calum. > default: > BUG(); > } > @@ -580,8 +582,10 @@ static int nfs_start_lockd(struct nfs_server *server) > default: > nlm_init.protocol = IPPROTO_TCP; > break; > +#ifdef CONFIG_NFS_DISABLE_UDP_SUPPORT > case XPRT_TRANSPORT_UDP: > nlm_init.protocol = IPPROTO_UDP; > +#endif > } > > host = nlmclnt_init(&nlm_init); > diff --git a/fs/nfs/super.c b/fs/nfs/super.c > index a84df7d6..f68346d 100644 > --- a/fs/nfs/super.c > +++ b/fs/nfs/super.c > @@ -2204,6 +2204,10 @@ static int nfs_validate_text_mount_data(void *options, > #endif /* CONFIG_NFS_V4 */ > } else { > nfs_set_mount_transport_protocol(args); > +#ifdef CONFIG_NFS_DISABLE_UDP_SUPPORT > + if (args->nfs_server.protocol == XPRT_TRANSPORT_UDP) > + goto out_invalid_transport_udp; > +#endif > if (args->nfs_server.protocol == XPRT_TRANSPORT_RDMA) > port = NFS_RDMA_PORT; > } >
Hi Olga, Calum, ... > > +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. > > + The default is N because many deployments still use UDP. > You've changed the default to 'y' for v2, but you've left in the 'N' > comment. +1 > > diff --git a/fs/nfs/client.c b/fs/nfs/client.c > > index 02110a3..24ca314 100644 > > --- a/fs/nfs/client.c > > +++ b/fs/nfs/client.c > > @@ -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; > > +#ifdef 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 > Should the first two of your added ifdefs be ifndefs? +1 ... Other changes LGTM. Kind regards, Petr
diff --git a/fs/nfs/Kconfig b/fs/nfs/Kconfig index 295a7a2..ba5a681 100644 --- a/fs/nfs/Kconfig +++ b/fs/nfs/Kconfig @@ -196,3 +196,13 @@ 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. + The default is N because many deployments still use UDP. diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 02110a3..24ca314 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c @@ -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; +#ifdef 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; +#ifdef CONFIG_NFS_DISABLE_UDP_SUPPORT case XPRT_TRANSPORT_UDP: nlm_init.protocol = IPPROTO_UDP; +#endif } host = nlmclnt_init(&nlm_init); diff --git a/fs/nfs/super.c b/fs/nfs/super.c index a84df7d6..f68346d 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -2204,6 +2204,10 @@ static int nfs_validate_text_mount_data(void *options, #endif /* CONFIG_NFS_V4 */ } else { nfs_set_mount_transport_protocol(args); +#ifdef CONFIG_NFS_DISABLE_UDP_SUPPORT + if (args->nfs_server.protocol == XPRT_TRANSPORT_UDP) + goto out_invalid_transport_udp; +#endif if (args->nfs_server.protocol == XPRT_TRANSPORT_RDMA) port = NFS_RDMA_PORT; }