mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-17 07:50:08 -05:00
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:
@@ -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,
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -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];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user