diff options
Diffstat (limited to 'fs/9p/xattr.c')
| -rw-r--r-- | fs/9p/xattr.c | 80 | 
1 files changed, 25 insertions, 55 deletions
| diff --git a/fs/9p/xattr.c b/fs/9p/xattr.c index f95e01e058e4..0cf44b6cccd6 100644 --- a/fs/9p/xattr.c +++ b/fs/9p/xattr.c @@ -15,6 +15,7 @@  #include <linux/module.h>  #include <linux/fs.h>  #include <linux/sched.h> +#include <linux/uio.h>  #include <net/9p/9p.h>  #include <net/9p/client.h> @@ -25,50 +26,34 @@ ssize_t v9fs_fid_xattr_get(struct p9_fid *fid, const char *name,  			   void *buffer, size_t buffer_size)  {  	ssize_t retval; -	int msize, read_count; -	u64 offset = 0, attr_size; +	u64 attr_size;  	struct p9_fid *attr_fid; +	struct kvec kvec = {.iov_base = buffer, .iov_len = buffer_size}; +	struct iov_iter to; +	int err; + +	iov_iter_kvec(&to, READ | ITER_KVEC, &kvec, 1, buffer_size);  	attr_fid = p9_client_xattrwalk(fid, name, &attr_size);  	if (IS_ERR(attr_fid)) {  		retval = PTR_ERR(attr_fid);  		p9_debug(P9_DEBUG_VFS, "p9_client_attrwalk failed %zd\n",  			 retval); -		attr_fid = NULL; -		goto error; -	} -	if (!buffer_size) { -		/* request to get the attr_size */ -		retval = attr_size; -		goto error; +		return retval;  	}  	if (attr_size > buffer_size) { -		retval = -ERANGE; -		goto error; -	} -	msize = attr_fid->clnt->msize; -	while (attr_size) { -		if (attr_size > (msize - P9_IOHDRSZ)) -			read_count = msize - P9_IOHDRSZ; +		if (!buffer_size) /* request to get the attr_size */ +			retval = attr_size;  		else -			read_count = attr_size; -		read_count = p9_client_read(attr_fid, ((char *)buffer)+offset, -					NULL, offset, read_count); -		if (read_count < 0) { -			/* error in xattr read */ -			retval = read_count; -			goto error; -		} -		offset += read_count; -		attr_size -= read_count; +			retval = -ERANGE; +	} else { +		iov_iter_truncate(&to, attr_size); +		retval = p9_client_read(attr_fid, 0, &to, &err); +		if (err) +			retval = err;  	} -	/* Total read xattr bytes */ -	retval = offset; -error: -	if (attr_fid) -		p9_client_clunk(attr_fid); +	p9_client_clunk(attr_fid);  	return retval; -  } @@ -120,8 +105,11 @@ int v9fs_xattr_set(struct dentry *dentry, const char *name,  int v9fs_fid_xattr_set(struct p9_fid *fid, const char *name,  		   const void *value, size_t value_len, int flags)  { -	u64 offset = 0; -	int retval, msize, write_count; +	struct kvec kvec = {.iov_base = (void *)value, .iov_len = value_len}; +	struct iov_iter from; +	int retval; + +	iov_iter_kvec(&from, WRITE | ITER_KVEC, &kvec, 1, value_len);  	p9_debug(P9_DEBUG_VFS, "name = %s value_len = %zu flags = %d\n",  		 name, value_len, flags); @@ -135,29 +123,11 @@ int v9fs_fid_xattr_set(struct p9_fid *fid, const char *name,  	 * On success fid points to xattr  	 */  	retval = p9_client_xattrcreate(fid, name, value_len, flags); -	if (retval < 0) { +	if (retval < 0)  		p9_debug(P9_DEBUG_VFS, "p9_client_xattrcreate failed %d\n",  			 retval); -		goto err; -	} -	msize = fid->clnt->msize; -	while (value_len) { -		if (value_len > (msize - P9_IOHDRSZ)) -			write_count = msize - P9_IOHDRSZ; -		else -			write_count = value_len; -		write_count = p9_client_write(fid, ((char *)value)+offset, -					NULL, offset, write_count); -		if (write_count < 0) { -			/* error in xattr write */ -			retval = write_count; -			goto err; -		} -		offset += write_count; -		value_len -= write_count; -	} -	retval = 0; -err: +	else +		p9_client_write(fid, 0, &from, &retval);  	p9_client_clunk(fid);  	return retval;  } |