NFSv3: Client-side nfsacl caching fix
authorAndreas Gruenbacher <agruen@suse.de>
Thu, 25 May 2006 05:41:03 +0000 (01:41 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 9 Jun 2006 13:34:11 +0000 (09:34 -0400)
Fix two errors in the client-side acl cache: First, when nfs3_proc_getacl
requests only the default acl of a file and the access acl is not cached
already, a NULL access acl entry is cached instead of ERR_PTR(-EAGAIN)
("not cached").

Second, update the cached acls in nfs3_proc_setacls: nfs_refresh_inode does
not always invalidate the cached acls, and when it does not, the cached acls
get out of sync.

Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/nfs3acl.c

index 33287879bd23547e33c953e19efdf4603cf059e1..7322da4d2055a76b1c9097181241a9bbf8023d9d 100644 (file)
@@ -172,8 +172,10 @@ static void nfs3_cache_acls(struct inode *inode, struct posix_acl *acl,
                inode->i_ino, acl, dfacl);
        spin_lock(&inode->i_lock);
        __nfs3_forget_cached_acls(NFS_I(inode));
-       nfsi->acl_access = posix_acl_dup(acl);
-       nfsi->acl_default = posix_acl_dup(dfacl);
+       if (!IS_ERR(acl))
+               nfsi->acl_access = posix_acl_dup(acl);
+       if (!IS_ERR(dfacl))
+               nfsi->acl_default = posix_acl_dup(dfacl);
        spin_unlock(&inode->i_lock);
 }
 
@@ -254,7 +256,9 @@ struct posix_acl *nfs3_proc_getacl(struct inode *inode, int type)
                        res.acl_access = NULL;
                }
        }
-       nfs3_cache_acls(inode, res.acl_access, res.acl_default);
+       nfs3_cache_acls(inode,
+               (res.mask & NFS_ACL)   ? res.acl_access  : ERR_PTR(-EINVAL),
+               (res.mask & NFS_DFACL) ? res.acl_default : ERR_PTR(-EINVAL));
 
        switch(type) {
                case ACL_TYPE_ACCESS:
@@ -329,6 +333,7 @@ static int nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl,
        switch (status) {
                case 0:
                        status = nfs_refresh_inode(inode, &fattr);
+                       nfs3_cache_acls(inode, acl, dfacl);
                        break;
                case -EPFNOSUPPORT:
                case -EPROTONOSUPPORT: