aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjorn Andersson <bjorn.andersson@linaro.org>2018-08-07 03:14:24 -0400
committerBjorn Andersson <bjorn.andersson@linaro.org>2018-08-27 20:06:57 -0400
commitccf45b18ce89f598c69a0c945ced1635013fc0b1 (patch)
treed96faae9bf6d0e89940caefbc8713765f5f816f2
parent5b394b2ddf0347bef56e50c69a58773c94343ff3 (diff)
rpmsg: char: Migrate to iter versions of read and write
In order to be able to use the aio interface for writing to a rpmsg_char the write_iter function must be implemented, so migrate to iter version for read and write functions. Regular read and write uses the iter methods if present and is as such unaffected. Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
-rw-r--r--drivers/rpmsg/rpmsg_char.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/drivers/rpmsg/rpmsg_char.c b/drivers/rpmsg/rpmsg_char.c
index a76b963a7e50..eea5ebbb5119 100644
--- a/drivers/rpmsg/rpmsg_char.c
+++ b/drivers/rpmsg/rpmsg_char.c
@@ -167,9 +167,9 @@ static int rpmsg_eptdev_release(struct inode *inode, struct file *filp)
167 return 0; 167 return 0;
168} 168}
169 169
170static ssize_t rpmsg_eptdev_read(struct file *filp, char __user *buf, 170static ssize_t rpmsg_eptdev_read_iter(struct kiocb *iocb, struct iov_iter *to)
171 size_t len, loff_t *f_pos)
172{ 171{
172 struct file *filp = iocb->ki_filp;
173 struct rpmsg_eptdev *eptdev = filp->private_data; 173 struct rpmsg_eptdev *eptdev = filp->private_data;
174 unsigned long flags; 174 unsigned long flags;
175 struct sk_buff *skb; 175 struct sk_buff *skb;
@@ -205,8 +205,8 @@ static ssize_t rpmsg_eptdev_read(struct file *filp, char __user *buf,
205 if (!skb) 205 if (!skb)
206 return -EFAULT; 206 return -EFAULT;
207 207
208 use = min_t(size_t, len, skb->len); 208 use = min_t(size_t, iov_iter_count(to), skb->len);
209 if (copy_to_user(buf, skb->data, use)) 209 if (copy_to_iter(skb->data, use, to) != use)
210 use = -EFAULT; 210 use = -EFAULT;
211 211
212 kfree_skb(skb); 212 kfree_skb(skb);
@@ -214,16 +214,21 @@ static ssize_t rpmsg_eptdev_read(struct file *filp, char __user *buf,
214 return use; 214 return use;
215} 215}
216 216
217static ssize_t rpmsg_eptdev_write(struct file *filp, const char __user *buf, 217static ssize_t rpmsg_eptdev_write_iter(struct kiocb *iocb,
218 size_t len, loff_t *f_pos) 218 struct iov_iter *from)
219{ 219{
220 struct file *filp = iocb->ki_filp;
220 struct rpmsg_eptdev *eptdev = filp->private_data; 221 struct rpmsg_eptdev *eptdev = filp->private_data;
222 size_t len = iov_iter_count(from);
221 void *kbuf; 223 void *kbuf;
222 int ret; 224 int ret;
223 225
224 kbuf = memdup_user(buf, len); 226 kbuf = kzalloc(len, GFP_KERNEL);
225 if (IS_ERR(kbuf)) 227 if (!kbuf)
226 return PTR_ERR(kbuf); 228 return -ENOMEM;
229
230 if (!copy_from_iter_full(kbuf, len, from))
231 return -EFAULT;
227 232
228 if (mutex_lock_interruptible(&eptdev->ept_lock)) { 233 if (mutex_lock_interruptible(&eptdev->ept_lock)) {
229 ret = -ERESTARTSYS; 234 ret = -ERESTARTSYS;
@@ -281,8 +286,8 @@ static const struct file_operations rpmsg_eptdev_fops = {
281 .owner = THIS_MODULE, 286 .owner = THIS_MODULE,
282 .open = rpmsg_eptdev_open, 287 .open = rpmsg_eptdev_open,
283 .release = rpmsg_eptdev_release, 288 .release = rpmsg_eptdev_release,
284 .read = rpmsg_eptdev_read, 289 .read_iter = rpmsg_eptdev_read_iter,
285 .write = rpmsg_eptdev_write, 290 .write_iter = rpmsg_eptdev_write_iter,
286 .poll = rpmsg_eptdev_poll, 291 .poll = rpmsg_eptdev_poll,
287 .unlocked_ioctl = rpmsg_eptdev_ioctl, 292 .unlocked_ioctl = rpmsg_eptdev_ioctl,
288 .compat_ioctl = rpmsg_eptdev_ioctl, 293 .compat_ioctl = rpmsg_eptdev_ioctl,