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: Christoph Hellwig <hch@lst.de>
Reported-by: Philippe Troin <phil@fifi.org>
Tested-by: Philippe Troin <phil@fifi.org>
Fixes: 013cdf1088
(nfs: use generic posix ACL infrastructure ...)
Cc: stable@vger.kernel.org # 3.14+
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
Родитель
66b0686049
Коммит
74adf83f5d
|
@ -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 = {
|
||||||
.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 = {
|
||||||
.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,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче