From: Christoph Hellwig <hch@lst.de>
To: Al Viro <viro@zeniv.linux.org.uk>,
Linus Torvalds <torvalds@linux-foundation.org>
Cc: Luis Chamberlain <mcgrof@kernel.org>,
Matthew Wilcox <willy@infradead.org>,
Kees Cook <keescook@chromium.org>,
Iurii Zaikin <yzaikin@google.com>,
linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: [PATCH 17/23] proc: add a read_iter method to proc proc_ops
Date: Wed, 1 Jul 2020 22:09:45 +0200 [thread overview]
Message-ID: <20200701200951.3603160-18-hch@lst.de> (raw)
In-Reply-To: <20200701200951.3603160-1-hch@lst.de>
This will allow proc files to implement iter read semantics.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
fs/proc/inode.c | 28 ++++++++++++++++++++++++++++
include/linux/proc_fs.h | 1 +
2 files changed, 29 insertions(+)
diff --git a/fs/proc/inode.c b/fs/proc/inode.c
index 28d6105e908e4c..fa86619cebc2be 100644
--- a/fs/proc/inode.c
+++ b/fs/proc/inode.c
@@ -297,6 +297,29 @@ static loff_t proc_reg_llseek(struct file *file, loff_t offset, int whence)
return rv;
}
+static ssize_t pde_read_iter(struct proc_dir_entry *pde, struct kiocb *iocb,
+ struct iov_iter *iter)
+{
+ if (!pde->proc_ops->proc_read_iter)
+ return -EINVAL;
+ return pde->proc_ops->proc_read_iter(iocb, iter);
+}
+
+static ssize_t proc_reg_read_iter(struct kiocb *iocb, struct iov_iter *iter)
+{
+ struct proc_dir_entry *pde = PDE(file_inode(iocb->ki_filp));
+ ssize_t ret;
+
+ if (pde_is_permanent(pde))
+ return pde_read_iter(pde, iocb, iter);
+
+ if (!use_pde(pde))
+ return -EIO;
+ ret = pde_read_iter(pde, iocb, iter);
+ unuse_pde(pde);
+ return ret;
+}
+
static ssize_t pde_read(struct proc_dir_entry *pde, struct file *file, char __user *buf, size_t count, loff_t *ppos)
{
typeof_member(struct proc_ops, proc_read) read;
@@ -312,6 +335,9 @@ static ssize_t proc_reg_read(struct file *file, char __user *buf, size_t count,
struct proc_dir_entry *pde = PDE(file_inode(file));
ssize_t rv = -EIO;
+ if (pde->proc_ops->proc_read_iter)
+ return iter_read(file, buf, count, ppos, proc_reg_read_iter);
+
if (pde_is_permanent(pde)) {
return pde_read(pde, file, buf, count, ppos);
} else if (use_pde(pde)) {
@@ -569,6 +595,7 @@ static int proc_reg_release(struct inode *inode, struct file *file)
static const struct file_operations proc_reg_file_ops = {
.llseek = proc_reg_llseek,
.read = proc_reg_read,
+ .read_iter = proc_reg_read_iter,
.write = proc_reg_write,
.poll = proc_reg_poll,
.unlocked_ioctl = proc_reg_unlocked_ioctl,
@@ -585,6 +612,7 @@ static const struct file_operations proc_reg_file_ops = {
static const struct file_operations proc_reg_file_ops_no_compat = {
.llseek = proc_reg_llseek,
.read = proc_reg_read,
+ .read_iter = proc_reg_read_iter,
.write = proc_reg_write,
.poll = proc_reg_poll,
.unlocked_ioctl = proc_reg_unlocked_ioctl,
diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h
index d1eed1b4365172..97b3f5f06db9d8 100644
--- a/include/linux/proc_fs.h
+++ b/include/linux/proc_fs.h
@@ -30,6 +30,7 @@ struct proc_ops {
unsigned int proc_flags;
int (*proc_open)(struct inode *, struct file *);
ssize_t (*proc_read)(struct file *, char __user *, size_t, loff_t *);
+ ssize_t (*proc_read_iter)(struct kiocb *, struct iov_iter *);
ssize_t (*proc_write)(struct file *, const char __user *, size_t, loff_t *);
loff_t (*proc_lseek)(struct file *, loff_t, int);
int (*proc_release)(struct inode *, struct file *);
--
2.26.2
next prev parent reply other threads:[~2020-07-01 20:23 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-01 20:09 [RFC] stop using ->read and ->write for kernel access v3 Christoph Hellwig
2020-07-01 20:09 ` [PATCH 01/23] cachefiles: switch to kernel_write Christoph Hellwig
2020-07-01 20:09 ` [PATCH 02/23] autofs: " Christoph Hellwig
2020-07-01 20:09 ` [PATCH 03/23] bpfilter: " Christoph Hellwig
2020-07-01 20:09 ` [PATCH 04/23] fs: unexport __kernel_write Christoph Hellwig
2020-07-01 20:09 ` [PATCH 05/23] fs: check FMODE_WRITE in __kernel_write Christoph Hellwig
2020-07-01 20:09 ` [PATCH 06/23] fs: implement kernel_write using __kernel_write Christoph Hellwig
2020-07-01 20:09 ` [PATCH 07/23] fs: remove __vfs_write Christoph Hellwig
2020-07-01 20:09 ` [PATCH 08/23] fs: don't change the address limit for ->write_iter in __kernel_write Christoph Hellwig
2020-07-01 20:09 ` [PATCH 09/23] fs: add a __kernel_read helper Christoph Hellwig
2020-07-01 20:09 ` [PATCH 10/23] integrity/ima: switch to using __kernel_read Christoph Hellwig
2020-07-01 20:09 ` [PATCH 11/23] fs: implement kernel_read " Christoph Hellwig
2020-07-01 20:09 ` [PATCH 12/23] fs: remove __vfs_read Christoph Hellwig
2020-07-01 20:09 ` [PATCH 13/23] fs: don't change the address limit for ->read_iter in __kernel_read Christoph Hellwig
2020-07-01 20:09 ` [PATCH 14/23] fs: refactor new_sync_read Christoph Hellwig
2020-07-01 20:09 ` [PATCH 15/23] seq_file: add seq_read_iter Christoph Hellwig
2020-07-01 20:09 ` [PATCH 16/23] seq_file: switch over direct seq_read method calls to seq_read_iter Christoph Hellwig
2020-07-02 9:46 ` Miguel Ojeda
2020-07-02 13:50 ` Christoph Hellwig
2020-07-03 5:56 ` Miguel Ojeda
2020-07-03 7:44 ` Joe Perches
2020-07-03 9:35 ` Miguel Ojeda
2020-07-03 9:43 ` Joe Perches
2020-07-01 20:09 ` Christoph Hellwig [this message]
2020-07-01 21:27 ` [PATCH 17/23] proc: add a read_iter method to proc proc_ops Al Viro
2020-07-02 5:18 ` Christoph Hellwig
2020-07-02 7:30 ` Christoph Hellwig
2020-07-01 20:09 ` [PATCH 18/23] proc: switch over direct seq_read method calls to seq_read_iter Christoph Hellwig
2020-07-01 20:09 ` [PATCH 19/23] sysctl: Call sysctl_head_finish on error Christoph Hellwig
2020-07-02 0:32 ` Matthew Wilcox
2020-07-02 5:15 ` Christoph Hellwig
2020-07-03 1:34 ` Al Viro
2020-07-01 20:09 ` [PATCH 20/23] sysctl: Convert to iter interfaces Christoph Hellwig
2020-07-01 20:09 ` [PATCH 21/23] fs: don't allow kernel reads and writes without iter ops Christoph Hellwig
2020-07-01 20:09 ` [PATCH 22/23] fs: default to generic_file_splice_read for files having ->read_iter Christoph Hellwig
2020-07-01 20:09 ` [PATCH 23/23] fs: don't allow splice read/write without explicit ops Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200701200951.3603160-18-hch@lst.de \
--to=hch@lst.de \
--cc=keescook@chromium.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mcgrof@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=viro@zeniv.linux.org.uk \
--cc=willy@infradead.org \
--cc=yzaikin@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).