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:
		
					parent
					
						
							
								66b0686049
							
						
					
				
			
			
				commit
				
					
						74adf83f5d
					
				
			
		
					 2 changed files with 45 additions and 2 deletions
				
			
		|  | @ -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; | ||||
| } | ||||
|  |  | |||
|  | @ -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, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Christoph Hellwig
				Christoph Hellwig