From patchwork Fri Mar 19 18:31:18 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: 42701 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 292973842412; Fri, 19 Mar 2021 18:31:32 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 292973842412 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1616178692; bh=otFmZ2ut81OsywCLEaLe/5pejTse5aHwdynEIFOFELU=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=x09AqGQeJiDAbOVVPVjnS5W24oBINNZZf/D/fDv3mBF2SWEQMY2kn/qR3sqWHbVql v7X/4u4VUnM6Ql8LCEz5XjZIs5iuhRgD7JKHp6RTTVDteHhvpZ0LPFQr6bXgBN+wni MRL+h5THJ76oTgPSU5AcQDWmIO4VOFU74Tc+H7xo= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-qk1-x731.google.com (mail-qk1-x731.google.com [IPv6:2607:f8b0:4864:20::731]) by sourceware.org (Postfix) with ESMTPS id 736203851C2E for ; Fri, 19 Mar 2021 18:31:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 736203851C2E Received: by mail-qk1-x731.google.com with SMTP id c3so3943102qkc.5 for ; Fri, 19 Mar 2021 11:31: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:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=otFmZ2ut81OsywCLEaLe/5pejTse5aHwdynEIFOFELU=; b=XkMVhL0A4Gl5dzVBy/e+6lbHsFSzZ4gv+HwfjcyWa3tvXA6G5FJV6Ji72l6QLOw7eA FOXQvzIyal6s3/V0n7c35WPqGr2b7/u/mWK80RQX4zvX58/+8wmk+rx09T5CP9vLvZQA Px4HdL8DkzMckZKXodckKjhfd3KuHc0bUORyaHNkXJJx1yspX3zDf1OsTUzaX6/1sPAK qAdkKmwjMJBHxLanjpTMDs8ta3+wIAleobeK9uGGKNiu+DzRJqQwnWN/mJvgE5gptBb2 hZboyPMnJBJsK1K5t5fxgfQRl3ofDOujdPQBo2SLaHNl2lFrikwUgHD/+CxkYM3oQJMw lOyw== X-Gm-Message-State: AOAM533gT8qH2eP3h56txrQXRPKXEA3ZnsoCEO+bU4bzY9d3mUZTd1Pj qIHXZHzZS2yFZIv+tRQV19+8K2+cXMHkWjfo X-Google-Smtp-Source: ABdhPJwPPO1hnjPAO2BszkB4vCwszmN8Wyl79mqdDj+vT5Acbpbwgkc983PIIRzyY6r0mG/6SfneBA== X-Received: by 2002:a05:620a:2206:: with SMTP id m6mr10663980qkh.176.1616178688829; Fri, 19 Mar 2021 11:31:28 -0700 (PDT) Received: from localhost.localdomain ([177.194.48.209]) by smtp.googlemail.com with ESMTPSA id z11sm5205747qkg.52.2021.03.19.11.31.27 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Mar 2021 11:31:28 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH 2/5] linux: Disable fstatat64 fallback if __ASSUME_STATX is defined Date: Fri, 19 Mar 2021 15:31:18 -0300 Message-Id: <20210319183121.2252064-3-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210319183121.2252064-1-adhemerval.zanella@linaro.org> References: <20210319183121.2252064-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-13.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, 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 Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" If the minimum kernel supports statx there is no need to call the fallback stat legacy syscalls. The statx is also called on compat xstat syscall, but different than the fstatat it calls no fallback and it is assumed to be always present. Checked on powerpc-linux-gnu (with and without --enable-kernel=4.11) and on powerpc64-linux-gnu. --- sysdeps/unix/sysv/linux/fstatat64.c | 57 +++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/sysdeps/unix/sysv/linux/fstatat64.c b/sysdeps/unix/sysv/linux/fstatat64.c index 490226a8ec..c3a030af58 100644 --- a/sysdeps/unix/sysv/linux/fstatat64.c +++ b/sysdeps/unix/sysv/linux/fstatat64.c @@ -31,6 +31,7 @@ #if __TIMESIZE == 64 \ && (__WORDSIZE == 32 \ && (!defined __SYSCALL_WORDSIZE || __SYSCALL_WORDSIZE == 32)) +# define FSTATAT_USE_STATX 1 /* Sanity check to avoid newer 32-bit ABI to support non-LFS calls. */ _Static_assert (sizeof (__off_t) == sizeof (__off64_t), "__blkcnt_t and __blkcnt64_t must match"); @@ -40,27 +41,25 @@ _Static_assert (sizeof (__blkcnt_t) == sizeof (__blkcnt64_t), "__blkcnt_t and __blkcnt64_t must match"); #endif -int -__fstatat64_time64 (int fd, const char *file, struct __stat64_t64 *buf, - int flag) +static inline int +fstatat64_time64_statx (int fd, const char *file, struct __stat64_t64 *buf, + int flag) { - int r; - -#if (__WORDSIZE == 32 \ - && (!defined __SYSCALL_WORDSIZE || __SYSCALL_WORDSIZE == 32)) /* 32-bit kABI with default 64-bit time_t, e.g. arc, riscv32. Also 64-bit time_t support is done through statx syscall. */ struct statx tmp; - r = INTERNAL_SYSCALL_CALL (statx, fd, file, AT_NO_AUTOMOUNT | flag, - STATX_BASIC_STATS, &tmp); + int r = INTERNAL_SYSCALL_CALL (statx, fd, file, AT_NO_AUTOMOUNT | flag, + STATX_BASIC_STATS, &tmp); if (r == 0) - { - __cp_stat64_t64_statx (buf, &tmp); - return 0; - } - if (-r != ENOSYS) - return INLINE_SYSCALL_ERROR_RETURN_VALUE (-r); -#endif + __cp_stat64_t64_statx (buf, &tmp); + return r; +} + +static inline int +fstatat64_time64_stat (int fd, const char *file, struct __stat64_t64 *buf, + int flag) +{ + int r; #if XSTAT_IS_XSTAT64 # ifdef __NR_newfstatat @@ -114,6 +113,32 @@ __fstatat64_time64 (int fd, const char *file, struct __stat64_t64 *buf, # endif #endif + return r; +} + +#if (__WORDSIZE == 32 \ + && (!defined __SYSCALL_WORDSIZE || __SYSCALL_WORDSIZE == 32)) +# define FSTATAT_USE_STATX 1 +#else +# define FSTATAT_USE_STATX 0 +#endif + +int +__fstatat64_time64 (int fd, const char *file, struct __stat64_t64 *buf, + int flag) +{ + int r; + +#if FSTATAT_USE_STATX + r = fstatat64_time64_statx (fd, file, buf, flag); +# ifndef __ASSUME_STATX + if (r == -ENOSYS) + r = fstatat64_time64_stat (fd, file, buf, flag); +# endif +#else + r = fstatat64_time64_stat (fd, file, buf, flag); +#endif + return INTERNAL_SYSCALL_ERROR_P (r) ? INLINE_SYSCALL_ERROR_RETURN_VALUE (-r) : 0;