nfsd4: clean up downgrading code
authorJ. Bruce Fields <bfields@redhat.com>
Wed, 28 Sep 2011 15:37:56 +0000 (11:37 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Mon, 10 Oct 2011 22:04:45 +0000 (18:04 -0400)
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>
fs/nfsd/nfs4state.c
fs/nfsd/state.h

index 8e253a3476492b7601a541e3d07d6e0c0ea44ce3..683885b18ceba9bb56ca4cadebf87d01b7feb846 100644 (file)
@@ -3523,16 +3523,29 @@ out:
        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++) {
-               if (test_bit(i, &stp->st_access_bmap)
-                                       && ((i & to_access) != i)) {
-                       nfs4_file_put_access(stp->st_file, nfs4_access_to_omode(i));
-                       __clear_bit(i, &stp->st_access_bmap);
-               }
+static inline void nfs4_stateid_downgrade(struct nfs4_ol_stateid *stp, u32 to_access)
+{
+       switch (to_access) {
+       case NFS4_SHARE_ACCESS_READ:
+               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);
                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);
 
index 13f6f9f5ceece45190c261801d6728cc8e6092db..22b065a55ea0bb3a27144529b859485fbb132d07 100644 (file)
@@ -403,9 +403,11 @@ struct nfs4_file {
        /* One each for O_RDONLY, O_WRONLY, O_RDWR: */
        struct file *           fi_fds[3];
        /*
-        * Each open or lock stateid contributes 1 to either
-        * fi_access[O_RDONLY], fi_access[O_WRONLY], or both, depending
-        * on open or lock mode:
+        * Each open or lock stateid contributes 0-4 to the counts
+        * below depending on which bits are set in st_access_bitmap:
+        *     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];
        struct file             *fi_deleg_file;