NFSv4.2: query the extended attribute access bits
authorFrank van der Linden <fllinden@amazon.com>
Tue, 23 Jun 2020 22:38:58 +0000 (22:38 +0000)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 13 Jul 2020 21:52:45 +0000 (17:52 -0400)
RFC 8276 defines separate ACCESS bits for extended attribute checking.
Query them in nfs_do_access and opendata.

Signed-off-by: Frank van der Linden <fllinden@amazon.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/dir.c
fs/nfs/nfs4proc.c

index f04fc0f..a12f42e 100644 (file)
@@ -2673,6 +2673,10 @@ static int nfs_do_access(struct inode *inode, const struct cred *cred, int mask)
         * Determine which access bits we want to ask for...
         */
        cache.mask = NFS_ACCESS_READ | NFS_ACCESS_MODIFY | NFS_ACCESS_EXTEND;
+       if (nfs_server_capable(inode, NFS_CAP_XATTR)) {
+               cache.mask |= NFS_ACCESS_XAREAD | NFS_ACCESS_XAWRITE |
+                   NFS_ACCESS_XALIST;
+       }
        if (S_ISDIR(inode->i_mode))
                cache.mask |= NFS_ACCESS_DELETE | NFS_ACCESS_LOOKUP;
        else
index 64e0814..c88351f 100644 (file)
@@ -1341,6 +1341,12 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,
                                NFS4_ACCESS_MODIFY |
                                NFS4_ACCESS_EXTEND |
                                NFS4_ACCESS_EXECUTE;
+#ifdef CONFIG_NFS_V4_2
+                       if (server->caps & NFS_CAP_XATTR)
+                               p->o_arg.access |= NFS4_ACCESS_XAREAD |
+                                   NFS4_ACCESS_XAWRITE |
+                                   NFS4_ACCESS_XALIST;
+#endif
                }
        }
        p->o_arg.clientid = server->nfs_client->cl_clientid;