From nobody Fri Dec 19 04:23:29 2025 Received: from mail-io1-f46.google.com (mail-io1-f46.google.com [209.85.166.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B185D481B4 for ; Thu, 11 Apr 2024 15:32:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712849528; cv=none; b=bZD7de3TluMBqbKYM2kPnTZDfEwUGNxX6gdJ9rbKbg4f1gTrkoiOgnJQeZhIrYFdoa8QdPUGMbJFj53jk7UMQTBJjMR46yUgg5UiXkGHXSpOFOjNS6mzGBXxhGcuwzXxUQG4HZ/EA3wsx3kKmB7gEjJTHe7ASHRZ4kG4yIdCiQc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712849528; c=relaxed/simple; bh=mBIHrHSx0t1Gu8X++/2wE1bS/peUOddMrWDqDawEdEQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AoeFadHmWNuIMSASKhOFGBPdrgAdLLHe+SRO1h9xbg5t0JIlHORLz2NpPVECyfGrhWE6BG/H3W5kRwcKXIeiE7D5QqZB8MSUl8CN6Rplhuj+Eim5csBvoZfdTmJkPYxb6lDBqESY9rp4voSeTn9a4Kr3HOaJQ8FB7DxXQFEpgRw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.dk; spf=pass smtp.mailfrom=kernel.dk; dkim=pass (2048-bit key) header.d=kernel-dk.20230601.gappssmtp.com header.i=@kernel-dk.20230601.gappssmtp.com header.b=Zv/ZZfuW; arc=none smtp.client-ip=209.85.166.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.dk Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kernel.dk Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel-dk.20230601.gappssmtp.com header.i=@kernel-dk.20230601.gappssmtp.com header.b="Zv/ZZfuW" Received: by mail-io1-f46.google.com with SMTP id ca18e2360f4ac-7d5ed700c2dso16098339f.0 for ; Thu, 11 Apr 2024 08:32:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20230601.gappssmtp.com; s=20230601; t=1712849525; x=1713454325; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=f2l6h/jCu8YubbMk7Y4sKs4D1pQIix1cvMgP8JlWQTk=; b=Zv/ZZfuWIAN1bizlDPK9Rp3QqEQjaHS4CaOWNjxl9m6NXwAbmKQ+x+FDezO6peu9To wFVD1IPGvDEe8BgNtNr/nuvI3Ms36/5JpRzzfUuEhtrrLRY1u+wowzbnE7cbTQw5JR/W pMlQZKCS76+8wjqJnxEFFBgJAIdsKWwCEpEI6NM3Jp7fcKS+EN06LAI8+Mj/l4DsiYAb VnSTphDAOCZZwJySpXnmj7xA13cdpVxdJJcBZbPy7P++4t3rI3vskuT+zH1vjd8oH/zI j6/Qrr4C6Hp7NMyiM1psWjtdF1mu/vTWNk5hnfIWgb17F6fBWnSoe8EaF0gxvjJ4ReVF rXlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712849525; x=1713454325; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=f2l6h/jCu8YubbMk7Y4sKs4D1pQIix1cvMgP8JlWQTk=; b=hqp1o0Z2Ffv6GbolUL3WorKODdAWgJosDigrVoRwir0HVuJStaifJxwNE1TWAaDHAI PKTuHRWU3PzPZBawwxrDu1hXd4p0I5tA1qULjMoKaQ25JZYQZ+IuIBs5GKwPBzdNbyki VXboGbZb0E+l2Il/4TntEA+jYRIa/L+LW0QOrAmtQB7gusPtK6Vfydt9qWbs4QguB/+V DtKt6OX8wPMy2x5RVIAFzxld7FDjWErc/fzZZVyw8SybDHJq7u5bwWoPQXklxe0vW1id ekFa1YUwm/wcjihV7hwRu0xnaHPpOW6qCQXaxC4Wc3UDfPV8yEiiOkgN9BhtWnljwwwp MvfA== X-Gm-Message-State: AOJu0YyvbFMjLr4hLtnsvY1crGK9Ex39Ip070nFauGh83WGxjeaKsowJ TMk81NGN17PLkHpT12bDUB0r0ReZCUVbhPNYpnEMnx2czyJUAV4sU3LQxplHwojWrsUAMfPsFqu Z X-Google-Smtp-Source: AGHT+IEn9kx7aES2I5uP8b+SHKHJtQQRCy1KF63sdUmtkcYEPlFtiKWDcG5UMW2RZJn7sbd1CorbQA== X-Received: by 2002:a6b:f312:0:b0:7d5:de23:13a9 with SMTP id m18-20020a6bf312000000b007d5de2313a9mr148153ioh.1.1712849524925; Thu, 11 Apr 2024 08:32:04 -0700 (PDT) Received: from localhost.localdomain ([96.43.243.2]) by smtp.gmail.com with ESMTPSA id jc25-20020a056638891900b0047f14b7f6c0sm457056jab.5.2024.04.11.08.32.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Apr 2024 08:32:03 -0700 (PDT) From: Jens Axboe To: linux-kernel@vger.kernel.org Cc: Jens Axboe Subject: [PATCH 021/437] char/ipmi: convert to read/write iterators Date: Thu, 11 Apr 2024 09:12:41 -0600 Message-ID: <20240411153126.16201-22-axboe@kernel.dk> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240411153126.16201-1-axboe@kernel.dk> References: <20240411153126.16201-1-axboe@kernel.dk> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Jens Axboe --- drivers/char/ipmi/bt-bmc.c | 27 +++++++++++++-------------- drivers/char/ipmi/ipmb_dev_int.c | 19 ++++++++++--------- drivers/char/ipmi/ipmi_watchdog.c | 16 ++++++++-------- drivers/char/ipmi/kcs_bmc_cdev_ipmi.c | 23 ++++++++++++----------- drivers/char/ipmi/ssif_bmc.c | 25 ++++++++++++++----------- 5 files changed, 57 insertions(+), 53 deletions(-) diff --git a/drivers/char/ipmi/bt-bmc.c b/drivers/char/ipmi/bt-bmc.c index 7450904e330a..d8b2e513ed2a 100644 --- a/drivers/char/ipmi/bt-bmc.c +++ b/drivers/char/ipmi/bt-bmc.c @@ -15,6 +15,7 @@ #include #include #include +#include =20 /* * This is a BMC device used to communicate to the host @@ -172,17 +173,17 @@ static int bt_bmc_open(struct inode *inode, struct fi= le *file) * Length NetFn/LUN Seq Cmd Data * */ -static ssize_t bt_bmc_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) +static ssize_t bt_bmc_read(struct kiocb *iocb, struct iov_iter *to) { - struct bt_bmc *bt_bmc =3D file_bt_bmc(file); + struct bt_bmc *bt_bmc =3D file_bt_bmc(iocb->ki_filp); + size_t count =3D iov_iter_count(to); u8 len; int len_byte =3D 1; u8 kbuffer[BT_BMC_BUFFER_SIZE]; ssize_t ret =3D 0; ssize_t nread; =20 - WARN_ON(*ppos); + WARN_ON(iocb->ki_pos); =20 if (wait_event_interruptible(bt_bmc->queue, bt_inb(bt_bmc, BT_CTRL) & BT_CTRL_H2B_ATN)) @@ -215,12 +216,11 @@ static ssize_t bt_bmc_read(struct file *file, char __= user *buf, =20 bt_readn(bt_bmc, kbuffer + len_byte, nread); =20 - if (copy_to_user(buf, kbuffer, nread + len_byte)) { + if (!copy_to_iter_full(kbuffer, nread + len_byte, to)) { ret =3D -EFAULT; break; } len -=3D nread; - buf +=3D nread + len_byte; ret +=3D nread + len_byte; len_byte =3D 0; } @@ -238,10 +238,10 @@ static ssize_t bt_bmc_read(struct file *file, char __= user *buf, * Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6:N * Length NetFn/LUN Seq Cmd Code Data */ -static ssize_t bt_bmc_write(struct file *file, const char __user *buf, - size_t count, loff_t *ppos) +static ssize_t bt_bmc_write(struct kiocb *iocb, struct iov_iter *from) { - struct bt_bmc *bt_bmc =3D file_bt_bmc(file); + struct bt_bmc *bt_bmc =3D file_bt_bmc(iocb->ki_filp); + size_t count =3D iov_iter_count(from); u8 kbuffer[BT_BMC_BUFFER_SIZE]; ssize_t ret =3D 0; ssize_t nwritten; @@ -252,7 +252,7 @@ static ssize_t bt_bmc_write(struct file *file, const ch= ar __user *buf, if (count < 5) return -EINVAL; =20 - WARN_ON(*ppos); + WARN_ON(iocb->ki_pos); =20 /* * There's no interrupt for clearing bmc busy so we have to @@ -275,7 +275,7 @@ static ssize_t bt_bmc_write(struct file *file, const ch= ar __user *buf, =20 while (count) { nwritten =3D min_t(ssize_t, count, sizeof(kbuffer)); - if (copy_from_user(&kbuffer, buf, nwritten)) { + if (!copy_from_iter_full(&kbuffer, nwritten, from)) { ret =3D -EFAULT; break; } @@ -283,7 +283,6 @@ static ssize_t bt_bmc_write(struct file *file, const ch= ar __user *buf, bt_writen(bt_bmc, kbuffer, nwritten); =20 count -=3D nwritten; - buf +=3D nwritten; ret +=3D nwritten; } =20 @@ -338,8 +337,8 @@ static __poll_t bt_bmc_poll(struct file *file, poll_tab= le *wait) static const struct file_operations bt_bmc_fops =3D { .owner =3D THIS_MODULE, .open =3D bt_bmc_open, - .read =3D bt_bmc_read, - .write =3D bt_bmc_write, + .read_iter =3D bt_bmc_read, + .write_iter =3D bt_bmc_write, .release =3D bt_bmc_release, .poll =3D bt_bmc_poll, .unlocked_ioctl =3D bt_bmc_ioctl, diff --git a/drivers/char/ipmi/ipmb_dev_int.c b/drivers/char/ipmi/ipmb_dev_= int.c index 49100845fcb7..5344095e32a0 100644 --- a/drivers/char/ipmi/ipmb_dev_int.c +++ b/drivers/char/ipmi/ipmb_dev_int.c @@ -71,11 +71,11 @@ static inline struct ipmb_dev *to_ipmb_dev(struct file = *file) return container_of(file->private_data, struct ipmb_dev, miscdev); } =20 -static ssize_t ipmb_read(struct file *file, char __user *buf, size_t count, - loff_t *ppos) +static ssize_t ipmb_read(struct kiocb *iocb, struct iov_iter *to) { - struct ipmb_dev *ipmb_dev =3D to_ipmb_dev(file); + struct ipmb_dev *ipmb_dev =3D to_ipmb_dev(iocb->ki_filp); struct ipmb_request_elem *queue_elem; + size_t count =3D iov_iter_count(to); struct ipmb_msg msg; ssize_t ret =3D 0; =20 @@ -86,7 +86,7 @@ static ssize_t ipmb_read(struct file *file, char __user *= buf, size_t count, while (list_empty(&ipmb_dev->request_queue)) { spin_unlock_irq(&ipmb_dev->lock); =20 - if (file->f_flags & O_NONBLOCK) + if (iocb->ki_filp->f_flags & O_NONBLOCK) return -EAGAIN; =20 ret =3D wait_event_interruptible(ipmb_dev->wait_queue, @@ -107,7 +107,7 @@ static ssize_t ipmb_read(struct file *file, char __user= *buf, size_t count, spin_unlock_irq(&ipmb_dev->lock); =20 count =3D min_t(size_t, count, msg.len + 1); - if (copy_to_user(buf, &msg, count)) + if (!copy_to_iter_full(&msg, count, to)) ret =3D -EFAULT; =20 return ret < 0 ? ret : count; @@ -176,6 +176,7 @@ static ssize_t ipmb_write(struct file *file, const char= __user *buf, =20 return ret < 0 ? ret : count; } +FOPS_WRITE_ITER_HELPER(ipmb_write); =20 static __poll_t ipmb_poll(struct file *file, poll_table *wait) { @@ -193,10 +194,10 @@ static __poll_t ipmb_poll(struct file *file, poll_tab= le *wait) } =20 static const struct file_operations ipmb_fops =3D { - .owner =3D THIS_MODULE, - .read =3D ipmb_read, - .write =3D ipmb_write, - .poll =3D ipmb_poll, + .owner =3D THIS_MODULE, + .read_iter =3D ipmb_read, + .write_iter =3D ipmb_write_iter, + .poll =3D ipmb_poll, }; =20 /* Called with ipmb_dev->lock held. */ diff --git a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_wat= chdog.c index 9a459257489f..001a6b522ce4 100644 --- a/drivers/char/ipmi/ipmi_watchdog.c +++ b/drivers/char/ipmi/ipmi_watchdog.c @@ -37,6 +37,7 @@ #include #include #include +#include =20 #ifdef CONFIG_X86 /* @@ -777,12 +778,11 @@ static ssize_t ipmi_write(struct file *file, } return len; } +FOPS_WRITE_ITER_HELPER(ipmi_write); =20 -static ssize_t ipmi_read(struct file *file, - char __user *buf, - size_t count, - loff_t *ppos) +static ssize_t ipmi_read(struct kiocb *iocb, struct iov_iter *to) { + size_t count =3D iov_iter_count(to); int rv =3D 0; wait_queue_entry_t wait; =20 @@ -795,7 +795,7 @@ static ssize_t ipmi_read(struct file *file, */ spin_lock_irq(&ipmi_read_lock); if (!data_to_read) { - if (file->f_flags & O_NONBLOCK) { + if (iocb->ki_filp->f_flags & O_NONBLOCK) { rv =3D -EAGAIN; goto out; } @@ -821,7 +821,7 @@ static ssize_t ipmi_read(struct file *file, spin_unlock_irq(&ipmi_read_lock); =20 if (rv =3D=3D 0) { - if (copy_to_user(buf, &data_to_read, 1)) + if (!copy_to_iter_full(&data_to_read, 1, to)) rv =3D -EFAULT; else rv =3D 1; @@ -895,9 +895,9 @@ static int ipmi_close(struct inode *ino, struct file *f= ilep) =20 static const struct file_operations ipmi_wdog_fops =3D { .owner =3D THIS_MODULE, - .read =3D ipmi_read, + .read_iter =3D ipmi_read, .poll =3D ipmi_poll, - .write =3D ipmi_write, + .write_iter =3D ipmi_write_iter, .unlocked_ioctl =3D ipmi_unlocked_ioctl, .compat_ioctl =3D compat_ptr_ioctl, .open =3D ipmi_open, diff --git a/drivers/char/ipmi/kcs_bmc_cdev_ipmi.c b/drivers/char/ipmi/kcs_= bmc_cdev_ipmi.c index cf670e891966..1cd9b4c1fec9 100644 --- a/drivers/char/ipmi/kcs_bmc_cdev_ipmi.c +++ b/drivers/char/ipmi/kcs_bmc_cdev_ipmi.c @@ -16,6 +16,7 @@ #include #include #include +#include =20 #include "kcs_bmc_client.h" =20 @@ -317,15 +318,15 @@ static __poll_t kcs_bmc_ipmi_poll(struct file *filp, = poll_table *wait) return mask; } =20 -static ssize_t kcs_bmc_ipmi_read(struct file *filp, char __user *buf, - size_t count, loff_t *ppos) +static ssize_t kcs_bmc_ipmi_read(struct kiocb *iocb, struct iov_iter *to) { - struct kcs_bmc_ipmi *priv =3D to_kcs_bmc(filp); + struct kcs_bmc_ipmi *priv =3D to_kcs_bmc(iocb->ki_filp); + size_t count =3D iov_iter_count(to); bool data_avail; size_t data_len; ssize_t ret; =20 - if (!(filp->f_flags & O_NONBLOCK)) + if (!(iocb->ki_filp->f_flags & O_NONBLOCK)) wait_event_interruptible(priv->queue, priv->data_in_avail); =20 @@ -356,7 +357,7 @@ static ssize_t kcs_bmc_ipmi_read(struct file *filp, cha= r __user *buf, goto out_unlock; } =20 - if (copy_to_user(buf, priv->kbuffer, data_len)) { + if (!copy_to_iter_full(priv->kbuffer, data_len, to)) { ret =3D -EFAULT; goto out_unlock; } @@ -379,10 +380,10 @@ static ssize_t kcs_bmc_ipmi_read(struct file *filp, c= har __user *buf, return ret; } =20 -static ssize_t kcs_bmc_ipmi_write(struct file *filp, const char __user *bu= f, - size_t count, loff_t *ppos) +static ssize_t kcs_bmc_ipmi_write(struct kiocb *iocb, struct iov_iter *fro= m) { - struct kcs_bmc_ipmi *priv =3D to_kcs_bmc(filp); + struct kcs_bmc_ipmi *priv =3D to_kcs_bmc(iocb->ki_filp); + size_t count =3D iov_iter_count(from); ssize_t ret; =20 /* a minimum response size '3' : netfn + cmd + ccode */ @@ -391,7 +392,7 @@ static ssize_t kcs_bmc_ipmi_write(struct file *filp, co= nst char __user *buf, =20 mutex_lock(&priv->mutex); =20 - if (copy_from_user(priv->kbuffer, buf, count)) { + if (!copy_from_iter_full(priv->kbuffer, count, from)) { ret =3D -EFAULT; goto out_unlock; } @@ -459,8 +460,8 @@ static int kcs_bmc_ipmi_release(struct inode *inode, st= ruct file *filp) static const struct file_operations kcs_bmc_ipmi_fops =3D { .owner =3D THIS_MODULE, .open =3D kcs_bmc_ipmi_open, - .read =3D kcs_bmc_ipmi_read, - .write =3D kcs_bmc_ipmi_write, + .read_iter =3D kcs_bmc_ipmi_read, + .write_iter =3D kcs_bmc_ipmi_write, .release =3D kcs_bmc_ipmi_release, .poll =3D kcs_bmc_ipmi_poll, .unlocked_ioctl =3D kcs_bmc_ipmi_ioctl, diff --git a/drivers/char/ipmi/ssif_bmc.c b/drivers/char/ipmi/ssif_bmc.c index 56346fb32872..9a907c84d182 100644 --- a/drivers/char/ipmi/ssif_bmc.c +++ b/drivers/char/ipmi/ssif_bmc.c @@ -130,9 +130,10 @@ static const char *state_to_string(enum ssif_state sta= te) } =20 /* Handle SSIF message that will be sent to user */ -static ssize_t ssif_bmc_read(struct file *file, char __user *buf, size_t c= ount, loff_t *ppos) +static ssize_t ssif_bmc_read(struct kiocb *iocb, struct iov_iter *to) { - struct ssif_bmc_ctx *ssif_bmc =3D to_ssif_bmc(file); + struct ssif_bmc_ctx *ssif_bmc =3D to_ssif_bmc(iocb->ki_filp); + size_t count =3D iov_iter_count(to); struct ipmi_ssif_msg msg; unsigned long flags; ssize_t ret; @@ -140,7 +141,7 @@ static ssize_t ssif_bmc_read(struct file *file, char __= user *buf, size_t count, spin_lock_irqsave(&ssif_bmc->lock, flags); while (!ssif_bmc->request_available) { spin_unlock_irqrestore(&ssif_bmc->lock, flags); - if (file->f_flags & O_NONBLOCK) + if (iocb->ki_filp->f_flags & O_NONBLOCK) return -EAGAIN; ret =3D wait_event_interruptible(ssif_bmc->wait_queue, ssif_bmc->request_available); @@ -162,17 +163,19 @@ static ssize_t ssif_bmc_read(struct file *file, char = __user *buf, size_t count, ssif_bmc->request_available =3D false; spin_unlock_irqrestore(&ssif_bmc->lock, flags); =20 - ret =3D copy_to_user(buf, &msg, count); + ret =3D -EFAULT; + if (copy_to_iter_full(&msg, count, to)) + ret =3D 0; } =20 return (ret < 0) ? ret : count; } =20 /* Handle SSIF message that is written by user */ -static ssize_t ssif_bmc_write(struct file *file, const char __user *buf, s= ize_t count, - loff_t *ppos) +static ssize_t ssif_bmc_write(struct kiocb *iocb, struct iov_iter *from) { - struct ssif_bmc_ctx *ssif_bmc =3D to_ssif_bmc(file); + struct ssif_bmc_ctx *ssif_bmc =3D to_ssif_bmc(iocb->ki_filp); + size_t count =3D iov_iter_count(from); struct ipmi_ssif_msg msg; unsigned long flags; ssize_t ret; @@ -180,7 +183,7 @@ static ssize_t ssif_bmc_write(struct file *file, const = char __user *buf, size_t if (count > sizeof(struct ipmi_ssif_msg)) return -EINVAL; =20 - if (copy_from_user(&msg, buf, count)) + if (!copy_from_iter_full(&msg, count, from)) return -EFAULT; =20 if (!msg.len || count < sizeof_field(struct ipmi_ssif_msg, len) + msg.len) @@ -189,7 +192,7 @@ static ssize_t ssif_bmc_write(struct file *file, const = char __user *buf, size_t spin_lock_irqsave(&ssif_bmc->lock, flags); while (ssif_bmc->response_in_progress) { spin_unlock_irqrestore(&ssif_bmc->lock, flags); - if (file->f_flags & O_NONBLOCK) + if (iocb->ki_filp->f_flags & O_NONBLOCK) return -EAGAIN; ret =3D wait_event_interruptible(ssif_bmc->wait_queue, !ssif_bmc->response_in_progress); @@ -275,8 +278,8 @@ static int ssif_bmc_release(struct inode *inode, struct= file *file) static const struct file_operations ssif_bmc_fops =3D { .owner =3D THIS_MODULE, .open =3D ssif_bmc_open, - .read =3D ssif_bmc_read, - .write =3D ssif_bmc_write, + .read_iter =3D ssif_bmc_read, + .write_iter =3D ssif_bmc_write, .release =3D ssif_bmc_release, .poll =3D ssif_bmc_poll, }; --=20 2.43.0