From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qk1-x72c.google.com (mail-qk1-x72c.google.com [IPv6:2607:f8b0:4864:20::72c]) by sourceware.org (Postfix) with ESMTPS id 5CD68383442D for ; Thu, 11 Mar 2021 12:36:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 5CD68383442D Received: by mail-qk1-x72c.google.com with SMTP id n79so20353801qke.3 for ; Thu, 11 Mar 2021 04:36:05 -0800 (PST) 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:mime-version :content-transfer-encoding; bh=339yx+eVeSQueA9S2wbBp28OC2+LWybpa3LSRrvgX3U=; b=FGteVOyq03ZU3PZIhTL5ht6igK2mn1nLG9jH546DQgCiN0GO9e+FZfCdf9CYaG0eKY 72KjAijX1Z0THb77CZEnWXgIDyN7ysWZR2qmlLvLQEhlDzgQ6r/wcp9MSCObqxgQ6MXH Fifmjp6oo5GwCqEYOsgUbQSrN7UWYEd3eJqcHNxtMCDy88DlmYrIu7/Q95hfRf3TWXq8 /BUx3+Ue8+LpOqcuzAn6zdCPd2CFzXmM0pxIfajLHnTv46UPHLCMC1qMf8Vy67aObTFl PJtWLb1NhFn7vtpGeRVuwga06LP6xKrCwV2+Wn052QKbO8r5GM1bMQbjOd4Wbi5PgPQl gjKw== X-Gm-Message-State: AOAM530spF5jVmx1gG41WggkOrITf47HGEHYMi3agsj8DmJjMfoOb7Um RTeYBKOVYv7x7EY1j1mO0BBojIaMPWAg7u11 X-Google-Smtp-Source: ABdhPJy5cRSfEKi8bi1AchSOyY3TatQKS4IueXs3kIvEBJshvlc40ltT7L3sZ6B8WT0apR09l8C3pA== X-Received: by 2002:a37:8906:: with SMTP id l6mr7346380qkd.232.1615466164534; Thu, 11 Mar 2021 04:36:04 -0800 (PST) Received: from localhost.localdomain ([177.194.48.209]) by smtp.googlemail.com with ESMTPSA id d24sm1810468qkl.49.2021.03.11.04.36.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Mar 2021 04:36:04 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Cc: Florian Weimer , Mike Frysinger , DJ Delorie , Arjun Shankar , Lukasz Majewski Subject: [RFC] io: Return UNSUPPORTED if filesystem do not support 64 bit timestamps Date: Thu, 11 Mar 2021 09:35:57 -0300 Message-Id: <20210311123557.3486677-1-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-13.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 11 Mar 2021 12:36:07 -0000 Some Linux filesystems might not fully support 64 bit timestamps [1], which make some Linux specific tests to fail when they check for the functionality. This patch make them return as 'unsupported' is the target file is created on a buggy filesystem: $ dd if=/dev/zero of=loopbackfile.img bs=100M count=1 1+0 records in 1+0 records out 104857600 bytes (105 MB, 100 MiB) copied, 0,0589568 s, 1,8 GB/s $ sudo losetup -fP loopbackfile.img $ mkfs.xfs loopbackfile.img meta-data=loopbackfile.img isize=512 agcount=4, agsize=6400 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 data = bsize=4096 blocks=25600, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=1368, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 $ mkdir loopfs $ sudo mount -o loop /dev/loop0 loopfs/ $ sudo chown -R azanella:azanella loopfs $ TMPDIR=loopfs/ ./testrun.sh misc/tst-utimes error: ../sysdeps/unix/sysv/linux/tst-utimes.c:55: File loopfs//utimesfECsK1 does not support 64-bit timestamps [1] https://bugzilla.redhat.com/show_bug.cgi?id=1795576 --- support/Makefile | 1 + support/support.h | 5 ++++ support/support_path_support_time64.c | 38 ++++++++++++++++++++++++++ sysdeps/unix/sysv/linux/tst-futimens.c | 8 +++++- sysdeps/unix/sysv/linux/tst-utime.c | 7 ++++- sysdeps/unix/sysv/linux/tst-utimes.c | 7 ++++- 6 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 support/support_path_support_time64.c diff --git a/support/Makefile b/support/Makefile index 8d63fbd5da..5904cdd412 100644 --- a/support/Makefile +++ b/support/Makefile @@ -59,6 +59,7 @@ libsupport-routines = \ support_format_hostent \ support_format_netent \ support_isolate_in_subprocess \ + support_path_support_time64 \ support_process_state \ support_ptrace \ support_openpty \ diff --git a/support/support.h b/support/support.h index 9cbc455720..2e477c9e7c 100644 --- a/support/support.h +++ b/support/support.h @@ -23,6 +23,7 @@ #ifndef SUPPORT_H #define SUPPORT_H +#include #include #include /* For mode_t. */ @@ -129,6 +130,10 @@ extern void support_copy_file (const char *from, const char *to); extern ssize_t support_copy_file_range (int, off64_t *, int, off64_t *, size_t, unsigned int); +/* Return true is PATH supports 64-bit time_t interfaces for file + operations (such as fstatat or utimensat). */ +extern bool support_path_support_time64 (const char *path); + __END_DECLS #endif /* SUPPORT_H */ diff --git a/support/support_path_support_time64.c b/support/support_path_support_time64.c new file mode 100644 index 0000000000..c780dcd4aa --- /dev/null +++ b/support/support_path_support_time64.c @@ -0,0 +1,38 @@ +/* Check if path supports 64-bit time interfaces. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#ifdef __linux +#include +#endif + +bool +support_path_support_time64 (const char *path) +{ +#ifdef __linux__ + struct statfs64 fs; + if (statfs64 (path, &fs) < 0) + FAIL_EXIT1 ("statfs64 (\"%s\"): %m", path); + /* Kernel silent truncate metadata timestamps on some version. */ + return ! (fs.f_type == XFS_SUPER_MAGIC); +#else + return true; +#endif +} diff --git a/sysdeps/unix/sysv/linux/tst-futimens.c b/sysdeps/unix/sysv/linux/tst-futimens.c index 8f48cfee63..785cd87557 100644 --- a/sysdeps/unix/sysv/linux/tst-futimens.c +++ b/sysdeps/unix/sysv/linux/tst-futimens.c @@ -21,10 +21,12 @@ #include #include #include +#include #include #include static int temp_fd = -1; +static char *testfile; /* struct timespec array with Y2038 threshold minus 2 and 1 seconds. */ const struct timespec t1[2] = { { 0x7FFFFFFE, 0 }, { 0x7FFFFFFF, 0 } }; @@ -39,13 +41,17 @@ const struct timespec t3[2] = { { 0x7FFFFFFE, 0 }, { 0x80000002ULL, 0 } }; static void do_prepare (int argc, char *argv[]) { - temp_fd = create_temp_file ("futimensat", NULL); + temp_fd = create_temp_file ("futimensat", &testfile); TEST_VERIFY_EXIT (temp_fd > 0); } static int test_futimens_helper (const struct timespec *ts) { + if (!support_path_support_time64 (testfile)) + FAIL_UNSUPPORTED ("File %s does not support 64-bit timestamps", + testfile); + struct stat64 st; int result; time_t t; diff --git a/sysdeps/unix/sysv/linux/tst-utime.c b/sysdeps/unix/sysv/linux/tst-utime.c index 6735421657..21e4e41dea 100644 --- a/sysdeps/unix/sysv/linux/tst-utime.c +++ b/sysdeps/unix/sysv/linux/tst-utime.c @@ -23,11 +23,12 @@ #include #include #include +#include #include #include static int temp_fd = -1; -char *testfile; +static char *testfile; /* struct utimbuf with Y2038 threshold minus 2 and 1 seconds. */ const static struct utimbuf t1 = { 0x7FFFFFFE, 0x7FFFFFFF }; @@ -49,6 +50,10 @@ do_prepare (int argc, char *argv[]) static int test_utime_helper (const struct utimbuf *ut) { + if (!support_path_support_time64 (testfile)) + FAIL_UNSUPPORTED ("File %s does not support 64-bit timestamps", + testfile); + struct stat64 st; int result; time_t t; diff --git a/sysdeps/unix/sysv/linux/tst-utimes.c b/sysdeps/unix/sysv/linux/tst-utimes.c index 8c7b006a22..0f23e44897 100644 --- a/sysdeps/unix/sysv/linux/tst-utimes.c +++ b/sysdeps/unix/sysv/linux/tst-utimes.c @@ -22,11 +22,12 @@ #include #include #include +#include #include #include static int temp_fd = -1; -char *testfile; +static char *testfile; /* struct timeval array with Y2038 threshold minus 2 and 1 seconds. */ const static struct timeval t1[2] = { { 0x7FFFFFFE, 0 }, { 0x7FFFFFFF, 0 } }; @@ -50,6 +51,10 @@ do_prepare (int argc, char *argv[]) static int test_utime_helper (const struct timeval *tv) { + if (!support_path_support_time64 (testfile)) + FAIL_UNSUPPORTED ("File %s does not support 64-bit timestamps", + testfile); + struct stat64 st; int result; time_t t; -- 2.25.1