nfsd: add support for FATTR4_OPEN_ARGUMENTS

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>
This commit is contained in:
Jeff Layton
2024-12-09 16:13:58 -05:00
committed by Chuck Lever
parent fbd5573d0d
commit 51c0d4f7e3
2 changed files with 52 additions and 1 deletions

View 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,
};
/*

View 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];