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>
This commit is contained in:
parent
5b394b2ddf
commit
ccf45b18ce
|
@ -167,9 +167,9 @@ static int rpmsg_eptdev_release(struct inode *inode, struct file *filp)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t rpmsg_eptdev_read(struct file *filp, char __user *buf,
|
static ssize_t rpmsg_eptdev_read_iter(struct kiocb *iocb, struct iov_iter *to)
|
||||||
size_t len, loff_t *f_pos)
|
|
||||||
{
|
{
|
||||||
|
struct file *filp = iocb->ki_filp;
|
||||||
struct rpmsg_eptdev *eptdev = filp->private_data;
|
struct rpmsg_eptdev *eptdev = filp->private_data;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
@ -205,8 +205,8 @@ static ssize_t rpmsg_eptdev_read(struct file *filp, char __user *buf,
|
||||||
if (!skb)
|
if (!skb)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
use = min_t(size_t, len, skb->len);
|
use = min_t(size_t, iov_iter_count(to), skb->len);
|
||||||
if (copy_to_user(buf, skb->data, use))
|
if (copy_to_iter(skb->data, use, to) != use)
|
||||||
use = -EFAULT;
|
use = -EFAULT;
|
||||||
|
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
|
@ -214,16 +214,21 @@ static ssize_t rpmsg_eptdev_read(struct file *filp, char __user *buf,
|
||||||
return use;
|
return use;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t rpmsg_eptdev_write(struct file *filp, const char __user *buf,
|
static ssize_t rpmsg_eptdev_write_iter(struct kiocb *iocb,
|
||||||
size_t len, loff_t *f_pos)
|
struct iov_iter *from)
|
||||||
{
|
{
|
||||||
|
struct file *filp = iocb->ki_filp;
|
||||||
struct rpmsg_eptdev *eptdev = filp->private_data;
|
struct rpmsg_eptdev *eptdev = filp->private_data;
|
||||||
|
size_t len = iov_iter_count(from);
|
||||||
void *kbuf;
|
void *kbuf;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
kbuf = memdup_user(buf, len);
|
kbuf = kzalloc(len, GFP_KERNEL);
|
||||||
if (IS_ERR(kbuf))
|
if (!kbuf)
|
||||||
return PTR_ERR(kbuf);
|
return -ENOMEM;
|
||||||
|
|
||||||
|
if (!copy_from_iter_full(kbuf, len, from))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
if (mutex_lock_interruptible(&eptdev->ept_lock)) {
|
if (mutex_lock_interruptible(&eptdev->ept_lock)) {
|
||||||
ret = -ERESTARTSYS;
|
ret = -ERESTARTSYS;
|
||||||
|
@ -281,8 +286,8 @@ static const struct file_operations rpmsg_eptdev_fops = {
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.open = rpmsg_eptdev_open,
|
.open = rpmsg_eptdev_open,
|
||||||
.release = rpmsg_eptdev_release,
|
.release = rpmsg_eptdev_release,
|
||||||
.read = rpmsg_eptdev_read,
|
.read_iter = rpmsg_eptdev_read_iter,
|
||||||
.write = rpmsg_eptdev_write,
|
.write_iter = rpmsg_eptdev_write_iter,
|
||||||
.poll = rpmsg_eptdev_poll,
|
.poll = rpmsg_eptdev_poll,
|
||||||
.unlocked_ioctl = rpmsg_eptdev_ioctl,
|
.unlocked_ioctl = rpmsg_eptdev_ioctl,
|
||||||
.compat_ioctl = rpmsg_eptdev_ioctl,
|
.compat_ioctl = rpmsg_eptdev_ioctl,
|
||||||
|
|
Loading…
Reference in New Issue