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

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
...@@ -247,3 +247,46 @@ const struct xattr_handler *nfs3_xattr_handlers[] = { ...@@ -247,3 +247,46 @@ const struct xattr_handler *nfs3_xattr_handlers[] = {
&posix_acl_default_xattr_handler, &posix_acl_default_xattr_handler,
NULL, 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;
}
...@@ -885,7 +885,7 @@ static const struct inode_operations nfs3_dir_inode_operations = { ...@@ -885,7 +885,7 @@ static const struct inode_operations nfs3_dir_inode_operations = {
.getattr = nfs_getattr, .getattr = nfs_getattr,
.setattr = nfs_setattr, .setattr = nfs_setattr,
#ifdef CONFIG_NFS_V3_ACL #ifdef CONFIG_NFS_V3_ACL
.listxattr = generic_listxattr, .listxattr = nfs3_listxattr,
.getxattr = generic_getxattr, .getxattr = generic_getxattr,
.setxattr = generic_setxattr, .setxattr = generic_setxattr,
.removexattr = generic_removexattr, .removexattr = generic_removexattr,
...@@ -899,7 +899,7 @@ static const struct inode_operations nfs3_file_inode_operations = { ...@@ -899,7 +899,7 @@ static const struct inode_operations nfs3_file_inode_operations = {
.getattr = nfs_getattr, .getattr = nfs_getattr,
.setattr = nfs_setattr, .setattr = nfs_setattr,
#ifdef CONFIG_NFS_V3_ACL #ifdef CONFIG_NFS_V3_ACL
.listxattr = generic_listxattr, .listxattr = nfs3_listxattr,
.getxattr = generic_getxattr, .getxattr = generic_getxattr,
.setxattr = generic_setxattr, .setxattr = generic_setxattr,
.removexattr = generic_removexattr, .removexattr = generic_removexattr,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment