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: Steve Dickson <steved@redhat.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
@@ -3523,16 +3523,29 @@ out:
|
|||||||
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,
|
|||||||
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 {
|
|||||||
/* 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;
|
||||||
|
Reference in New Issue
Block a user