From patchwork Sat May 27 08:16:51 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 9751665 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 698E16037E for ; Sat, 27 May 2017 08:17:32 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5A56328455 for ; Sat, 27 May 2017 08:17:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4F69328474; Sat, 27 May 2017 08:17:32 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CF60528455 for ; Sat, 27 May 2017 08:17:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753925AbdE0IRa (ORCPT ); Sat, 27 May 2017 04:17:30 -0400 Received: from bombadil.infradead.org ([65.50.211.133]:46224 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753845AbdE0IR3 (ORCPT ); Sat, 27 May 2017 04:17:29 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=References:In-Reply-To:Message-Id: Date:Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=zDPxyDb3O9nCqKFc8rMCQHdHza9YQd4zU+odG9kPm8M=; b=iL3y7QZo/5D/EawUsPVUpi7Sn rxSJPEBGHlPecIYlO3Q3naLyEA+LOiOn4htKcaLb5Qgd37kP58VyQiU8gFI+PS/LlEIVdUEEzAB9H WXRuoBlpT1Mo+bV0Qd1uOgaKjlgsjN5HB8Ee72FtwSo5fy+kLFwRkzx0v9mC+eYCKSnGJ8j1uJPlN x50RsbOESmrfkYk5srQew65m2Wh92i2ahx0VV2Fb3tkthco0OKxOeWCvVv81LTrApFmTxnpi8b918 hKD8lGvPFhOx8+MM5Ek9jJYHkSAySsqeuUzMwXO+fQOdaBYE7vxfK3TJc4zNha6k6w0Vaa9+2Ouc6 c144PMrbQ==; Received: from shol69.static.otenet.gr ([83.235.170.67] helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.87 #1 (Red Hat Linux)) id 1dEWud-0001c2-QM; Sat, 27 May 2017 08:17:28 +0000 From: Christoph Hellwig To: Alexander Viro Cc: "J. Bruce Fields" , Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH 07/10] fs: implement vfs_iter_read using do_iter_read Date: Sat, 27 May 2017 11:16:51 +0300 Message-Id: <20170527081654.15957-8-hch@lst.de> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170527081654.15957-1-hch@lst.de> References: <20170527081654.15957-1-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP De-dupliate some code and allow for passing the flags argument to vfs_iter_read. Additional it properly updates atime now. Signed-off-by: Christoph Hellwig --- drivers/block/loop.c | 4 ++-- drivers/target/target_core_file.c | 2 +- fs/coda/file.c | 2 +- fs/read_write.c | 29 +++++++++-------------------- include/linux/fs.h | 3 ++- 5 files changed, 15 insertions(+), 25 deletions(-) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 28d932906f24..1070e851ad9a 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -342,7 +342,7 @@ static int lo_read_simple(struct loop_device *lo, struct request *rq, rq_for_each_segment(bvec, rq, iter) { iov_iter_bvec(&i, ITER_BVEC, &bvec, 1, bvec.bv_len); - len = vfs_iter_read(lo->lo_backing_file, &i, &pos); + len = vfs_iter_read(lo->lo_backing_file, &i, &pos, 0); if (len < 0) return len; @@ -383,7 +383,7 @@ static int lo_read_transfer(struct loop_device *lo, struct request *rq, b.bv_len = bvec.bv_len; iov_iter_bvec(&i, ITER_BVEC, &b, 1, b.bv_len); - len = vfs_iter_read(lo->lo_backing_file, &i, &pos); + len = vfs_iter_read(lo->lo_backing_file, &i, &pos, 0); if (len < 0) { ret = len; goto out_free_page; diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index 73b8f93a5fef..2befc0d7fdb1 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c @@ -275,7 +275,7 @@ static int fd_do_rw(struct se_cmd *cmd, struct file *fd, if (is_write) ret = vfs_iter_write(fd, &iter, &pos); else - ret = vfs_iter_read(fd, &iter, &pos); + ret = vfs_iter_read(fd, &iter, &pos, 0); if (is_write) { if (ret < 0 || ret != data_length) { diff --git a/fs/coda/file.c b/fs/coda/file.c index 9d956cd6d46f..f1102822bcfd 100644 --- a/fs/coda/file.c +++ b/fs/coda/file.c @@ -34,7 +34,7 @@ coda_file_read_iter(struct kiocb *iocb, struct iov_iter *to) BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); - return vfs_iter_read(cfi->cfi_container, to, &iocb->ki_pos); + return vfs_iter_read(cfi->cfi_container, to, &iocb->ki_pos, 0); } static ssize_t diff --git a/fs/read_write.c b/fs/read_write.c index 60c64a996ab2..620ac6f9dacb 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -356,26 +356,6 @@ SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned long, offset_high, } #endif -ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos) -{ - struct kiocb kiocb; - ssize_t ret; - - if (!file->f_op->read_iter) - return -EINVAL; - - init_sync_kiocb(&kiocb, file); - kiocb.ki_pos = *ppos; - - iter->type |= READ; - ret = call_read_iter(file, &kiocb, iter); - BUG_ON(ret == -EIOCBQUEUED); - if (ret > 0) - *ppos = kiocb.ki_pos; - return ret; -} -EXPORT_SYMBOL(vfs_iter_read); - ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos) { struct kiocb kiocb; @@ -955,6 +935,15 @@ static ssize_t do_iter_read(struct file *file, struct iov_iter *iter, return ret; } +ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos, + int flags) +{ + if (!file->f_op->read_iter) + return -EINVAL; + return do_iter_read(file, iter, ppos, flags); +} +EXPORT_SYMBOL(vfs_iter_read); + static ssize_t do_iter_write(struct file *file, struct iov_iter *iter, loff_t *pos, int flags) { diff --git a/include/linux/fs.h b/include/linux/fs.h index 803e5a9b2654..3f6a4f4efb32 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2789,7 +2789,8 @@ extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *); extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *); extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t); -ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos); +ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos, + int flags); ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos); /* fs/block_dev.c */