Commit 6409a5a6 authored by J. Bruce Fields's avatar J. Bruce Fields

nfsd4: clean up downgrading code

In response to some review comments, get rid of the somewhat obscure
for-loop with bitops, and improve a comment.
Reported-by: default avatarSteve Dickson <steved@redhat.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 71c3bcd7
...@@ -3523,16 +3523,29 @@ nfsd4_open_confirm(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, ...@@ -3523,16 +3523,29 @@ nfsd4_open_confirm(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
return status; return status;
} }
static inline void nfs4_file_downgrade(struct nfs4_ol_stateid *stp, unsigned int to_access) static inline void nfs4_stateid_downgrade_bit(struct nfs4_ol_stateid *stp, u32 access)
{ {
int i; if (!test_bit(access, &stp->st_access_bmap))
return;
nfs4_file_put_access(stp->st_file, nfs4_access_to_omode(access));
__clear_bit(access, &stp->st_access_bmap);
}
for (i = 1; i < 4; i++) { static inline void nfs4_stateid_downgrade(struct nfs4_ol_stateid *stp, u32 to_access)
if (test_bit(i, &stp->st_access_bmap) {
&& ((i & to_access) != i)) { switch (to_access) {
nfs4_file_put_access(stp->st_file, nfs4_access_to_omode(i)); case NFS4_SHARE_ACCESS_READ:
__clear_bit(i, &stp->st_access_bmap); nfs4_stateid_downgrade_bit(stp, NFS4_SHARE_ACCESS_WRITE);
} nfs4_stateid_downgrade_bit(stp, NFS4_SHARE_ACCESS_BOTH);
break;
case NFS4_SHARE_ACCESS_WRITE:
nfs4_stateid_downgrade_bit(stp, NFS4_SHARE_ACCESS_READ);
nfs4_stateid_downgrade_bit(stp, NFS4_SHARE_ACCESS_BOTH);
break;
case NFS4_SHARE_ACCESS_BOTH:
break;
default:
BUG();
} }
} }
...@@ -3578,7 +3591,7 @@ nfsd4_open_downgrade(struct svc_rqst *rqstp, ...@@ -3578,7 +3591,7 @@ nfsd4_open_downgrade(struct svc_rqst *rqstp,
stp->st_deny_bmap, od->od_share_deny); stp->st_deny_bmap, od->od_share_deny);
goto out; goto out;
} }
nfs4_file_downgrade(stp, od->od_share_access); nfs4_stateid_downgrade(stp, od->od_share_access);
reset_union_bmap_deny(od->od_share_deny, &stp->st_deny_bmap); reset_union_bmap_deny(od->od_share_deny, &stp->st_deny_bmap);
......
...@@ -403,9 +403,11 @@ struct nfs4_file { ...@@ -403,9 +403,11 @@ struct nfs4_file {
/* One each for O_RDONLY, O_WRONLY, O_RDWR: */ /* One each for O_RDONLY, O_WRONLY, O_RDWR: */
struct file * fi_fds[3]; struct file * fi_fds[3];
/* /*
* Each open or lock stateid contributes 1 to either * Each open or lock stateid contributes 0-4 to the counts
* fi_access[O_RDONLY], fi_access[O_WRONLY], or both, depending * below depending on which bits are set in st_access_bitmap:
* on open or lock mode: * 1 to fi_access[O_RDONLY] if NFS4_SHARE_ACCES_READ is set
* + 1 to fi_access[O_WRONLY] if NFS4_SHARE_ACCESS_WRITE is set
* + 1 to both of the above if NFS4_SHARE_ACCESS_BOTH is set.
*/ */
atomic_t fi_access[2]; atomic_t fi_access[2];
struct file *fi_deleg_file; struct file *fi_deleg_file;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment