From 102a0743326a03cd1a1202ceda21e175b7d3575c Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Tue, 20 Feb 2024 01:20:52 +0000 Subject: [PATCH] add new system file --- kernel/drivers/rpmsg/rpmsg_char.c | 39 +++++++++++++++++++++------------------ 1 files changed, 21 insertions(+), 18 deletions(-) diff --git a/kernel/drivers/rpmsg/rpmsg_char.c b/kernel/drivers/rpmsg/rpmsg_char.c index d153fb1..be90d77 100644 --- a/kernel/drivers/rpmsg/rpmsg_char.c +++ b/kernel/drivers/rpmsg/rpmsg_char.c @@ -146,7 +146,6 @@ { struct rpmsg_eptdev *eptdev = cdev_to_eptdev(inode->i_cdev); struct device *dev = &eptdev->dev; - struct sk_buff *skb; /* Close the endpoint, if it's not already destroyed by the parent */ mutex_lock(&eptdev->ept_lock); @@ -157,19 +156,16 @@ mutex_unlock(&eptdev->ept_lock); /* Discard all SKBs */ - while (!skb_queue_empty(&eptdev->queue)) { - skb = skb_dequeue(&eptdev->queue); - kfree_skb(skb); - } + skb_queue_purge(&eptdev->queue); put_device(dev); return 0; } -static ssize_t rpmsg_eptdev_read(struct file *filp, char __user *buf, - size_t len, loff_t *f_pos) +static ssize_t rpmsg_eptdev_read_iter(struct kiocb *iocb, struct iov_iter *to) { + struct file *filp = iocb->ki_filp; struct rpmsg_eptdev *eptdev = filp->private_data; unsigned long flags; struct sk_buff *skb; @@ -205,8 +201,8 @@ if (!skb) return -EFAULT; - use = min_t(size_t, len, skb->len); - if (copy_to_user(buf, skb->data, use)) + use = min_t(size_t, iov_iter_count(to), skb->len); + if (copy_to_iter(skb->data, use, to) != use) use = -EFAULT; kfree_skb(skb); @@ -214,16 +210,23 @@ return use; } -static ssize_t rpmsg_eptdev_write(struct file *filp, const char __user *buf, - size_t len, loff_t *f_pos) +static ssize_t rpmsg_eptdev_write_iter(struct kiocb *iocb, + struct iov_iter *from) { + struct file *filp = iocb->ki_filp; struct rpmsg_eptdev *eptdev = filp->private_data; + size_t len = iov_iter_count(from); void *kbuf; int ret; - kbuf = memdup_user(buf, len); - if (IS_ERR(kbuf)) - return PTR_ERR(kbuf); + kbuf = kzalloc(len, GFP_KERNEL); + if (!kbuf) + return -ENOMEM; + + if (!copy_from_iter_full(kbuf, len, from)) { + ret = -EFAULT; + goto free_kbuf; + } if (mutex_lock_interruptible(&eptdev->ept_lock)) { ret = -ERESTARTSYS; @@ -281,11 +284,11 @@ .owner = THIS_MODULE, .open = rpmsg_eptdev_open, .release = rpmsg_eptdev_release, - .read = rpmsg_eptdev_read, - .write = rpmsg_eptdev_write, + .read_iter = rpmsg_eptdev_read_iter, + .write_iter = rpmsg_eptdev_write_iter, .poll = rpmsg_eptdev_poll, .unlocked_ioctl = rpmsg_eptdev_ioctl, - .compat_ioctl = rpmsg_eptdev_ioctl, + .compat_ioctl = compat_ptr_ioctl, }; static ssize_t name_show(struct device *dev, struct device_attribute *attr, @@ -439,7 +442,7 @@ .open = rpmsg_ctrldev_open, .release = rpmsg_ctrldev_release, .unlocked_ioctl = rpmsg_ctrldev_ioctl, - .compat_ioctl = rpmsg_ctrldev_ioctl, + .compat_ioctl = compat_ptr_ioctl, }; static void rpmsg_ctrldev_release_device(struct device *dev) -- Gitblit v1.6.2