From patchwork Mon Mar 29 17:43:23 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 42796 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id BA9B73861018; Mon, 29 Mar 2021 17:43:32 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BA9B73861018 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1617039812; bh=938lxQ2HVo5QjLR8za8HoLMVnhW8CkG0kCO+vfNq4o8=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=o6iKxJ2nDHc/yqZNeNhHMe7B+x6HHXKVqglhIE5uHer3VwB+bsNtDmMMnADgWHiOD ohBW/zvyjnzDc0mYY3yfcYRPvotStUk+yP3NRyrb0cUdDJZKqXx72GRiZFpdEsv6Xw GGGPuFia5BbfTbLWYRQy9j86Sm7EdOg9Dez2qRQk= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-qt1-x82c.google.com (mail-qt1-x82c.google.com [IPv6:2607:f8b0:4864:20::82c]) by sourceware.org (Postfix) with ESMTPS id 7A9BA3861002 for ; Mon, 29 Mar 2021 17:43:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 7A9BA3861002 Received: by mail-qt1-x82c.google.com with SMTP id u8so9871750qtq.12 for ; Mon, 29 Mar 2021 10:43:29 -0700 (PDT) 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=938lxQ2HVo5QjLR8za8HoLMVnhW8CkG0kCO+vfNq4o8=; b=L9ZGIWH7SpaEPdJVxUMDcW0UxR13uI2V/+MlQfCiJN8LZMQHuLKlKFEMCqwXC0U2zV 9xTsQTAs5QMvCtA7qQY6ZmV66PdHbCHre1SuDfLYp5yq9l7S68vBhbu6CHS4sYXQXBVq jbhZVkc4acmiIhtIqYX2LUyRLT1f+xjD7wf66FfBBRUIsYpO1DYplRhy3eeJ9IFAN7c4 eg25AcIlWppgsvLkfJ0QRd5l0lEZZIeMacN7ObcZ71NtFoQetWfj9ldaNtyoJ2NG+Rwz oDd4ejx63b/X/r/Oybknbx/7W1//aJfs8zHFXERouBEurVW5olvp6NMdMUkqYSp/rdCx Iz1w== X-Gm-Message-State: AOAM5327/fwZoaQgsEMrSQgUTN4CILaZjn8C1J2JtQogBPEFkcbsiSAW kPoeHDVqNsH3/HeLfQ0TfY5RFqGMzl2khUhD X-Google-Smtp-Source: ABdhPJzl7AUt/hyX7sydo3yDOcWMsoD/+cC44nr7NjFJFP3tJlD0DhFLOFRHa4PdMWS0d65trIDuBQ== X-Received: by 2002:ac8:d0b:: with SMTP id q11mr23242021qti.353.1617039808761; Mon, 29 Mar 2021 10:43:28 -0700 (PDT) Received: from localhost.localdomain ([177.194.41.149]) by smtp.googlemail.com with ESMTPSA id o76sm13735955qke.79.2021.03.29.10.43.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Mar 2021 10:43:28 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH] io: Check at runtime if timestamp supports nanoseconds Date: Mon, 29 Mar 2021 14:43:23 -0300 Message-Id: <20210329174323.222990-1-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 X-Spam-Status: No, score=-12.5 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-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Cc: Stefan Liebler Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" Now that non-LFS stat function is implemented on to on LFS, it will use statx when available. It allows to check for nanosecond timestamp if the kernel supports __NR_statx. Checked on s390-linux-gnu with 4.12.14 kernel. --- io/tst-stat.c | 7 ++++- support/support.h | 2 +- support/support_stat_nanoseconds.c | 41 +++++++++++++++++++++++++----- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/io/tst-stat.c b/io/tst-stat.c index 397d480ecc..22b89bb3e7 100644 --- a/io/tst-stat.c +++ b/io/tst-stat.c @@ -25,6 +25,7 @@ #include #include #include +#include #include static void @@ -73,6 +74,10 @@ do_test (void) test_t tests[] = { stat_check, lstat_check, fstat_check, fstatat_check }; + bool check_ns = support_stat_nanoseconds (path); + if (!check_ns) + printf ("warning: timestamp with nanoseconds not supportted\n"); + for (int i = 0; i < array_length (tests); i++) { struct stat st; @@ -92,7 +97,7 @@ do_test (void) TEST_COMPARE (stx.stx_ctime.tv_sec, st.st_ctim.tv_sec); TEST_COMPARE (stx.stx_mtime.tv_sec, st.st_mtim.tv_sec); - if (support_stat_nanoseconds ()) + if (check_ns) { TEST_COMPARE (stx.stx_ctime.tv_nsec, st.st_ctim.tv_nsec); TEST_COMPARE (stx.stx_mtime.tv_nsec, st.st_mtim.tv_nsec); diff --git a/support/support.h b/support/support.h index b0352726bf..e023d00857 100644 --- a/support/support.h +++ b/support/support.h @@ -142,7 +142,7 @@ static __inline bool support_path_support_time64 (const char *path) } /* Return true if stat supports nanoseconds resolution. */ -extern bool support_stat_nanoseconds (void); +extern bool support_stat_nanoseconds (const char *path); __END_DECLS diff --git a/support/support_stat_nanoseconds.c b/support/support_stat_nanoseconds.c index c0d5b2c3a9..94953c0868 100644 --- a/support/support_stat_nanoseconds.c +++ b/support/support_stat_nanoseconds.c @@ -16,16 +16,43 @@ License along with the GNU C Library; if not, see . */ +#include +#include +#include +#include +#include #include +#include +#include +#include +#include bool -support_stat_nanoseconds (void) +support_stat_nanoseconds (const char *path) { - /* s390 stat64 compat symbol does not support nanoseconds resolution - and it used on non-LFS [f,l]stat[at] implementations. */ -#if defined __linux__ && !defined __s390x__ && defined __s390__ - return false; -#else - return true; + bool support; +#ifdef __linux__ + /* Obtain the original timestamp to restore at the end. */ + struct stat ost; + TEST_VERIFY_EXIT (stat (path, &ost) == 0); + + const struct timespec tsp[] = { { 0, TIMESPEC_HZ - 1 }, + { 0, TIMESPEC_HZ / 2 } }; + TEST_VERIFY_EXIT (utimensat (AT_FDCWD, path, tsp, 0) == 0); + + struct stat st; + TEST_VERIFY_EXIT (stat (path, &st) == 0); + + support = st.st_atim.tv_nsec == tsp[0].tv_nsec + && st.st_mtim.tv_nsec == tsp[1].tv_nsec; + + /* Reset to original timestamps. */ + const struct timespec otsp[] = + { + { ost.st_atim.tv_sec, ost.st_atim.tv_nsec }, + { ost.st_mtim.tv_sec, ost.st_mtim.tv_nsec }, + }; + TEST_VERIFY_EXIT (utimensat (AT_FDCWD, path, otsp, 0) == 0); #endif + return support; }