| From 8c39076c276be0b31982e44654e2c2357473258a Mon Sep 17 00:00:00 2001 |
| From: Olga Kornievskaia <kolga@netapp.com> |
| Date: Fri, 16 Oct 2020 09:25:45 -0400 |
| Subject: NFSv4.2: support EXCHGID4_FLAG_SUPP_FENCE_OPS 4.2 EXCHANGE_ID flag |
| |
| From: Olga Kornievskaia <kolga@netapp.com> |
| |
| commit 8c39076c276be0b31982e44654e2c2357473258a upstream. |
| |
| RFC 7862 introduced a new flag that either client or server is |
| allowed to set: EXCHGID4_FLAG_SUPP_FENCE_OPS. |
| |
| Client needs to update its bitmask to allow for this flag value. |
| |
| v2: changed minor version argument to unsigned int |
| |
| Signed-off-by: Olga Kornievskaia <kolga@netapp.com> |
| CC: <stable@vger.kernel.org> |
| Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/nfs/nfs4proc.c | 9 ++++++--- |
| include/uapi/linux/nfs4.h | 3 +++ |
| 2 files changed, 9 insertions(+), 3 deletions(-) |
| |
| --- a/fs/nfs/nfs4proc.c |
| +++ b/fs/nfs/nfs4proc.c |
| @@ -8052,9 +8052,11 @@ int nfs4_proc_secinfo(struct inode *dir, |
| * both PNFS and NON_PNFS flags set, and not having one of NON_PNFS, PNFS, or |
| * DS flags set. |
| */ |
| -static int nfs4_check_cl_exchange_flags(u32 flags) |
| +static int nfs4_check_cl_exchange_flags(u32 flags, u32 version) |
| { |
| - if (flags & ~EXCHGID4_FLAG_MASK_R) |
| + if (version >= 2 && (flags & ~EXCHGID4_2_FLAG_MASK_R)) |
| + goto out_inval; |
| + else if (version < 2 && (flags & ~EXCHGID4_FLAG_MASK_R)) |
| goto out_inval; |
| if ((flags & EXCHGID4_FLAG_USE_PNFS_MDS) && |
| (flags & EXCHGID4_FLAG_USE_NON_PNFS)) |
| @@ -8467,7 +8469,8 @@ static int _nfs4_proc_exchange_id(struct |
| if (status != 0) |
| goto out; |
| |
| - status = nfs4_check_cl_exchange_flags(resp->flags); |
| + status = nfs4_check_cl_exchange_flags(resp->flags, |
| + clp->cl_mvops->minor_version); |
| if (status != 0) |
| goto out; |
| |
| --- a/include/uapi/linux/nfs4.h |
| +++ b/include/uapi/linux/nfs4.h |
| @@ -139,6 +139,8 @@ |
| |
| #define EXCHGID4_FLAG_UPD_CONFIRMED_REC_A 0x40000000 |
| #define EXCHGID4_FLAG_CONFIRMED_R 0x80000000 |
| + |
| +#define EXCHGID4_FLAG_SUPP_FENCE_OPS 0x00000004 |
| /* |
| * Since the validity of these bits depends on whether |
| * they're set in the argument or response, have separate |
| @@ -146,6 +148,7 @@ |
| */ |
| #define EXCHGID4_FLAG_MASK_A 0x40070103 |
| #define EXCHGID4_FLAG_MASK_R 0x80070103 |
| +#define EXCHGID4_2_FLAG_MASK_R 0x80070107 |
| |
| #define SEQ4_STATUS_CB_PATH_DOWN 0x00000001 |
| #define SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRING 0x00000002 |