Skip to content

Commit 51c0d4f

Browse files
jtlaytonchucklever
authored andcommitted
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 <[email protected]> Signed-off-by: Chuck Lever <[email protected]>
1 parent fbd5573 commit 51c0d4f

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

fs/nfsd/nfs4xdr.c

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
#include "netns.h"
5656
#include "pnfs.h"
5757
#include "filecache.h"
58+
#include "nfs4xdr_gen.h"
5859

5960
#include "trace.h"
6061

@@ -3388,6 +3389,54 @@ static __be32 nfsd4_encode_fattr4_xattr_support(struct xdr_stream *xdr,
33883389
return nfsd4_encode_bool(xdr, err == 0);
33893390
}
33903391

3392+
#define NFSD_OA_SHARE_ACCESS (BIT(OPEN_ARGS_SHARE_ACCESS_READ) | \
3393+
BIT(OPEN_ARGS_SHARE_ACCESS_WRITE) | \
3394+
BIT(OPEN_ARGS_SHARE_ACCESS_BOTH))
3395+
3396+
#define NFSD_OA_SHARE_DENY (BIT(OPEN_ARGS_SHARE_DENY_NONE) | \
3397+
BIT(OPEN_ARGS_SHARE_DENY_READ) | \
3398+
BIT(OPEN_ARGS_SHARE_DENY_WRITE) | \
3399+
BIT(OPEN_ARGS_SHARE_DENY_BOTH))
3400+
3401+
#define NFSD_OA_SHARE_ACCESS_WANT (BIT(OPEN_ARGS_SHARE_ACCESS_WANT_ANY_DELEG) | \
3402+
BIT(OPEN_ARGS_SHARE_ACCESS_WANT_NO_DELEG) | \
3403+
BIT(OPEN_ARGS_SHARE_ACCESS_WANT_CANCEL))
3404+
3405+
#define NFSD_OA_OPEN_CLAIM (BIT(OPEN_ARGS_OPEN_CLAIM_NULL) | \
3406+
BIT(OPEN_ARGS_OPEN_CLAIM_PREVIOUS) | \
3407+
BIT(OPEN_ARGS_OPEN_CLAIM_DELEGATE_CUR) | \
3408+
BIT(OPEN_ARGS_OPEN_CLAIM_DELEGATE_PREV)| \
3409+
BIT(OPEN_ARGS_OPEN_CLAIM_FH) | \
3410+
BIT(OPEN_ARGS_OPEN_CLAIM_DELEG_CUR_FH) | \
3411+
BIT(OPEN_ARGS_OPEN_CLAIM_DELEG_PREV_FH))
3412+
3413+
#define NFSD_OA_CREATE_MODE (BIT(OPEN_ARGS_CREATEMODE_UNCHECKED4) | \
3414+
BIT(OPEN_ARGS_CREATE_MODE_GUARDED) | \
3415+
BIT(OPEN_ARGS_CREATEMODE_EXCLUSIVE4) | \
3416+
BIT(OPEN_ARGS_CREATE_MODE_EXCLUSIVE4_1))
3417+
3418+
static uint32_t oa_share_access = NFSD_OA_SHARE_ACCESS;
3419+
static uint32_t oa_share_deny = NFSD_OA_SHARE_DENY;
3420+
static uint32_t oa_share_access_want = NFSD_OA_SHARE_ACCESS_WANT;
3421+
static uint32_t oa_open_claim = NFSD_OA_OPEN_CLAIM;
3422+
static uint32_t oa_create_mode = NFSD_OA_CREATE_MODE;
3423+
3424+
static const struct open_arguments4 nfsd_open_arguments = {
3425+
.oa_share_access = { .count = 1, .element = &oa_share_access },
3426+
.oa_share_deny = { .count = 1, .element = &oa_share_deny },
3427+
.oa_share_access_want = { .count = 1, .element = &oa_share_access_want },
3428+
.oa_open_claim = { .count = 1, .element = &oa_open_claim },
3429+
.oa_create_mode = { .count = 1, .element = &oa_create_mode },
3430+
};
3431+
3432+
static __be32 nfsd4_encode_fattr4_open_arguments(struct xdr_stream *xdr,
3433+
const struct nfsd4_fattr_args *args)
3434+
{
3435+
if (!xdrgen_encode_fattr4_open_arguments(xdr, &nfsd_open_arguments))
3436+
return nfserr_resource;
3437+
return nfs_ok;
3438+
}
3439+
33913440
static const nfsd4_enc_attr nfsd4_enc_fattr4_encode_ops[] = {
33923441
[FATTR4_SUPPORTED_ATTRS] = nfsd4_encode_fattr4_supported_attrs,
33933442
[FATTR4_TYPE] = nfsd4_encode_fattr4_type,
@@ -3488,6 +3537,7 @@ static const nfsd4_enc_attr nfsd4_enc_fattr4_encode_ops[] = {
34883537

34893538
[FATTR4_MODE_UMASK] = nfsd4_encode_fattr4__noop,
34903539
[FATTR4_XATTR_SUPPORT] = nfsd4_encode_fattr4_xattr_support,
3540+
[FATTR4_OPEN_ARGUMENTS] = nfsd4_encode_fattr4_open_arguments,
34913541
};
34923542

34933543
/*

fs/nfsd/nfsd.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,8 @@ enum {
455455
(NFSD4_1_SUPPORTED_ATTRS_WORD2 | \
456456
FATTR4_WORD2_MODE_UMASK | \
457457
NFSD4_2_SECURITY_ATTRS | \
458-
FATTR4_WORD2_XATTR_SUPPORT)
458+
FATTR4_WORD2_XATTR_SUPPORT | \
459+
FATTR4_WORD2_OPEN_ARGUMENTS)
459460

460461
extern const u32 nfsd_suppattrs[3][3];
461462

0 commit comments

Comments
 (0)