From nobody Tue Sep 16 16:01:07 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8865EC4708E for ; Sun, 1 Jan 2023 15:38:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231486AbjAAPid (ORCPT ); Sun, 1 Jan 2023 10:38:33 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34612 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231433AbjAAPi2 (ORCPT ); Sun, 1 Jan 2023 10:38:28 -0500 Received: from mail-wm1-x335.google.com (mail-wm1-x335.google.com [IPv6:2a00:1450:4864:20::335]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 85E485589 for ; Sun, 1 Jan 2023 07:38:25 -0800 (PST) Received: by mail-wm1-x335.google.com with SMTP id l26so16999544wme.5 for ; Sun, 01 Jan 2023 07:38:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ixsystems.com; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=4e5rsOVvoPsB8/0IGCnvHUCFwzCz86SgBX4arQD6Bsk=; b=iIz+0dD+Xqd9D7Aclt4WbtMz7FB/uNMAN19vTh+6DwoOScIf+jA5tIb6pl1sZbrOaW XlLYQHnQ/0PyPvz0qvTAbzXKi09qSjTBYmGSnxvzBbdFRVbIvsgwji7HfzL/dg1Gk0Y+ V3CYrx7vxebfUhVMmDvLcttZh71xYJ2bXwn2IQvA2brc4xEH/FpvfiNOKwmIE+3+/3a3 aGxfOrAg6fPjQzN7n5StTR3W7Zq9HRIvBP9hKK/qbFPVmelZ5Bqrz5fO21NfQtRIVsHM 2C27VpRX929Xk3Bf3fEht9dzD2A4sp2tATdthjFDTt8SQ6Z6iV058eZOPa8Nj3UL5qEA EvOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4e5rsOVvoPsB8/0IGCnvHUCFwzCz86SgBX4arQD6Bsk=; b=DJYC7xCQ9VKJ1LlCPj4uYr6hDC/803y+OvoeatgayQVq6+sHcggSwcJkrEdyu8paGf eCQwrsnJBjom6mSbOFXPwttbbhmlr9sEcfw91YMMIJQdKBNqvN0lY0cDqKv0STT5cqF0 suaFRPlTrKoP5FnqN2R03ikEu8d5JJaGtwAAyN5jiRMJ2MVnOu1Tu5kePHm6xaiesClx IAGmxlEE8mL2Ih4+SaVGoAjPXKNUFyDMg2TslE1DD6o0ahwHF92vrSrkoN2bS60d1VQ/ vx5n+bC5kTUpwgSSXFMB56JftPvh4j1GWAcWMLsXyaheL8sTXtc1cDSetn2Mwt9jw/Rc 1mMA== X-Gm-Message-State: AFqh2kpHl1ogVv0Y2WGcvv10By9DnuBJSRTNyP4rJPDRJtkVHWVkGnn6 TsLq67X3o0H+EkhTVbSDqcIoJw== X-Google-Smtp-Source: AMrXdXvmgsB9mkhQhPLutjUrJsEcNZBj3ZzRuTx0yHaXlM7F4s4uXk1dMC6Vuz5WxgOhV0eMYtO5Qw== X-Received: by 2002:a05:600c:4998:b0:3cf:68d3:3047 with SMTP id h24-20020a05600c499800b003cf68d33047mr26779179wmp.41.1672587503834; Sun, 01 Jan 2023 07:38:23 -0800 (PST) Received: from localhost.localdomain ([2400:adc1:158:c700:ab52:9bd1:ee17:5669]) by smtp.googlemail.com with ESMTPSA id c4-20020a05600c0a4400b003cf75213bb9sm46153975wmq.8.2023.01.01.07.38.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Jan 2023 07:38:23 -0800 (PST) From: Ameer Hamza To: viro@zeniv.linux.org.uk, jlayton@kernel.org, chuck.lever@oracle.com, arnd@arndb.de, guoren@kernel.org, palmer@rivosinc.com, f.fainelli@gmail.com, slark_xiao@163.com, richard.henderson@linaro.org, ink@jurassic.park.msu.ru, mattst88@gmail.com, James.Bottomley@HansenPartnership.com, deller@gmx.de, davem@davemloft.net Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, ahamza@ixsystems.com, awalker@ixsystems.com, sparclinux@vger.kernel.org, linux-parisc@vger.kernel.org, linux-alpha@vger.kernel.org Subject: [PATCH v3] Add new open(2) flag - O_EMPTY_PATH Date: Sun, 1 Jan 2023 20:37:52 +0500 Message-Id: <20230101153752.20165-1-ahamza@ixsystems.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <202301011901.GyiYVRyd-lkp@intel.com> References: <202301011901.GyiYVRyd-lkp@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This patch adds a new flag O_EMPTY_PATH that allows openat and open system calls to open a file referenced by fd if the path is empty, and it is very similar to the FreeBSD O_EMPTY_PATH flag. This can be beneficial in some cases since it would avoid having to grant /proc access to things like samba containers for reopening files to change flags in a race-free way. Signed-off-by: Ameer Hamza --- Change in v3: resolve O_EMPTY_PATH conflict with __FMODE_NONOTIFY for sparc. Change in v2: add nonconflicting values for O_EMPTY_PATH on architectures where default conflicts with existing flags. --- --- arch/alpha/include/uapi/asm/fcntl.h | 1 + arch/parisc/include/uapi/asm/fcntl.h | 1 + arch/sparc/include/uapi/asm/fcntl.h | 1 + fs/fcntl.c | 2 +- fs/namei.c | 4 ++-- fs/open.c | 2 +- include/linux/fcntl.h | 2 +- include/uapi/asm-generic/fcntl.h | 4 ++++ tools/include/uapi/asm-generic/fcntl.h | 4 ++++ 9 files changed, 16 insertions(+), 5 deletions(-) diff --git a/arch/alpha/include/uapi/asm/fcntl.h b/arch/alpha/include/uapi/= asm/fcntl.h index 50bdc8e8a271..ea08341bb9fe 100644 --- a/arch/alpha/include/uapi/asm/fcntl.h +++ b/arch/alpha/include/uapi/asm/fcntl.h @@ -34,6 +34,7 @@ =20 #define O_PATH 040000000 #define __O_TMPFILE 0100000000 +#define O_EMPTY_PATH 0200000000 =20 #define F_GETLK 7 #define F_SETLK 8 diff --git a/arch/parisc/include/uapi/asm/fcntl.h b/arch/parisc/include/uap= i/asm/fcntl.h index 03dee816cb13..e6144823ee5b 100644 --- a/arch/parisc/include/uapi/asm/fcntl.h +++ b/arch/parisc/include/uapi/asm/fcntl.h @@ -19,6 +19,7 @@ =20 #define O_PATH 020000000 #define __O_TMPFILE 040000000 +#define O_EMPTY_PATH 0100000000 =20 #define F_GETLK64 8 #define F_SETLK64 9 diff --git a/arch/sparc/include/uapi/asm/fcntl.h b/arch/sparc/include/uapi/= asm/fcntl.h index 67dae75e5274..ed99e4e4a717 100644 --- a/arch/sparc/include/uapi/asm/fcntl.h +++ b/arch/sparc/include/uapi/asm/fcntl.h @@ -37,6 +37,7 @@ =20 #define O_PATH 0x1000000 #define __O_TMPFILE 0x2000000 +#define O_EMPTY_PATH 0x8000000 =20 #define F_GETOWN 5 /* for sockets. */ #define F_SETOWN 6 /* for sockets. */ diff --git a/fs/fcntl.c b/fs/fcntl.c index 146c9ab0cd4b..7aac650e16e2 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c @@ -1027,7 +1027,7 @@ static int __init fcntl_init(void) * Exceptions: O_NONBLOCK is a two bit define on parisc; O_NDELAY * is defined as O_NONBLOCK on some platforms and not on others. */ - BUILD_BUG_ON(21 - 1 /* for O_RDONLY being 0 */ !=3D + BUILD_BUG_ON(22 - 1 /* for O_RDONLY being 0 */ !=3D HWEIGHT32( (VALID_OPEN_FLAGS & ~(O_NONBLOCK | O_NDELAY)) | __FMODE_EXEC | __FMODE_NONOTIFY)); diff --git a/fs/namei.c b/fs/namei.c index 309ae6fc8c99..2b2735af6d03 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -192,7 +192,7 @@ getname_flags(const char __user *filename, int flags, i= nt *empty) if (unlikely(!len)) { if (empty) *empty =3D 1; - if (!(flags & LOOKUP_EMPTY)) { + if (!(flags & (LOOKUP_EMPTY | O_EMPTY_PATH))) { putname(result); return ERR_PTR(-ENOENT); } @@ -2347,7 +2347,7 @@ static const char *path_init(struct nameidata *nd, un= signed flags) if ((flags & (LOOKUP_RCU | LOOKUP_CACHED)) =3D=3D LOOKUP_CACHED) return ERR_PTR(-EAGAIN); =20 - if (!*s) + if (!*s && unlikely(!(flags & O_EMPTY_PATH))) flags &=3D ~LOOKUP_RCU; if (flags & LOOKUP_RCU) rcu_read_lock(); diff --git a/fs/open.c b/fs/open.c index 82c1a28b3308..b4ec054a418f 100644 --- a/fs/open.c +++ b/fs/open.c @@ -1301,7 +1301,7 @@ static long do_sys_openat2(int dfd, const char __user= *filename, if (fd) return fd; =20 - tmp =3D getname(filename); + tmp =3D getname_flags(filename, how->flags & O_EMPTY_PATH, NULL); if (IS_ERR(tmp)) return PTR_ERR(tmp); =20 diff --git a/include/linux/fcntl.h b/include/linux/fcntl.h index a332e79b3207..bf8467bb0bd2 100644 --- a/include/linux/fcntl.h +++ b/include/linux/fcntl.h @@ -10,7 +10,7 @@ (O_RDONLY | O_WRONLY | O_RDWR | O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC | \ O_APPEND | O_NDELAY | O_NONBLOCK | __O_SYNC | O_DSYNC | \ FASYNC | O_DIRECT | O_LARGEFILE | O_DIRECTORY | O_NOFOLLOW | \ - O_NOATIME | O_CLOEXEC | O_PATH | __O_TMPFILE) + O_NOATIME | O_CLOEXEC | O_PATH | __O_TMPFILE | O_EMPTY_PATH) =20 /* List of all valid flags for the how->resolve argument: */ #define VALID_RESOLVE_FLAGS \ diff --git a/include/uapi/asm-generic/fcntl.h b/include/uapi/asm-generic/fc= ntl.h index 1ecdb911add8..a03f4275517b 100644 --- a/include/uapi/asm-generic/fcntl.h +++ b/include/uapi/asm-generic/fcntl.h @@ -89,6 +89,10 @@ #define __O_TMPFILE 020000000 #endif =20 +#ifndef O_EMPTY_PATH +#define O_EMPTY_PATH 040000000 +#endif + /* a horrid kludge trying to make sure that this will fail on old kernels = */ #define O_TMPFILE (__O_TMPFILE | O_DIRECTORY) #define O_TMPFILE_MASK (__O_TMPFILE | O_DIRECTORY | O_CREAT) =20 diff --git a/tools/include/uapi/asm-generic/fcntl.h b/tools/include/uapi/as= m-generic/fcntl.h index b02c8e0f4057..f32a81604296 100644 --- a/tools/include/uapi/asm-generic/fcntl.h +++ b/tools/include/uapi/asm-generic/fcntl.h @@ -89,6 +89,10 @@ #define __O_TMPFILE 020000000 #endif =20 +#ifndef O_EMPTY_PATH +#define O_EMPTY_PATH 040000000 +#endif + /* a horrid kludge trying to make sure that this will fail on old kernels = */ #define O_TMPFILE (__O_TMPFILE | O_DIRECTORY) #define O_TMPFILE_MASK (__O_TMPFILE | O_DIRECTORY | O_CREAT) =20 --=20 2.25.1