diff options
Diffstat (limited to 'net/9p/protocol.c')
| -rw-r--r-- | net/9p/protocol.c | 28 | 
1 files changed, 10 insertions, 18 deletions
diff --git a/net/9p/protocol.c b/net/9p/protocol.c index ab9127ec5b7a..16d287565987 100644 --- a/net/9p/protocol.c +++ b/net/9p/protocol.c @@ -33,6 +33,7 @@  #include <linux/sched.h>  #include <linux/stddef.h>  #include <linux/types.h> +#include <linux/uio.h>  #include <net/9p/9p.h>  #include <net/9p/client.h>  #include "protocol.h" @@ -69,10 +70,11 @@ static size_t pdu_write(struct p9_fcall *pdu, const void *data, size_t size)  }  static size_t -pdu_write_u(struct p9_fcall *pdu, const char __user *udata, size_t size) +pdu_write_u(struct p9_fcall *pdu, struct iov_iter *from, size_t size)  {  	size_t len = min(pdu->capacity - pdu->size, size); -	if (copy_from_user(&pdu->sdata[pdu->size], udata, len)) +	struct iov_iter i = *from; +	if (copy_from_iter(&pdu->sdata[pdu->size], len, &i) != len)  		len = 0;  	pdu->size += len; @@ -273,7 +275,7 @@ p9pdu_vreadf(struct p9_fcall *pdu, int proto_version, const char *fmt,  			}  			break;  		case 'R':{ -				int16_t *nwqid = va_arg(ap, int16_t *); +				uint16_t *nwqid = va_arg(ap, uint16_t *);  				struct p9_qid **wqids =  				    va_arg(ap, struct p9_qid **); @@ -437,23 +439,13 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt,  						 stbuf->extension, stbuf->n_uid,  						 stbuf->n_gid, stbuf->n_muid);  			} break; -		case 'D':{ +		case 'V':{  				uint32_t count = va_arg(ap, uint32_t); -				const void *data = va_arg(ap, const void *); - -				errcode = p9pdu_writef(pdu, proto_version, "d", -									count); -				if (!errcode && pdu_write(pdu, data, count)) -					errcode = -EFAULT; -			} -			break; -		case 'U':{ -				int32_t count = va_arg(ap, int32_t); -				const char __user *udata = -						va_arg(ap, const void __user *); +				struct iov_iter *from = +						va_arg(ap, struct iov_iter *);  				errcode = p9pdu_writef(pdu, proto_version, "d",  									count); -				if (!errcode && pdu_write_u(pdu, udata, count)) +				if (!errcode && pdu_write_u(pdu, from, count))  					errcode = -EFAULT;  			}  			break; @@ -479,7 +471,7 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt,  			}  			break;  		case 'R':{ -				int16_t nwqid = va_arg(ap, int); +				uint16_t nwqid = va_arg(ap, int);  				struct p9_qid *wqids =  				    va_arg(ap, struct p9_qid *);  |