summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorFrank van der Linden <fllinden@amazon.com>2020-06-24 00:38:58 +0200
committerTrond Myklebust <trond.myklebust@hammerspace.com>2020-07-13 23:52:45 +0200
commit72832a2453d9ca752beedb3a4fb2fc82e375c46c (patch)
treeabf4664b985f2d18d2c3e536ebb57c644dea846e /fs
parentnfs: define nfs_access_get_cached function (diff)
downloadlinux-72832a2453d9ca752beedb3a4fb2fc82e375c46c.tar.xz
linux-72832a2453d9ca752beedb3a4fb2fc82e375c46c.zip
NFSv4.2: query the extended attribute access bits
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>
Diffstat (limited to 'fs')
-rw-r--r--fs/nfs/dir.c4
-rw-r--r--fs/nfs/nfs4proc.c6
2 files changed, 10 insertions, 0 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index f04fc0f7843b..a12f42e7d8c7 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -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
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 64e081459327..c88351f8b18d 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -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;