Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp1243059ybt; Tue, 7 Jul 2020 10:49:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwy91Q06TZGwMWYyvsohggj4GErhp648xKK//Yhh0A7RkKEffC/uO2S8r7eT5jpM2p4wmZo X-Received: by 2002:a05:6402:203c:: with SMTP id ay28mr53494303edb.271.1594144161494; Tue, 07 Jul 2020 10:49:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594144161; cv=none; d=google.com; s=arc-20160816; b=Y3ztGiS6LGoVWXC+4irmb46Zgipyf1rOinAxUKAnYfkuvKF5/BQhowV71OvKgUMN5T k64+sPHZwHo7QGKWHW7i7YQjROHMHFZD5RChAhBUaUmTuAye+m3D1kjyPtZp5JDsRi0k 6Xvd76OcWjh03/yOx7hRCm4rMZYWQbi3dITDSfZ8eNw4+wf26JUpqZRPEhDwoHm2rBMx gmUk6VgKAHNngmV6dU09pFZeRKWyFDH6CwL3yZUnYOsWsapfZvmptVbJxlldr4kDM0D+ GDVWxf7FElRSDPqmyItuqYJGbXzGzf8Gq+L0kHDdfxDm7gg1JQTLg74UXHsXCKBaUFfQ /VXQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=EnavTkgxyxgyyAtAribcKqVL9aBK4q+saHxSi5sRM4k=; b=srgEDHoZvENckbyVq+lDE2gRQt55TJKGFi4El7rHkLz6m7OC0KUkQvPZKwl4MwP7kv SlrP6In63lpjkWBH1ZD9DgkIdh4fGHekFxchr/gyvtZ0ipcMqPSNt1M0OaqTqb1351aV ua96mkBlrLQBV2HMVJf95SXnYe/mZVgRfklFq+/lLqJXdRorIPybUMF2qDmnHM1KXea6 AyXLh2J9sQyVsQ9Z+eL+gY2oq1DyTiu2s6cBSwlG8YO2uI6TzpoaJsyczKExmEu6hpeS 0nET992Tx/fFKEZYsuL5g+RvRgJzycY8soa+bPVCtiHS+Jr/lpzJhMUkEpqPQQKwt+iW jg+w== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@infradead.org header.s=casper.20170209 header.b=lVbi0VKH; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id mc7si15176145ejb.371.2020.07.07.10.48.58; Tue, 07 Jul 2020 10:49:21 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=fail header.i=@infradead.org header.s=casper.20170209 header.b=lVbi0VKH; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728699AbgGGRsi (ORCPT + 99 others); Tue, 7 Jul 2020 13:48:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55298 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728688AbgGGRsh (ORCPT ); Tue, 7 Jul 2020 13:48:37 -0400 Received: from casper.infradead.org (casper.infradead.org [IPv6:2001:8b0:10b:1236::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C7443C061755; Tue, 7 Jul 2020 10:48:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=EnavTkgxyxgyyAtAribcKqVL9aBK4q+saHxSi5sRM4k=; b=lVbi0VKHr3xM2aqKT0GJByTECH UOBgMbcnBwcyRtMA+Wm2nyda/T5ij03HR5gomWIbj4jlPkhjOaRmFahHja+A59HgzRD+Z+tttb5p1 PXAKQ6RwngSMUuLzRvTWq5JYxaOEK5Talu7PQhO4Jx23WW6b1li8pPXgXXuMobmQYcoqibvegiQsz 3zV99vFFyfxLcam10qK36w/WATF105PWlc/2VkLNmtjxpRNaYCkwgJx6jIZrxiRgzmGZZVbR4GHs+ XzgZIlEPzHwuHkx4O+z/r2W/6A6eFMOX3iWJy2mLiNcMQ68AVjM+vnZv50zwvz+oF3KQIuZpCJKox D1c4lyTg==; Received: from [2001:4bb8:18c:3b3b:a49f:8154:a2b7:8b6c] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1jsrhl-0003M6-UG; Tue, 07 Jul 2020 17:48:30 +0000 From: Christoph Hellwig To: Al Viro , Linus Torvalds , Stephen Rothwell Cc: Luis Chamberlain , Matthew Wilcox , Kees Cook , Iurii Zaikin , linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH 18/23] proc: add a read_iter method to proc proc_ops Date: Tue, 7 Jul 2020 19:47:56 +0200 Message-Id: <20200707174801.4162712-19-hch@lst.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200707174801.4162712-1-hch@lst.de> References: <20200707174801.4162712-1-hch@lst.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This will allow proc files to implement iter read semantics. Signed-off-by: Christoph Hellwig --- fs/proc/inode.c | 53 ++++++++++++++++++++++++++++++++++++++--- include/linux/proc_fs.h | 1 + 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 93dd2045737504..58c075e2a452d6 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c @@ -297,6 +297,21 @@ static loff_t proc_reg_llseek(struct file *file, loff_t offset, int whence) return rv; } +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->proc_ops->proc_read_iter(iocb, iter); + + if (!use_pde(pde)) + return -EIO; + ret = pde->proc_ops->proc_read_iter(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; @@ -578,6 +593,18 @@ static const struct file_operations proc_reg_file_ops = { .release = proc_reg_release, }; +static const struct file_operations proc_iter_file_ops = { + .llseek = proc_reg_llseek, + .read_iter = proc_reg_read_iter, + .write = proc_reg_write, + .poll = proc_reg_poll, + .unlocked_ioctl = proc_reg_unlocked_ioctl, + .mmap = proc_reg_mmap, + .get_unmapped_area = proc_reg_get_unmapped_area, + .open = proc_reg_open, + .release = proc_reg_release, +}; + #ifdef CONFIG_COMPAT static const struct file_operations proc_reg_file_ops_compat = { .llseek = proc_reg_llseek, @@ -591,6 +618,19 @@ static const struct file_operations proc_reg_file_ops_compat = { .open = proc_reg_open, .release = proc_reg_release, }; + +static const struct file_operations proc_iter_file_ops_compat = { + .llseek = proc_reg_llseek, + .read_iter = proc_reg_read_iter, + .write = proc_reg_write, + .poll = proc_reg_poll, + .unlocked_ioctl = proc_reg_unlocked_ioctl, + .compat_ioctl = proc_reg_compat_ioctl, + .mmap = proc_reg_mmap, + .get_unmapped_area = proc_reg_get_unmapped_area, + .open = proc_reg_open, + .release = proc_reg_release, +}; #endif static void proc_put_link(void *p) @@ -642,10 +682,17 @@ struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de) if (S_ISREG(inode->i_mode)) { inode->i_op = de->proc_iops; - inode->i_fop = &proc_reg_file_ops; + if (de->proc_ops->proc_read_iter) + inode->i_fop = &proc_iter_file_ops; + else + inode->i_fop = &proc_reg_file_ops; #ifdef CONFIG_COMPAT - if (de->proc_ops->proc_compat_ioctl) - inode->i_fop = &proc_reg_file_ops_compat; + if (de->proc_ops->proc_compat_ioctl) { + if (de->proc_ops->proc_read_iter) + inode->i_fop = &proc_iter_file_ops_compat; + else + inode->i_fop = &proc_reg_file_ops_compat; + } #endif } else if (S_ISDIR(inode->i_mode)) { inode->i_op = de->proc_iops; 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