Messages in this thread Patch in this message | | | From | matt.hsiao@hpe ... | Subject | [PATCH] misc: hpilo: switch .{read,write} ops to .{read,write}_iter | Date | Wed, 13 Jul 2022 23:08:31 +0800 |
| |
From: Matt Hsiao <matt.hsiao@hpe.com>
Commit 4d03e3cc59828c82ee89 ("fs: don't allow kernel reads and writes without iter ops") requested exclusive .{read,write}_iter ops for kernel_{read,write}. To support dependent drivers to access hpilo by kernel_{read,write}, switch .{read,write} ops to its iter variants.
Signed-off-by: Matt Hsiao <matt.hsiao@hpe.com> --- hpilo.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-)
diff --git a/hpilo.c b/hpilo.c index 8d00df9..5d431a5 100644 --- a/hpilo.c +++ b/hpilo.c @@ -23,6 +23,7 @@ #include <linux/wait.h> #include <linux/poll.h> #include <linux/slab.h> +#include <linux/uio.h> #include "hpilo.h" static struct class *ilo_class; @@ -435,14 +436,14 @@ static void ilo_set_reset(struct ilo_hwinfo *hw) } } -static ssize_t ilo_read(struct file *fp, char __user *buf, - size_t len, loff_t *off) +static ssize_t ilo_read_iter(struct kiocb *iocb, struct iov_iter *to) { - int err, found, cnt, pkt_id, pkt_len; - struct ccb_data *data = fp->private_data; + int err = 0, found, cnt, pkt_id, pkt_len; + struct ccb_data *data = iocb->ki_filp->private_data; struct ccb *driver_ccb = &data->driver_ccb; struct ilo_hwinfo *hw = data->ilo_hw; void *pkt; + size_t len = iov_iter_count(to), copied; if (is_channel_reset(driver_ccb)) { /* @@ -477,7 +478,9 @@ static ssize_t ilo_read(struct file *fp, char __user *buf, if (pkt_len < len) len = pkt_len; - err = copy_to_user(buf, pkt, len); + copied = copy_to_iter(pkt, len, to); + if (unlikely(copied != len)) + err = -EFAULT; /* return the received packet to the queue */ ilo_pkt_enqueue(hw, driver_ccb, RECVQ, pkt_id, desc_mem_sz(1)); @@ -485,14 +488,14 @@ static ssize_t ilo_read(struct file *fp, char __user *buf, return err ? -EFAULT : len; } -static ssize_t ilo_write(struct file *fp, const char __user *buf, - size_t len, loff_t *off) +static ssize_t ilo_write_iter(struct kiocb *iocb, struct iov_iter *from) { - int err, pkt_id, pkt_len; - struct ccb_data *data = fp->private_data; + int err = 0, pkt_id, pkt_len; + struct ccb_data *data = iocb->ki_filp->private_data; struct ccb *driver_ccb = &data->driver_ccb; struct ilo_hwinfo *hw = data->ilo_hw; void *pkt; + size_t len = iov_iter_count(from), copied; if (is_channel_reset(driver_ccb)) return -ENODEV; @@ -506,9 +509,11 @@ static ssize_t ilo_write(struct file *fp, const char __user *buf, len = pkt_len; /* on failure, set the len to 0 to return empty packet to the device */ - err = copy_from_user(pkt, buf, len); - if (err) + copied = copy_from_iter(pkt, len, from); + if (unlikely(copied != len)) { len = 0; + err = -EFAULT; + } /* send the packet */ ilo_pkt_enqueue(hw, driver_ccb, SENDQ, pkt_id, len); @@ -639,8 +644,8 @@ out: static const struct file_operations ilo_fops = { .owner = THIS_MODULE, - .read = ilo_read, - .write = ilo_write, + .read_iter = ilo_read_iter, + .write_iter = ilo_write_iter, .poll = ilo_poll, .open = ilo_open, .release = ilo_close, -- 2.16.6
| |