Commit 51c0d4f7 authored by Jeff Layton's avatar Jeff Layton Committed by Chuck Lever
Browse files

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: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent fbd5573d
Loading
Loading
Loading
Loading
+50 −0
Original line number Diff line number Diff line
@@ -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,
};

/*
+2 −1
Original line number Diff line number Diff line
@@ -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];