diff options
Diffstat (limited to 'fs/nfs/nfs4proc.c')
| -rw-r--r-- | fs/nfs/nfs4proc.c | 77 | 
1 files changed, 40 insertions, 37 deletions
| diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 765a03559363..c57d1332c1c8 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -6253,9 +6253,6 @@ static int nfs4_xattr_set_nfs4_acl(const struct xattr_handler *handler,  				   const void *buf, size_t buflen,  				   int flags)  { -	if (strcmp(key, "") != 0) -		return -EINVAL; -  	return nfs4_proc_set_acl(d_inode(dentry), buf, buflen);  } @@ -6263,32 +6260,15 @@ static int nfs4_xattr_get_nfs4_acl(const struct xattr_handler *handler,  				   struct dentry *dentry, const char *key,  				   void *buf, size_t buflen)  { -	if (strcmp(key, "") != 0) -		return -EINVAL; -  	return nfs4_proc_get_acl(d_inode(dentry), buf, buflen);  } -static size_t nfs4_xattr_list_nfs4_acl(const struct xattr_handler *handler, -				       struct dentry *dentry, char *list, -				       size_t list_len, const char *name, -				       size_t name_len) +static bool nfs4_xattr_list_nfs4_acl(struct dentry *dentry)  { -	size_t len = sizeof(XATTR_NAME_NFSV4_ACL); - -	if (!nfs4_server_supports_acls(NFS_SERVER(d_inode(dentry)))) -		return 0; - -	if (list && len <= list_len) -		memcpy(list, XATTR_NAME_NFSV4_ACL, len); -	return len; +	return nfs4_server_supports_acls(NFS_SERVER(d_inode(dentry)));  }  #ifdef CONFIG_NFS_V4_SECURITY_LABEL -static inline int nfs4_server_supports_labels(struct nfs_server *server) -{ -	return server->caps & NFS_CAP_SECURITY_LABEL; -}  static int nfs4_xattr_set_nfs4_label(const struct xattr_handler *handler,  				     struct dentry *dentry, const char *key, @@ -6310,29 +6290,34 @@ static int nfs4_xattr_get_nfs4_label(const struct xattr_handler *handler,  	return -EOPNOTSUPP;  } -static size_t nfs4_xattr_list_nfs4_label(const struct xattr_handler *handler, -					 struct dentry *dentry, char *list, -					 size_t list_len, const char *name, -					 size_t name_len) +static ssize_t +nfs4_listxattr_nfs4_label(struct inode *inode, char *list, size_t list_len)  { -	size_t len = 0; +	int len = 0; -	if (nfs_server_capable(d_inode(dentry), NFS_CAP_SECURITY_LABEL)) { -		len = security_inode_listsecurity(d_inode(dentry), NULL, 0); -		if (list && len <= list_len) -			security_inode_listsecurity(d_inode(dentry), list, len); +	if (nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL)) { +		len = security_inode_listsecurity(inode, list, list_len); +		if (list_len && len > list_len) +			return -ERANGE;  	}  	return len;  }  static const struct xattr_handler nfs4_xattr_nfs4_label_handler = {  	.prefix = XATTR_SECURITY_PREFIX, -	.list	= nfs4_xattr_list_nfs4_label,  	.get	= nfs4_xattr_get_nfs4_label,  	.set	= nfs4_xattr_set_nfs4_label,  }; -#endif +#else + +static ssize_t +nfs4_listxattr_nfs4_label(struct inode *inode, char *list, size_t list_len) +{ +	return 0; +} + +#endif  /*   * nfs_fhget will use either the mounted_on_fileid or the fileid @@ -7866,7 +7851,7 @@ static void nfs4_layoutget_done(struct rpc_task *task, void *calldata)  			spin_unlock(&inode->i_lock);  		goto out_restart;  	} -	if (nfs4_async_handle_error(task, server, state, NULL) == -EAGAIN) +	if (nfs4_async_handle_error(task, server, state, &lgp->timeout) == -EAGAIN)  		goto out_restart;  out:  	dprintk("<-- %s\n", __func__); @@ -8749,6 +8734,24 @@ const struct nfs4_minor_version_ops *nfs_v4_minor_ops[] = {  #endif  }; +ssize_t nfs4_listxattr(struct dentry *dentry, char *list, size_t size) +{ +	ssize_t error, error2; + +	error = generic_listxattr(dentry, list, size); +	if (error < 0) +		return error; +	if (list) { +		list += error; +		size -= error; +	} + +	error2 = nfs4_listxattr_nfs4_label(d_inode(dentry), list, size); +	if (error2 < 0) +		return error2; +	return error + error2; +} +  static const struct inode_operations nfs4_dir_inode_operations = {  	.create		= nfs_create,  	.lookup		= nfs_lookup, @@ -8765,7 +8768,7 @@ static const struct inode_operations nfs4_dir_inode_operations = {  	.setattr	= nfs_setattr,  	.getxattr	= generic_getxattr,  	.setxattr	= generic_setxattr, -	.listxattr	= generic_listxattr, +	.listxattr	= nfs4_listxattr,  	.removexattr	= generic_removexattr,  }; @@ -8775,7 +8778,7 @@ static const struct inode_operations nfs4_file_inode_operations = {  	.setattr	= nfs_setattr,  	.getxattr	= generic_getxattr,  	.setxattr	= generic_setxattr, -	.listxattr	= generic_listxattr, +	.listxattr	= nfs4_listxattr,  	.removexattr	= generic_removexattr,  }; @@ -8834,7 +8837,7 @@ const struct nfs_rpc_ops nfs_v4_clientops = {  };  static const struct xattr_handler nfs4_xattr_nfs4_acl_handler = { -	.prefix	= XATTR_NAME_NFSV4_ACL, +	.name	= XATTR_NAME_NFSV4_ACL,  	.list	= nfs4_xattr_list_nfs4_acl,  	.get	= nfs4_xattr_get_nfs4_acl,  	.set	= nfs4_xattr_set_nfs4_acl, | 
