nfsd: improve stateid access bitmask documentation

The use of the bitmaps is confusing.  Add a cross-reference to make it
easier to find the existing comment.  Add an updated reference with URL
to make it quicker to look up.  And a bit more editorializing about the
value of this.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
J. Bruce Fields 2021-12-07 17:32:21 -05:00 committed by Chuck Lever
parent 70e94d757b
commit 3dcd1d8aab
2 changed files with 14 additions and 4 deletions

View File

@ -360,11 +360,13 @@ static const struct nfsd4_callback_ops nfsd4_cb_notify_lock_ops = {
* st_{access,deny}_bmap field of the stateid, in order to track not * st_{access,deny}_bmap field of the stateid, in order to track not
* only what share bits are currently in force, but also what * only what share bits are currently in force, but also what
* combinations of share bits previous opens have used. This allows us * combinations of share bits previous opens have used. This allows us
* to enforce the recommendation of rfc 3530 14.2.19 that the server * to enforce the recommendation in
* return an error if the client attempt to downgrade to a combination * https://datatracker.ietf.org/doc/html/rfc7530#section-16.19.4 that
* of share bits not explicable by closing some of its previous opens. * the server return an error if the client attempt to downgrade to a
* combination of share bits not explicable by closing some of its
* previous opens.
* *
* XXX: This enforcement is actually incomplete, since we don't keep * This enforcement is arguably incomplete, since we don't keep
* track of access/deny bit combinations; so, e.g., we allow: * track of access/deny bit combinations; so, e.g., we allow:
* *
* OPEN allow read, deny write * OPEN allow read, deny write
@ -372,6 +374,10 @@ static const struct nfsd4_callback_ops nfsd4_cb_notify_lock_ops = {
* DOWNGRADE allow read, deny none * DOWNGRADE allow read, deny none
* *
* which we should reject. * which we should reject.
*
* But you could also argue that our current code is already overkill,
* since it only exists to return NFS4ERR_INVAL on incorrect client
* behavior.
*/ */
static unsigned int static unsigned int
bmap_to_share_mode(unsigned long bmap) bmap_to_share_mode(unsigned long bmap)

View File

@ -568,6 +568,10 @@ struct nfs4_ol_stateid {
struct list_head st_locks; struct list_head st_locks;
struct nfs4_stateowner *st_stateowner; struct nfs4_stateowner *st_stateowner;
struct nfs4_clnt_odstate *st_clnt_odstate; struct nfs4_clnt_odstate *st_clnt_odstate;
/*
* These bitmasks use 3 separate bits for READ, ALLOW, and BOTH; see the
* comment above bmap_to_share_mode() for explanation:
*/
unsigned char st_access_bmap; unsigned char st_access_bmap;
unsigned char st_deny_bmap; unsigned char st_deny_bmap;
struct nfs4_ol_stateid *st_openstp; struct nfs4_ol_stateid *st_openstp;