]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
nfsd: add support for FATTR4_OPEN_ARGUMENTS
authorJeff Layton <jlayton@kernel.org>
Mon, 9 Dec 2024 21:13:58 +0000 (16:13 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Tue, 21 Jan 2025 20:30:01 +0000 (15:30 -0500)
Add support for FATTR4_OPEN_ARGUMENTS. This a new mechanism for the
client to discover what OPEN features the server supports.

Signed-off-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4xdr.c
fs/nfsd/nfsd.h

index 66b1e2c224ffdf039929f0be15429235fd3acae5..147564a74b4650b46938395f893c15530e3d7b7d 100644 (file)
@@ -55,6 +55,7 @@
 #include "netns.h"
 #include "pnfs.h"
 #include "filecache.h"
+#include "nfs4xdr_gen.h"
 
 #include "trace.h"
 
@@ -3388,6 +3389,54 @@ static __be32 nfsd4_encode_fattr4_xattr_support(struct xdr_stream *xdr,
        return nfsd4_encode_bool(xdr, err == 0);
 }
 
+#define NFSD_OA_SHARE_ACCESS   (BIT(OPEN_ARGS_SHARE_ACCESS_READ)       | \
+                                BIT(OPEN_ARGS_SHARE_ACCESS_WRITE)      | \
+                                BIT(OPEN_ARGS_SHARE_ACCESS_BOTH))
+
+#define NFSD_OA_SHARE_DENY     (BIT(OPEN_ARGS_SHARE_DENY_NONE)         | \
+                                BIT(OPEN_ARGS_SHARE_DENY_READ)         | \
+                                BIT(OPEN_ARGS_SHARE_DENY_WRITE)        | \
+                                BIT(OPEN_ARGS_SHARE_DENY_BOTH))
+
+#define NFSD_OA_SHARE_ACCESS_WANT      (BIT(OPEN_ARGS_SHARE_ACCESS_WANT_ANY_DELEG)             | \
+                                        BIT(OPEN_ARGS_SHARE_ACCESS_WANT_NO_DELEG)              | \
+                                        BIT(OPEN_ARGS_SHARE_ACCESS_WANT_CANCEL))
+
+#define NFSD_OA_OPEN_CLAIM     (BIT(OPEN_ARGS_OPEN_CLAIM_NULL)         | \
+                                BIT(OPEN_ARGS_OPEN_CLAIM_PREVIOUS)     | \
+                                BIT(OPEN_ARGS_OPEN_CLAIM_DELEGATE_CUR) | \
+                                BIT(OPEN_ARGS_OPEN_CLAIM_DELEGATE_PREV)| \
+                                BIT(OPEN_ARGS_OPEN_CLAIM_FH)           | \
+                                BIT(OPEN_ARGS_OPEN_CLAIM_DELEG_CUR_FH) | \
+                                BIT(OPEN_ARGS_OPEN_CLAIM_DELEG_PREV_FH))
+
+#define NFSD_OA_CREATE_MODE    (BIT(OPEN_ARGS_CREATEMODE_UNCHECKED4)   | \
+                                BIT(OPEN_ARGS_CREATE_MODE_GUARDED)     | \
+                                BIT(OPEN_ARGS_CREATEMODE_EXCLUSIVE4)   | \
+                                BIT(OPEN_ARGS_CREATE_MODE_EXCLUSIVE4_1))
+
+static uint32_t oa_share_access = NFSD_OA_SHARE_ACCESS;
+static uint32_t oa_share_deny = NFSD_OA_SHARE_DENY;
+static uint32_t oa_share_access_want = NFSD_OA_SHARE_ACCESS_WANT;
+static uint32_t oa_open_claim = NFSD_OA_OPEN_CLAIM;
+static uint32_t oa_create_mode = NFSD_OA_CREATE_MODE;
+
+static const struct open_arguments4 nfsd_open_arguments = {
+       .oa_share_access = { .count = 1, .element = &oa_share_access },
+       .oa_share_deny = { .count = 1, .element = &oa_share_deny },
+       .oa_share_access_want = { .count = 1, .element = &oa_share_access_want },
+       .oa_open_claim = { .count = 1, .element = &oa_open_claim },
+       .oa_create_mode = { .count = 1, .element = &oa_create_mode },
+};
+
+static __be32 nfsd4_encode_fattr4_open_arguments(struct xdr_stream *xdr,
+                                                const struct nfsd4_fattr_args *args)
+{
+       if (!xdrgen_encode_fattr4_open_arguments(xdr, &nfsd_open_arguments))
+               return nfserr_resource;
+       return nfs_ok;
+}
+
 static const nfsd4_enc_attr nfsd4_enc_fattr4_encode_ops[] = {
        [FATTR4_SUPPORTED_ATTRS]        = nfsd4_encode_fattr4_supported_attrs,
        [FATTR4_TYPE]                   = nfsd4_encode_fattr4_type,
@@ -3488,6 +3537,7 @@ static const nfsd4_enc_attr nfsd4_enc_fattr4_encode_ops[] = {
 
        [FATTR4_MODE_UMASK]             = nfsd4_encode_fattr4__noop,
        [FATTR4_XATTR_SUPPORT]          = nfsd4_encode_fattr4_xattr_support,
+       [FATTR4_OPEN_ARGUMENTS]         = nfsd4_encode_fattr4_open_arguments,
 };
 
 /*
index 3eb21e63b9210d5d1b3681165140d7026e0e287b..988df43f6b076fb17e2be5a9509a2a438184906d 100644 (file)
@@ -455,7 +455,8 @@ enum {
        (NFSD4_1_SUPPORTED_ATTRS_WORD2 | \
        FATTR4_WORD2_MODE_UMASK | \
        NFSD4_2_SECURITY_ATTRS | \
-       FATTR4_WORD2_XATTR_SUPPORT)
+       FATTR4_WORD2_XATTR_SUPPORT | \
+       FATTR4_WORD2_OPEN_ARGUMENTS)
 
 extern const u32 nfsd_suppattrs[3][3];