From eea5de8e26016efa241847d73346413b7f9f3deb Mon Sep 17 00:00:00 2001 From: Thomas Lamprecht Date: Thu, 5 May 2022 13:53:12 +0200 Subject: [PATCH] cherry pick "NFSv4.1 provide mount option to toggle trunking discovery" we got lots of reports with QNAP NFS being broken, and the commit this cherry picked one fixes got backported to 5.15 by canonical, so its def. worth a try. Signed-off-by: Thomas Lamprecht --- ...mount-option-to-toggle-trunking-disc.patch | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 patches/kernel/0013-NFSv4.1-provide-mount-option-to-toggle-trunking-disc.patch diff --git a/patches/kernel/0013-NFSv4.1-provide-mount-option-to-toggle-trunking-disc.patch b/patches/kernel/0013-NFSv4.1-provide-mount-option-to-toggle-trunking-disc.patch new file mode 100644 index 0000000..91712a5 --- /dev/null +++ b/patches/kernel/0013-NFSv4.1-provide-mount-option-to-toggle-trunking-disc.patch @@ -0,0 +1,81 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Olga Kornievskaia +Date: Wed, 16 Mar 2022 18:24:26 -0400 +Subject: [PATCH] NFSv4.1 provide mount option to toggle trunking discovery + +Introduce a new mount option -- trunkdiscovery,notrunkdiscovery -- to +toggle whether or not the client will engage in actively discovery +of trunking locations. + +v2 make notrunkdiscovery default + +Signed-off-by: Olga Kornievskaia +Fixes: 1976b2b31462 ("NFSv4.1 query for fs_location attr on a new file system") +Signed-off-by: Trond Myklebust +(cherry picked from commit a43bf604446414103b7535f38e739b65601c4fb2) +Signed-off-by: Thomas Lamprecht +--- + fs/nfs/client.c | 3 ++- + fs/nfs/fs_context.c | 8 ++++++++ + include/linux/nfs_fs_sb.h | 1 + + 3 files changed, 11 insertions(+), 1 deletion(-) + +diff --git a/fs/nfs/client.c b/fs/nfs/client.c +index 090b16890e3d..f303e96ce165 100644 +--- a/fs/nfs/client.c ++++ b/fs/nfs/client.c +@@ -861,7 +861,8 @@ int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *mntfh, struct nfs + } + + if (clp->rpc_ops->discover_trunking != NULL && +- (server->caps & NFS_CAP_FS_LOCATIONS)) { ++ (server->caps & NFS_CAP_FS_LOCATIONS && ++ (server->flags & NFS_MOUNT_TRUNK_DISCOVERY))) { + error = clp->rpc_ops->discover_trunking(server, mntfh); + if (error < 0) + return error; +diff --git a/fs/nfs/fs_context.c b/fs/nfs/fs_context.c +index 0d444a90f513..da5217abc2e5 100644 +--- a/fs/nfs/fs_context.c ++++ b/fs/nfs/fs_context.c +@@ -79,6 +79,7 @@ enum nfs_param { + Opt_source, + Opt_tcp, + Opt_timeo, ++ Opt_trunkdiscovery, + Opt_udp, + Opt_v, + Opt_vers, +@@ -179,6 +180,7 @@ static const struct fs_parameter_spec nfs_fs_parameters[] = { + fsparam_string("source", Opt_source), + fsparam_flag ("tcp", Opt_tcp), + fsparam_u32 ("timeo", Opt_timeo), ++ fsparam_flag_no("trunkdiscovery", Opt_trunkdiscovery), + fsparam_flag ("udp", Opt_udp), + fsparam_flag ("v2", Opt_v), + fsparam_flag ("v3", Opt_v), +@@ -528,6 +530,12 @@ static int nfs_fs_context_parse_param(struct fs_context *fc, + else + ctx->flags &= ~NFS_MOUNT_NOCTO; + break; ++ case Opt_trunkdiscovery: ++ if (result.negated) ++ ctx->flags &= ~NFS_MOUNT_TRUNK_DISCOVERY; ++ else ++ ctx->flags |= NFS_MOUNT_TRUNK_DISCOVERY; ++ break; + case Opt_ac: + if (result.negated) + ctx->flags |= NFS_MOUNT_NOAC; +diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h +index 9a6e70ccde56..10c347416dd2 100644 +--- a/include/linux/nfs_fs_sb.h ++++ b/include/linux/nfs_fs_sb.h +@@ -156,6 +156,7 @@ struct nfs_server { + #define NFS_MOUNT_SOFTREVAL 0x800000 + #define NFS_MOUNT_WRITE_EAGER 0x01000000 + #define NFS_MOUNT_WRITE_WAIT 0x02000000 ++#define NFS_MOUNT_TRUNK_DISCOVERY 0x04000000 + + unsigned int fattr_valid; /* Valid attributes */ + unsigned int caps; /* server capabilities */