]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
NFS: Store the raw NFS access mask in the inode's access cache
authorTrond Myklebust <trond.myklebust@primarydata.com>
Tue, 11 Jul 2017 21:54:34 +0000 (17:54 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Fri, 21 Jul 2017 15:51:19 +0000 (11:51 -0400)
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/dir.c
include/linux/nfs_fs.h

index 24b3a6748062b33de1aced7c522b9d39cc7a4cae..8fae8b00b8f5fd2019796375e04aabdb7703357a 100644 (file)
@@ -2399,7 +2399,7 @@ nfs_access_calc_mask(u32 access_result)
 
 void nfs_access_set_mask(struct nfs_access_entry *entry, u32 access_result)
 {
-       entry->mask = nfs_access_calc_mask(access_result);
+       entry->mask = access_result;
 }
 EXPORT_SYMBOL_GPL(nfs_access_set_mask);
 
@@ -2407,6 +2407,7 @@ static int nfs_do_access(struct inode *inode, struct rpc_cred *cred, int mask)
 {
        struct nfs_access_entry cache;
        bool may_block = (mask & MAY_NOT_BLOCK) == 0;
+       int cache_mask;
        int status;
 
        trace_nfs_access_enter(inode);
@@ -2422,7 +2423,8 @@ static int nfs_do_access(struct inode *inode, struct rpc_cred *cred, int mask)
                goto out;
 
        /* Be clever: ask server to check for all possible rights */
-       cache.mask = MAY_EXEC | MAY_WRITE | MAY_READ;
+       cache.mask = NFS_MAY_LOOKUP | NFS_MAY_EXECUTE
+                    | NFS_MAY_WRITE | NFS_MAY_READ;
        cache.cred = cred;
        cache.jiffies = jiffies;
        status = NFS_PROTO(inode)->access(inode, &cache);
@@ -2436,7 +2438,8 @@ static int nfs_do_access(struct inode *inode, struct rpc_cred *cred, int mask)
        }
        nfs_access_add_cache(inode, &cache);
 out_cached:
-       if ((mask & ~cache.mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) != 0)
+       cache_mask = nfs_access_calc_mask(cache.mask);
+       if ((mask & ~cache_mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) != 0)
                status = -EACCES;
 out:
        trace_nfs_access_exit(inode, status);
index e52cc55ac300f56b7ea876fe05d3377163d4f358..5cc91d6381a35ce73d64fbf40743a21ef2876d68 100644 (file)
@@ -51,7 +51,7 @@ struct nfs_access_entry {
        struct list_head        lru;
        unsigned long           jiffies;
        struct rpc_cred *       cred;
-       int                     mask;
+       __u32                   mask;
        struct rcu_head         rcu_head;
 };