nfsd4: make op_cacheresult another flag
I'm not sure why I used a new field for this originally. Also, the differences between some of these flags are a little subtle; add some comments to explain. Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
parent
3d02fa29de
commit
c856694e3d
@ -1013,14 +1013,15 @@ enum nfsd4_op_flags {
|
|||||||
/* For rfc 5661 section 2.6.3.1.1: */
|
/* For rfc 5661 section 2.6.3.1.1: */
|
||||||
OP_HANDLES_WRONGSEC = 1 << 3,
|
OP_HANDLES_WRONGSEC = 1 << 3,
|
||||||
OP_IS_PUTFH_LIKE = 1 << 4,
|
OP_IS_PUTFH_LIKE = 1 << 4,
|
||||||
OP_MODIFIES_SOMETHING = 1 << 5, /* op is non-idempotent */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct nfsd4_operation {
|
|
||||||
nfsd4op_func op_func;
|
|
||||||
u32 op_flags;
|
|
||||||
char *op_name;
|
|
||||||
/*
|
/*
|
||||||
|
* These are the ops whose result size we estimate before
|
||||||
|
* encoding, to avoid performing an op then not being able to
|
||||||
|
* respond or cache a response. This includes writes and setattrs
|
||||||
|
* as well as the operations usually called "nonidempotent":
|
||||||
|
*/
|
||||||
|
OP_MODIFIES_SOMETHING = 1 << 5,
|
||||||
|
/*
|
||||||
|
* Cache compounds containing these ops in the xid-based drc:
|
||||||
* We use the DRC for compounds containing non-idempotent
|
* We use the DRC for compounds containing non-idempotent
|
||||||
* operations, *except* those that are 4.1-specific (since
|
* operations, *except* those that are 4.1-specific (since
|
||||||
* sessions provide their own EOS), and except for stateful
|
* sessions provide their own EOS), and except for stateful
|
||||||
@ -1028,7 +1029,13 @@ struct nfsd4_operation {
|
|||||||
* (since sequence numbers provide EOS for open, lock, etc in
|
* (since sequence numbers provide EOS for open, lock, etc in
|
||||||
* the v4.0 case).
|
* the v4.0 case).
|
||||||
*/
|
*/
|
||||||
bool op_cacheresult;
|
OP_CACHEME = 1 << 6,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct nfsd4_operation {
|
||||||
|
nfsd4op_func op_func;
|
||||||
|
u32 op_flags;
|
||||||
|
char *op_name;
|
||||||
/* Try to get response size before operation */
|
/* Try to get response size before operation */
|
||||||
nfsd4op_rsize op_rsize_bop;
|
nfsd4op_rsize op_rsize_bop;
|
||||||
};
|
};
|
||||||
@ -1077,7 +1084,7 @@ static inline struct nfsd4_operation *OPDESC(struct nfsd4_op *op)
|
|||||||
|
|
||||||
bool nfsd4_cache_this_op(struct nfsd4_op *op)
|
bool nfsd4_cache_this_op(struct nfsd4_op *op)
|
||||||
{
|
{
|
||||||
return OPDESC(op)->op_cacheresult;
|
return OPDESC(op)->op_flags & OP_CACHEME;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool need_wrongsec_check(struct svc_rqst *rqstp)
|
static bool need_wrongsec_check(struct svc_rqst *rqstp)
|
||||||
@ -1420,9 +1427,8 @@ static struct nfsd4_operation nfsd4_ops[] = {
|
|||||||
},
|
},
|
||||||
[OP_CREATE] = {
|
[OP_CREATE] = {
|
||||||
.op_func = (nfsd4op_func)nfsd4_create,
|
.op_func = (nfsd4op_func)nfsd4_create,
|
||||||
.op_flags = OP_MODIFIES_SOMETHING,
|
.op_flags = OP_MODIFIES_SOMETHING | OP_CACHEME,
|
||||||
.op_name = "OP_CREATE",
|
.op_name = "OP_CREATE",
|
||||||
.op_cacheresult = true,
|
|
||||||
.op_rsize_bop = (nfsd4op_rsize)nfsd4_create_rsize,
|
.op_rsize_bop = (nfsd4op_rsize)nfsd4_create_rsize,
|
||||||
},
|
},
|
||||||
[OP_DELEGRETURN] = {
|
[OP_DELEGRETURN] = {
|
||||||
@ -1442,9 +1448,9 @@ static struct nfsd4_operation nfsd4_ops[] = {
|
|||||||
},
|
},
|
||||||
[OP_LINK] = {
|
[OP_LINK] = {
|
||||||
.op_func = (nfsd4op_func)nfsd4_link,
|
.op_func = (nfsd4op_func)nfsd4_link,
|
||||||
.op_flags = ALLOWED_ON_ABSENT_FS | OP_MODIFIES_SOMETHING,
|
.op_flags = ALLOWED_ON_ABSENT_FS | OP_MODIFIES_SOMETHING
|
||||||
|
| OP_CACHEME,
|
||||||
.op_name = "OP_LINK",
|
.op_name = "OP_LINK",
|
||||||
.op_cacheresult = true,
|
|
||||||
.op_rsize_bop = (nfsd4op_rsize)nfsd4_link_rsize,
|
.op_rsize_bop = (nfsd4op_rsize)nfsd4_link_rsize,
|
||||||
},
|
},
|
||||||
[OP_LOCK] = {
|
[OP_LOCK] = {
|
||||||
@ -1534,16 +1540,14 @@ static struct nfsd4_operation nfsd4_ops[] = {
|
|||||||
},
|
},
|
||||||
[OP_REMOVE] = {
|
[OP_REMOVE] = {
|
||||||
.op_func = (nfsd4op_func)nfsd4_remove,
|
.op_func = (nfsd4op_func)nfsd4_remove,
|
||||||
.op_flags = OP_MODIFIES_SOMETHING,
|
.op_flags = OP_MODIFIES_SOMETHING | OP_CACHEME,
|
||||||
.op_name = "OP_REMOVE",
|
.op_name = "OP_REMOVE",
|
||||||
.op_cacheresult = true,
|
|
||||||
.op_rsize_bop = (nfsd4op_rsize)nfsd4_remove_rsize,
|
.op_rsize_bop = (nfsd4op_rsize)nfsd4_remove_rsize,
|
||||||
},
|
},
|
||||||
[OP_RENAME] = {
|
[OP_RENAME] = {
|
||||||
.op_func = (nfsd4op_func)nfsd4_rename,
|
.op_func = (nfsd4op_func)nfsd4_rename,
|
||||||
.op_flags = OP_MODIFIES_SOMETHING,
|
.op_flags = OP_MODIFIES_SOMETHING | OP_CACHEME,
|
||||||
.op_name = "OP_RENAME",
|
.op_name = "OP_RENAME",
|
||||||
.op_cacheresult = true,
|
|
||||||
.op_rsize_bop = (nfsd4op_rsize)nfsd4_rename_rsize,
|
.op_rsize_bop = (nfsd4op_rsize)nfsd4_rename_rsize,
|
||||||
},
|
},
|
||||||
[OP_RENEW] = {
|
[OP_RENEW] = {
|
||||||
@ -1575,24 +1579,21 @@ static struct nfsd4_operation nfsd4_ops[] = {
|
|||||||
[OP_SETATTR] = {
|
[OP_SETATTR] = {
|
||||||
.op_func = (nfsd4op_func)nfsd4_setattr,
|
.op_func = (nfsd4op_func)nfsd4_setattr,
|
||||||
.op_name = "OP_SETATTR",
|
.op_name = "OP_SETATTR",
|
||||||
.op_flags = OP_MODIFIES_SOMETHING,
|
.op_flags = OP_MODIFIES_SOMETHING | OP_CACHEME,
|
||||||
.op_cacheresult = true,
|
|
||||||
.op_rsize_bop = (nfsd4op_rsize)nfsd4_setattr_rsize,
|
.op_rsize_bop = (nfsd4op_rsize)nfsd4_setattr_rsize,
|
||||||
},
|
},
|
||||||
[OP_SETCLIENTID] = {
|
[OP_SETCLIENTID] = {
|
||||||
.op_func = (nfsd4op_func)nfsd4_setclientid,
|
.op_func = (nfsd4op_func)nfsd4_setclientid,
|
||||||
.op_flags = ALLOWED_WITHOUT_FH | ALLOWED_ON_ABSENT_FS
|
.op_flags = ALLOWED_WITHOUT_FH | ALLOWED_ON_ABSENT_FS
|
||||||
| OP_MODIFIES_SOMETHING,
|
| OP_MODIFIES_SOMETHING | OP_CACHEME,
|
||||||
.op_name = "OP_SETCLIENTID",
|
.op_name = "OP_SETCLIENTID",
|
||||||
.op_cacheresult = true,
|
|
||||||
.op_rsize_bop = (nfsd4op_rsize)nfsd4_setclientid_rsize,
|
.op_rsize_bop = (nfsd4op_rsize)nfsd4_setclientid_rsize,
|
||||||
},
|
},
|
||||||
[OP_SETCLIENTID_CONFIRM] = {
|
[OP_SETCLIENTID_CONFIRM] = {
|
||||||
.op_func = (nfsd4op_func)nfsd4_setclientid_confirm,
|
.op_func = (nfsd4op_func)nfsd4_setclientid_confirm,
|
||||||
.op_flags = ALLOWED_WITHOUT_FH | ALLOWED_ON_ABSENT_FS
|
.op_flags = ALLOWED_WITHOUT_FH | ALLOWED_ON_ABSENT_FS
|
||||||
| OP_MODIFIES_SOMETHING,
|
| OP_MODIFIES_SOMETHING | OP_CACHEME,
|
||||||
.op_name = "OP_SETCLIENTID_CONFIRM",
|
.op_name = "OP_SETCLIENTID_CONFIRM",
|
||||||
.op_cacheresult = true,
|
|
||||||
.op_rsize_bop = (nfsd4op_rsize)nfsd4_only_status_rsize,
|
.op_rsize_bop = (nfsd4op_rsize)nfsd4_only_status_rsize,
|
||||||
},
|
},
|
||||||
[OP_VERIFY] = {
|
[OP_VERIFY] = {
|
||||||
@ -1601,9 +1602,8 @@ static struct nfsd4_operation nfsd4_ops[] = {
|
|||||||
},
|
},
|
||||||
[OP_WRITE] = {
|
[OP_WRITE] = {
|
||||||
.op_func = (nfsd4op_func)nfsd4_write,
|
.op_func = (nfsd4op_func)nfsd4_write,
|
||||||
.op_flags = OP_MODIFIES_SOMETHING,
|
.op_flags = OP_MODIFIES_SOMETHING | OP_CACHEME,
|
||||||
.op_name = "OP_WRITE",
|
.op_name = "OP_WRITE",
|
||||||
.op_cacheresult = true,
|
|
||||||
.op_rsize_bop = (nfsd4op_rsize)nfsd4_write_rsize,
|
.op_rsize_bop = (nfsd4op_rsize)nfsd4_write_rsize,
|
||||||
},
|
},
|
||||||
[OP_RELEASE_LOCKOWNER] = {
|
[OP_RELEASE_LOCKOWNER] = {
|
||||||
|
Loading…
Reference in New Issue
Block a user