From patchwork Wed Nov 28 16:46:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 1004657 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=lists.linux.it (client-ip=2001:1418:10:5::2; helo=picard.linux.it; envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="NkUDr4Zf"; dkim-atps=neutral Received: from picard.linux.it (picard.linux.it [IPv6:2001:1418:10:5::2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 434mlt084gz9s3Z for ; Thu, 29 Nov 2018 03:47:22 +1100 (AEDT) Received: from picard.linux.it (localhost [IPv6:::1]) by picard.linux.it (Postfix) with ESMTP id 6056A3E79B0 for ; Wed, 28 Nov 2018 17:47:19 +0100 (CET) X-Original-To: ltp@lists.linux.it Delivered-To: ltp@picard.linux.it Received: from in-4.smtp.seeweb.it (in-4.smtp.seeweb.it [217.194.8.4]) by picard.linux.it (Postfix) with ESMTP id BBB5C3E79A1 for ; Wed, 28 Nov 2018 17:46:59 +0100 (CET) Received: from mail-wm1-x341.google.com (mail-wm1-x341.google.com [IPv6:2a00:1450:4864:20::341]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by in-4.smtp.seeweb.it (Postfix) with ESMTPS id 49EFD1001751 for ; Wed, 28 Nov 2018 17:46:59 +0100 (CET) Received: by mail-wm1-x341.google.com with SMTP id s14so3111644wmh.1 for ; Wed, 28 Nov 2018 08:46:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HwCjknwOOBUdTuxzdwwn/JRBAFkoNxoxe8o/TIS5/3c=; b=NkUDr4ZfUlKVi7koAvhMuJAO33itrAHfMfQbobPliabcZjVmiyPqnuDxWXOko6RoLo Cl/FLG6MEROcXvNoyhdse6ByfJtFwV6VcMtNHUKq2GeUuvtu0hjPtupJMImIhD0ysx3o XNhOibGRHyb94Skg0GE98Wsbt809tdIbn8Wx4mRCn5grfFzFtOvl2QQcKkUD07DceONk aHmlQQsZiKYy44TKee5wAvh6jn4pOb2pecaXwFkRudA3+SV1dnAwyHjd4G5Tv67fS+Gc e34xLX3f9dILHnMC4sY3PuC/v9h9eigXOXcais4dF7fn7LyCpdsSRYFEUwCKwecpETAH Fhfw== 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:in-reply-to :references; bh=HwCjknwOOBUdTuxzdwwn/JRBAFkoNxoxe8o/TIS5/3c=; b=R498hbhSklreDg854616p3E36jSttRCMqp02wxFifjlmvczVa7kvodsr1cgPygpq4a iz01sySgWg1E5Yrn3gPOv6C+W0WSpNLeRr3LmDlN3ObSWGnrG8Zprh3VmnglblC+39la xhEu7DTRhZtAx7ytfMsQAtQhlETzIbkgk1u6mj8C+xZukpVn/uq37UzFnSY9tOAw8qRJ ufbCyX6k0x268nr2EK4Fmk5oNHqIcMUiwyD+0Lo1AOgfvX2uX84jgHZs0feRawC4ESY5 ue5TRI5GOSLo4P/oU3jxebt5hvz5CIdGEOfAVr+nGl5o/09Z+F7oFGPcR2rkEspXAsqc 5M8A== X-Gm-Message-State: AA+aEWb720U6wlgfcQO/aR17WXf/mGxKSCyRHXSFhvk4ivD7i7+WbF2i LiVODgm0yB2F1a5alySWP2I= X-Google-Smtp-Source: AFSGD/VTNy5SB+QIl7jqF5mFB0yGyVrccvQq6qnD7mUORpMmD0BzSpciaRHjoiwz5+lyqyh0imaEaw== X-Received: by 2002:a1c:6a01:: with SMTP id f1mr3583872wmc.17.1543423618827; Wed, 28 Nov 2018 08:46:58 -0800 (PST) Received: from localhost.localdomain ([37.46.46.74]) by smtp.gmail.com with ESMTPSA id 126-v6sm2732945wme.48.2018.11.28.08.46.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 28 Nov 2018 08:46:58 -0800 (PST) From: Amir Goldstein To: Cyril Hrubis Date: Wed, 28 Nov 2018 18:46:44 +0200 Message-Id: <20181128164645.783-6-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181128164645.783-1-amir73il@gmail.com> References: <20181128164645.783-1-amir73il@gmail.com> X-Virus-Scanned: clamav-milter 0.99.2 at in-4.smtp.seeweb.it X-Virus-Status: Clean X-Spam-Status: No, score=0.1 required=7.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, SPF_PASS autolearn=disabled version=3.4.0 X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on in-4.smtp.seeweb.it Cc: linux-unionfs@vger.kernel.org, ltp@lists.linux.it, Miklos Szeredi Subject: [LTP] [PATCH v4 5/6] syscalls/readahead02: test readahead() on an overlayfs file X-BeenThere: ltp@lists.linux.it X-Mailman-Version: 2.1.18 Precedence: list List-Id: Linux Test Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it Sender: "ltp" Repeat the test case on an overlayfs file. The new test case is a regression test for kernel commit b833a3660394 ("ovl: add ovl_fadvise()") which fixes a regression of readahead() on an overlay file that was introduced by kernel commit 5b910bd615ba ("ovl: fix GPF in swapfile_activate of file from overlayfs over xfs"). Signed-off-by: Amir Goldstein --- .../kernel/syscalls/readahead/readahead02.c | 80 ++++++++++++++++--- 1 file changed, 71 insertions(+), 9 deletions(-) diff --git a/testcases/kernel/syscalls/readahead/readahead02.c b/testcases/kernel/syscalls/readahead/readahead02.c index 24f045900..73c8a6ce6 100644 --- a/testcases/kernel/syscalls/readahead/readahead02.c +++ b/testcases/kernel/syscalls/readahead/readahead02.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -33,8 +34,14 @@ static const char meminfo_fname[] = "/proc/meminfo"; static size_t testfile_size = 64 * 1024 * 1024; static char *opt_fsizestr; static int pagesize; +static unsigned long cached_max; +static int ovl_mounted; #define MNTPOINT "mntpoint" +#define OVL_LOWER MNTPOINT"/lower" +#define OVL_UPPER MNTPOINT"/upper" +#define OVL_WORK MNTPOINT"/work" +#define OVL_MNT MNTPOINT"/ovl" #define MIN_SANE_READAHEAD (4u * 1024u) static const char mntpoint[] = MNTPOINT; @@ -44,6 +51,16 @@ static struct tst_option options[] = { {NULL, NULL, NULL} }; +static struct tcase { + const char *tname; + int use_overlay; +} tcases[] = { + { "readahead on file", 0 }, + { "readahead on overlayfs file", 1 }, +}; + +static int readahead_supported = 1; + static int has_file(const char *fname, int required) { struct stat buf; @@ -97,12 +114,13 @@ static unsigned long get_cached_size(void) return parse_entry(meminfo_fname, entry); } -static void create_testfile(void) +static void create_testfile(int use_overlay) { int fd; char *tmp; size_t i; + sprintf(testfile, "%s/testfile", use_overlay ? OVL_MNT : MNTPOINT); tst_res(TINFO, "creating test file of size: %zu", testfile_size); tmp = SAFE_MALLOC(pagesize); @@ -203,21 +221,33 @@ static void read_testfile(int do_readahead, const char *fname, size_t fsize, SAFE_CLOSE(fd); } -static void test_readahead(void) +static void test_readahead(unsigned int n) { unsigned long read_bytes, read_bytes_ra; long long usec, usec_ra; - unsigned long cached_max, cached_low, cached, cached_ra; + unsigned long cached_high, cached_low, cached, cached_ra; char proc_io_fname[128]; + struct tcase *tc = &tcases[n]; + + tst_res(TINFO, "Test #%d: %s", n, tc->tname); + sprintf(proc_io_fname, "/proc/%u/io", getpid()); + if (tc->use_overlay && !ovl_mounted) { + tst_res(TCONF, + "overlayfs is not configured in this kernel."); + return; + } + + create_testfile(tc->use_overlay); + /* find out how much can cache hold if we read whole file */ read_testfile(0, testfile, testfile_size, &read_bytes, &usec, &cached); - cached_max = get_cached_size(); + cached_high = get_cached_size(); sync(); drop_caches(); cached_low = get_cached_size(); - cached_max = cached_max - cached_low; + cached_max = MAX(cached_max, cached_high - cached_low); tst_res(TINFO, "read_testfile(0)"); read_testfile(0, testfile, testfile_size, &read_bytes, &usec, &cached); @@ -233,11 +263,14 @@ static void test_readahead(void) read_testfile(1, testfile, testfile_size, &read_bytes_ra, &usec_ra, &cached_ra); if (TST_RET != 0) { - if (TST_ERR == EINVAL) { + if (TST_ERR == EINVAL && + (!tc->use_overlay || !readahead_supported)) { + readahead_supported = 0; tst_res(TCONF, "readahead not supported on %s", tst_device->fs_type); } else { tst_res(TFAIL | TTERRNO, "readahead failed on %s", + tc->use_overlay ? "overlayfs" : tst_device->fs_type); } return; @@ -284,6 +317,28 @@ static void test_readahead(void) } } +static void setup_overlay(void) +{ + int ret; + + /* Setup an overlay mount with lower dir and file */ + SAFE_MKDIR(OVL_LOWER, 0755); + SAFE_MKDIR(OVL_UPPER, 0755); + SAFE_MKDIR(OVL_WORK, 0755); + SAFE_MKDIR(OVL_MNT, 0755); + ret = mount("overlay", OVL_MNT, "overlay", 0, "lowerdir="OVL_LOWER + ",upperdir="OVL_UPPER",workdir="OVL_WORK); + if (ret < 0) { + if (errno == ENODEV) { + tst_res(TINFO, + "overlayfs is not configured in this kernel."); + return; + } + tst_brk(TBROK | TERRNO, "overlayfs mount failed"); + } + ovl_mounted = 1; +} + static void setup(void) { if (opt_fsizestr) @@ -297,8 +352,13 @@ static void setup(void) pagesize = getpagesize(); - sprintf(testfile, "%s/testfile", mntpoint); - create_testfile(); + setup_overlay(); +} + +static void cleanup(void) +{ + if (ovl_mounted) + SAFE_UMOUNT(OVL_MNT); } static struct tst_test test = { @@ -307,6 +367,8 @@ static struct tst_test test = { .mount_device = 1, .mntpoint = mntpoint, .setup = setup, + .cleanup = cleanup, .options = options, - .test_all = test_readahead, + .test = test_readahead, + .tcnt = ARRAY_SIZE(tcases), };