From patchwork Wed Aug 29 05:41:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10579541 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2FBDB5A4 for ; Wed, 29 Aug 2018 05:39:45 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1234D2AC4E for ; Wed, 29 Aug 2018 05:39:45 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E06462AC53; Wed, 29 Aug 2018 05:39:44 +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=-4.7 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, RCVD_IN_SBL_CSS 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 73D7F2AC4E for ; Wed, 29 Aug 2018 05:39:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726858AbeH2Jew (ORCPT ); Wed, 29 Aug 2018 05:34:52 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:40807 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726457AbeH2Jev (ORCPT ); Wed, 29 Aug 2018 05:34:51 -0400 Received: by mail-wm0-f65.google.com with SMTP id 207-v6so4093487wme.5; Tue, 28 Aug 2018 22:39:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=OU01Ucrci4Qlz6f0rgy0Yh+kZo2Ih0kITvHHRdrUUMQ=; b=X1w+e0wlgF2biGCGoKRxtb4wJHeEdhlLYekrtNecaKcb/2jgIh9pR6xmczLbVeRBs3 q+r82cG2oVRTIPPpcoQ7uRJuGqvjaWSWY4HWnBgqKxlxsY/8Kzic9aEwtaE5DCHoHZv2 CW2BBHwHhLcLYfmn9gcXTZSnVEeXg/Zdt/rYSm61oq2yPNWj2izB5FNOTHLYvBe9sTnn 7hqp7hbYFbGftawQgGNwVw/EdxZ62DvCh9WasqhEvmpnS1wNtz0Y/UJGBd1QO10cf8On ccC6qIX1jEO2zqe6I9FWd2UB6xmmxo4whbKVotkaXpLIegOCiIDl88PvCk4Gl4x6V2PN cWig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=OU01Ucrci4Qlz6f0rgy0Yh+kZo2Ih0kITvHHRdrUUMQ=; b=RmzTB43gp+xKcaC0n/eRb6RLJASsRKP+3Q4SodGg9154O84RD7wQa5faEAdrSqXA0r 0psn11bZcmpsETGNELvxjxIuX3QqZYA274Ze/z/sXrGH+5aRKw5GZ+G9AelB3rrbzql5 xpDiuGapnHtwo/DIfZYBO/3ak8PDaF/VLdU3n3dPrNes/dBAnM0sJkN3hQErg0I4L8ej ijt8Gm6tUUekC2MOKaJB/osgF9N+wUsHtf6wOVU8jft7m64qBkffpzQxaP34rb3j8uPv TV65PMSEdi+AsIuUJxZF9uINEvVoaekXrXUnNM9S3PisuNZnHixGEZPNeBPxZ5AlXz1r Or6g== X-Gm-Message-State: APzg51D/lXpVWT+KnPjHbQ+8tjq1jNZBbKNu2KoCSQuwqNl/xilMjjx4 vaFk26MVGjc4ZM+2dLBeSvHDd1qb X-Google-Smtp-Source: ANB0Vda+/3AWVIgrk799+AZJCPhGfsgUjmZ7T2Q/62Kh9MGfeAGkvOR4cd72pGz3dl8EQLMPX+wpMQ== X-Received: by 2002:a1c:752:: with SMTP id 79-v6mr3375485wmh.59.1535521180771; Tue, 28 Aug 2018 22:39:40 -0700 (PDT) Received: from localhost.localdomain ([141.226.8.68]) by smtp.gmail.com with ESMTPSA id v6-v6sm2080780wro.66.2018.08.28.22.39.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 28 Aug 2018 22:39:40 -0700 (PDT) From: Amir Goldstein To: Miklos Szeredi Cc: Al Viro , Dave Chinner , linux-unionfs@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH v5 5/6] vfs: implement readahead(2) using POSIX_FADV_WILLNEED Date: Wed, 29 Aug 2018 08:41:29 +0300 Message-Id: <1535521289-12551-1-git-send-email-amir73il@gmail.com> X-Mailer: git-send-email 2.7.4 Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The implementation of readahead(2) syscall is identical to that of fadvise64(POSIX_FADV_WILLNEED) with a few exceptions: 1. readahead(2) returns -EINVAL for !mapping->a_ops and fadvise64() ignores the request and returns 0. 2. fadvise64() checks for integer overflow corner case 3. fadvise64() calls the optional filesystem fadvise() file operation Unite the two implementations by calling vfs_fadvise() from readahead(2) syscall. Check the !mapping->a_ops in readahead(2) syscall to preserve documented syscall ABI behaviour. Suggested-by: Miklos Szeredi Fixes: d1d04ef8572b ("ovl: stack file ops") Signed-off-by: Amir Goldstein --- Miklos, Following v5 addresses some more editorial comment from dchinner. Thanks, Amir. Changes from v4: - fix typos and editing of comments Changes from v3: - fold do_readahead helper and reduce code nesting mm/readahead.c | 45 +++++++++++++++++---------------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/mm/readahead.c b/mm/readahead.c index a59ea70527b9..a9cda21aeb05 100644 --- a/mm/readahead.c +++ b/mm/readahead.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "internal.h" @@ -575,24 +576,6 @@ page_cache_async_readahead(struct address_space *mapping, } EXPORT_SYMBOL_GPL(page_cache_async_readahead); -static ssize_t -do_readahead(struct address_space *mapping, struct file *filp, - pgoff_t index, unsigned long nr) -{ - if (!mapping || !mapping->a_ops) - return -EINVAL; - - /* - * Readahead doesn't make sense for DAX inodes, but we don't want it - * to report a failure either. Instead, we just return success and - * don't do any work. - */ - if (dax_mapping(mapping)) - return 0; - - return force_page_cache_readahead(mapping, filp, index, nr); -} - ssize_t ksys_readahead(int fd, loff_t offset, size_t count) { ssize_t ret; @@ -600,16 +583,22 @@ ssize_t ksys_readahead(int fd, loff_t offset, size_t count) ret = -EBADF; f = fdget(fd); - if (f.file) { - if (f.file->f_mode & FMODE_READ) { - struct address_space *mapping = f.file->f_mapping; - pgoff_t start = offset >> PAGE_SHIFT; - pgoff_t end = (offset + count - 1) >> PAGE_SHIFT; - unsigned long len = end - start + 1; - ret = do_readahead(mapping, f.file, start, len); - } - fdput(f); - } + if (!f.file || !(f.file->f_mode & FMODE_READ)) + goto out; + + /* + * The readahead() syscall is intended to run only on files + * that can execute readahead. If readahead is not possible + * on this file, then we must return -EINVAL. + */ + ret = -EINVAL; + if (!f.file->f_mapping || !f.file->f_mapping->a_ops || + !S_ISREG(file_inode(f.file)->i_mode)) + goto out; + + ret = vfs_fadvise(f.file, offset, count, POSIX_FADV_WILLNEED); +out: + fdput(f); return ret; }