Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 74adf83f authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Trond Myklebust
Browse files

nfs: only show Posix ACLs in listxattr if actually present



The big ACL switched nfs to use generic_listxattr, which calls all existing
->list handlers.  Add a custom .listxattr implementation that only lists
the ACLs if they actually are present on the given inode.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reported-by: default avatarPhilippe Troin <phil@fifi.org>
Tested-by: default avatarPhilippe Troin <phil@fifi.org>
Fixes: 013cdf10 (nfs: use generic posix ACL infrastructure ...)
Cc: stable@vger.kernel.org # 3.14+
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent 66b06860
Loading
Loading
Loading
Loading
+43 −0
Original line number Diff line number Diff line
@@ -247,3 +247,46 @@ const struct xattr_handler *nfs3_xattr_handlers[] = {
	&posix_acl_default_xattr_handler,
	NULL,
};

static int
nfs3_list_one_acl(struct inode *inode, int type, const char *name, void *data,
		size_t size, ssize_t *result)
{
	struct posix_acl *acl;
	char *p = data + *result;

	acl = get_acl(inode, type);
	if (!acl)
		return 0;

	posix_acl_release(acl);

	*result += strlen(name);
	*result += 1;
	if (!size)
		return 0;
	if (*result > size)
		return -ERANGE;

	strcpy(p, name);
	return 0;
}

ssize_t
nfs3_listxattr(struct dentry *dentry, char *data, size_t size)
{
	struct inode *inode = dentry->d_inode;
	ssize_t result = 0;
	int error;

	error = nfs3_list_one_acl(inode, ACL_TYPE_ACCESS,
			POSIX_ACL_XATTR_ACCESS, data, size, &result);
	if (error)
		return error;

	error = nfs3_list_one_acl(inode, ACL_TYPE_DEFAULT,
			POSIX_ACL_XATTR_DEFAULT, data, size, &result);
	if (error)
		return error;
	return result;
}
+2 −2
Original line number Diff line number Diff line
@@ -885,7 +885,7 @@ static const struct inode_operations nfs3_dir_inode_operations = {
	.getattr	= nfs_getattr,
	.setattr	= nfs_setattr,
#ifdef CONFIG_NFS_V3_ACL
	.listxattr	= generic_listxattr,
	.listxattr	= nfs3_listxattr,
	.getxattr	= generic_getxattr,
	.setxattr	= generic_setxattr,
	.removexattr	= generic_removexattr,
@@ -899,7 +899,7 @@ static const struct inode_operations nfs3_file_inode_operations = {
	.getattr	= nfs_getattr,
	.setattr	= nfs_setattr,
#ifdef CONFIG_NFS_V3_ACL
	.listxattr	= generic_listxattr,
	.listxattr	= nfs3_listxattr,
	.getxattr	= generic_getxattr,
	.setxattr	= generic_setxattr,
	.removexattr	= generic_removexattr,