public inbox for linux-fsdevel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Add support for empty path in openat and openat2 syscalls
@ 2026-02-23 15:16 Jori Koolstra
  2026-02-23 15:28 ` Jeff Layton
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Jori Koolstra @ 2026-02-23 15:16 UTC (permalink / raw)
  To: jlayton, chuck.lever, alex.aring, viro, brauner, jack, arnd,
	linux-fsdevel, linux-kernel, linux-arch
  Cc: jkoolstra

To get an operable version of an O_PATH file descriptors, it is possible
to use openat(fd, ".", O_DIRECTORY) for directories, but other files
currently require going through open("/proc/<pid>/fd/<nr>") which
depends on a functioning procfs.

This patch adds the O_EMPTY_PATH flag to openat and openat2. If passed
LOOKUP_EMPTY is set at path resolve time.

Signed-off-by: Jori Koolstra <jkoolstra@xs4all.nl>
---
 fs/fcntl.c                       | 2 +-
 fs/open.c                        | 6 ++++--
 include/linux/fcntl.h            | 2 +-
 include/uapi/asm-generic/fcntl.h | 4 ++++
 4 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/fs/fcntl.c b/fs/fcntl.c
index f93dbca08435..62ab4ad2b6f5 100644
--- a/fs/fcntl.c
+++ b/fs/fcntl.c
@@ -1169,7 +1169,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(20 - 1 /* for O_RDONLY being 0 */ !=
+	BUILD_BUG_ON(21 - 1 /* for O_RDONLY being 0 */ !=
 		HWEIGHT32(
 			(VALID_OPEN_FLAGS & ~(O_NONBLOCK | O_NDELAY)) |
 			__FMODE_EXEC));
diff --git a/fs/open.c b/fs/open.c
index 91f1139591ab..32865822ca1c 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -1160,7 +1160,7 @@ struct file *kernel_file_open(const struct path *path, int flags,
 EXPORT_SYMBOL_GPL(kernel_file_open);
 
 #define WILL_CREATE(flags)	(flags & (O_CREAT | __O_TMPFILE))
-#define O_PATH_FLAGS		(O_DIRECTORY | O_NOFOLLOW | O_PATH | O_CLOEXEC)
+#define O_PATH_FLAGS		(O_DIRECTORY | O_NOFOLLOW | O_PATH | O_CLOEXEC | O_EMPTY_PATH)
 
 inline struct open_how build_open_how(int flags, umode_t mode)
 {
@@ -1277,6 +1277,8 @@ inline int build_open_flags(const struct open_how *how, struct open_flags *op)
 		}
 	}
 
+	if (flags & O_EMPTY_PATH)
+		lookup_flags |= LOOKUP_EMPTY;
 	if (flags & O_DIRECTORY)
 		lookup_flags |= LOOKUP_DIRECTORY;
 	if (!(flags & O_NOFOLLOW))
@@ -1362,7 +1364,7 @@ static int do_sys_openat2(int dfd, const char __user *filename,
 	if (unlikely(err))
 		return err;
 
-	CLASS(filename, name)(filename);
+	CLASS(filename_flags, name)(filename, op.lookup_flags);
 	return FD_ADD(how->flags, do_file_open(dfd, name, &op));
 }
 
diff --git a/include/linux/fcntl.h b/include/linux/fcntl.h
index a332e79b3207..ce742f67bf60 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_EMPTY_PATH | __O_TMPFILE)
 
 /* 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/fcntl.h
index 613475285643..8e4e796ad212 100644
--- a/include/uapi/asm-generic/fcntl.h
+++ b/include/uapi/asm-generic/fcntl.h
@@ -88,6 +88,10 @@
 #define __O_TMPFILE	020000000
 #endif
 
+#ifndef O_EMPTY_PATH
+#define O_EMPTY_PATH	0100000000
+#endif
+
 /* a horrid kludge trying to make sure that this will fail on old kernels */
 #define O_TMPFILE (__O_TMPFILE | O_DIRECTORY)
 
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH] Add support for empty path in openat and openat2 syscalls
  2026-02-23 15:16 [PATCH] Add support for empty path in openat and openat2 syscalls Jori Koolstra
@ 2026-02-23 15:28 ` Jeff Layton
  2026-02-24 10:10   ` Christian Brauner
  2026-02-23 16:32 ` kernel test robot
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 9+ messages in thread
From: Jeff Layton @ 2026-02-23 15:28 UTC (permalink / raw)
  To: Jori Koolstra, chuck.lever, alex.aring, viro, brauner, jack, arnd,
	linux-fsdevel, linux-kernel, linux-arch

On Mon, 2026-02-23 at 16:16 +0100, Jori Koolstra wrote:
> To get an operable version of an O_PATH file descriptors, it is possible
> to use openat(fd, ".", O_DIRECTORY) for directories, but other files
> currently require going through open("/proc/<pid>/fd/<nr>") which
> depends on a functioning procfs.
> 
> This patch adds the O_EMPTY_PATH flag to openat and openat2. If passed
> LOOKUP_EMPTY is set at path resolve time.
> 

This sounds valuable, but there was recent discussion around the
O_REGULAR flag that said that we shouldn't be adding new flags to older
syscalls [1]. Should this only be an OPENAT2_* flag instead?

[1]: https://lore.kernel.org/linux-fsdevel/20260129-siebzehn-adler-efe74ff8f1a9@brauner/


> Signed-off-by: Jori Koolstra <jkoolstra@xs4all.nl>
> ---
>  fs/fcntl.c                       | 2 +-
>  fs/open.c                        | 6 ++++--
>  include/linux/fcntl.h            | 2 +-
>  include/uapi/asm-generic/fcntl.h | 4 ++++
>  4 files changed, 10 insertions(+), 4 deletions(-)
> 
> diff --git a/fs/fcntl.c b/fs/fcntl.c
> index f93dbca08435..62ab4ad2b6f5 100644
> --- a/fs/fcntl.c
> +++ b/fs/fcntl.c
> @@ -1169,7 +1169,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(20 - 1 /* for O_RDONLY being 0 */ !=
> +	BUILD_BUG_ON(21 - 1 /* for O_RDONLY being 0 */ !=
>  		HWEIGHT32(
>  			(VALID_OPEN_FLAGS & ~(O_NONBLOCK | O_NDELAY)) |
>  			__FMODE_EXEC));
> diff --git a/fs/open.c b/fs/open.c
> index 91f1139591ab..32865822ca1c 100644
> --- a/fs/open.c
> +++ b/fs/open.c
> @@ -1160,7 +1160,7 @@ struct file *kernel_file_open(const struct path *path, int flags,
>  EXPORT_SYMBOL_GPL(kernel_file_open);
>  
>  #define WILL_CREATE(flags)	(flags & (O_CREAT | __O_TMPFILE))
> -#define O_PATH_FLAGS		(O_DIRECTORY | O_NOFOLLOW | O_PATH | O_CLOEXEC)
> +#define O_PATH_FLAGS		(O_DIRECTORY | O_NOFOLLOW | O_PATH | O_CLOEXEC | O_EMPTY_PATH)
>  
>  inline struct open_how build_open_how(int flags, umode_t mode)
>  {
> @@ -1277,6 +1277,8 @@ inline int build_open_flags(const struct open_how *how, struct open_flags *op)
>  		}
>  	}
>  
> +	if (flags & O_EMPTY_PATH)
> +		lookup_flags |= LOOKUP_EMPTY;
>  	if (flags & O_DIRECTORY)
>  		lookup_flags |= LOOKUP_DIRECTORY;
>  	if (!(flags & O_NOFOLLOW))
> @@ -1362,7 +1364,7 @@ static int do_sys_openat2(int dfd, const char __user *filename,
>  	if (unlikely(err))
>  		return err;
>  
> -	CLASS(filename, name)(filename);
> +	CLASS(filename_flags, name)(filename, op.lookup_flags);
>  	return FD_ADD(how->flags, do_file_open(dfd, name, &op));
>  }
>  
> diff --git a/include/linux/fcntl.h b/include/linux/fcntl.h
> index a332e79b3207..ce742f67bf60 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_EMPTY_PATH | __O_TMPFILE)
>  
>  /* 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/fcntl.h
> index 613475285643..8e4e796ad212 100644
> --- a/include/uapi/asm-generic/fcntl.h
> +++ b/include/uapi/asm-generic/fcntl.h
> @@ -88,6 +88,10 @@
>  #define __O_TMPFILE	020000000
>  #endif
>  
> +#ifndef O_EMPTY_PATH
> +#define O_EMPTY_PATH	0100000000
> +#endif
> +
>  /* a horrid kludge trying to make sure that this will fail on old kernels */
>  #define O_TMPFILE (__O_TMPFILE | O_DIRECTORY)
>  

-- 
Jeff Layton <jlayton@kernel.org>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Add support for empty path in openat and openat2 syscalls
  2026-02-23 15:16 [PATCH] Add support for empty path in openat and openat2 syscalls Jori Koolstra
  2026-02-23 15:28 ` Jeff Layton
@ 2026-02-23 16:32 ` kernel test robot
  2026-02-23 16:45 ` David Laight
  2026-02-24  9:30 ` Christian Brauner
  3 siblings, 0 replies; 9+ messages in thread
From: kernel test robot @ 2026-02-23 16:32 UTC (permalink / raw)
  To: Jori Koolstra, jlayton, chuck.lever, alex.aring, viro, brauner,
	jack, arnd, linux-fsdevel, linux-kernel, linux-arch
  Cc: oe-kbuild-all, jkoolstra

Hi Jori,

kernel test robot noticed the following build errors:

[auto build test ERROR on brauner-vfs/vfs.all]
[also build test ERROR on linus/master v7.0-rc1 next-20260220]
[cannot apply to arnd-asm-generic/master]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Jori-Koolstra/Add-support-for-empty-path-in-openat-and-openat2-syscalls/20260223-232002
base:   https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git vfs.all
patch link:    https://lore.kernel.org/r/20260223151652.582048-1-jkoolstra%40xs4all.nl
patch subject: [PATCH] Add support for empty path in openat and openat2 syscalls
config: alpha-allnoconfig (https://download.01.org/0day-ci/archive/20260224/202602240038.MTqLbuRR-lkp@intel.com/config)
compiler: alpha-linux-gcc (GCC) 15.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260224/202602240038.MTqLbuRR-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202602240038.MTqLbuRR-lkp@intel.com/

All errors (new ones prefixed by >>):

   In file included from <command-line>:
   fs/fcntl.c: In function 'fcntl_init':
>> include/linux/compiler_types.h:705:45: error: call to '__compiletime_assert_393' declared with attribute error: BUILD_BUG_ON failed: 21 - 1 != HWEIGHT32( (VALID_OPEN_FLAGS & ~(O_NONBLOCK | O_NDELAY)) | __FMODE_EXEC)
     705 |         _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
         |                                             ^
   include/linux/compiler_types.h:686:25: note: in definition of macro '__compiletime_assert'
     686 |                         prefix ## suffix();                             \
         |                         ^~~~~~
   include/linux/compiler_types.h:705:9: note: in expansion of macro '_compiletime_assert'
     705 |         _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
         |         ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
      39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
         |                                     ^~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:50:9: note: in expansion of macro 'BUILD_BUG_ON_MSG'
      50 |         BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition)
         |         ^~~~~~~~~~~~~~~~
   fs/fcntl.c:1172:9: note: in expansion of macro 'BUILD_BUG_ON'
    1172 |         BUILD_BUG_ON(21 - 1 /* for O_RDONLY being 0 */ !=
         |         ^~~~~~~~~~~~


vim +/__compiletime_assert_393 +705 include/linux/compiler_types.h

eb5c2d4b45e3d2d Will Deacon 2020-07-21  691  
eb5c2d4b45e3d2d Will Deacon 2020-07-21  692  #define _compiletime_assert(condition, msg, prefix, suffix) \
eb5c2d4b45e3d2d Will Deacon 2020-07-21  693  	__compiletime_assert(condition, msg, prefix, suffix)
eb5c2d4b45e3d2d Will Deacon 2020-07-21  694  
eb5c2d4b45e3d2d Will Deacon 2020-07-21  695  /**
eb5c2d4b45e3d2d Will Deacon 2020-07-21  696   * compiletime_assert - break build and emit msg if condition is false
eb5c2d4b45e3d2d Will Deacon 2020-07-21  697   * @condition: a compile-time constant condition to check
eb5c2d4b45e3d2d Will Deacon 2020-07-21  698   * @msg:       a message to emit if condition is false
eb5c2d4b45e3d2d Will Deacon 2020-07-21  699   *
eb5c2d4b45e3d2d Will Deacon 2020-07-21  700   * In tradition of POSIX assert, this macro will break the build if the
eb5c2d4b45e3d2d Will Deacon 2020-07-21  701   * supplied condition is *false*, emitting the supplied error message if the
eb5c2d4b45e3d2d Will Deacon 2020-07-21  702   * compiler has support to do so.
eb5c2d4b45e3d2d Will Deacon 2020-07-21  703   */
eb5c2d4b45e3d2d Will Deacon 2020-07-21  704  #define compiletime_assert(condition, msg) \
eb5c2d4b45e3d2d Will Deacon 2020-07-21 @705  	_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
eb5c2d4b45e3d2d Will Deacon 2020-07-21  706  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Add support for empty path in openat and openat2 syscalls
  2026-02-23 15:16 [PATCH] Add support for empty path in openat and openat2 syscalls Jori Koolstra
  2026-02-23 15:28 ` Jeff Layton
  2026-02-23 16:32 ` kernel test robot
@ 2026-02-23 16:45 ` David Laight
  2026-02-24  9:30 ` Christian Brauner
  3 siblings, 0 replies; 9+ messages in thread
From: David Laight @ 2026-02-23 16:45 UTC (permalink / raw)
  To: Jori Koolstra
  Cc: jlayton, chuck.lever, alex.aring, viro, brauner, jack, arnd,
	linux-fsdevel, linux-kernel, linux-arch

On Mon, 23 Feb 2026 16:16:52 +0100
Jori Koolstra <jkoolstra@xs4all.nl> wrote:

> To get an operable version of an O_PATH file descriptors, it is possible
> to use openat(fd, ".", O_DIRECTORY) for directories, but other files
> currently require going through open("/proc/<pid>/fd/<nr>") which
> depends on a functioning procfs.

What do you want the fd for?
There are good reasons for wanting an fd for a directory that you don't
have access permissions for, but what is the use case for a file?

It all gets very close to letting you do things that the 'security model'
should reject.

	David

> 
> This patch adds the O_EMPTY_PATH flag to openat and openat2. If passed
> LOOKUP_EMPTY is set at path resolve time.
> 
> Signed-off-by: Jori Koolstra <jkoolstra@xs4all.nl>
> ---
>  fs/fcntl.c                       | 2 +-
>  fs/open.c                        | 6 ++++--
>  include/linux/fcntl.h            | 2 +-
>  include/uapi/asm-generic/fcntl.h | 4 ++++
>  4 files changed, 10 insertions(+), 4 deletions(-)
> 
> diff --git a/fs/fcntl.c b/fs/fcntl.c
> index f93dbca08435..62ab4ad2b6f5 100644
> --- a/fs/fcntl.c
> +++ b/fs/fcntl.c
> @@ -1169,7 +1169,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(20 - 1 /* for O_RDONLY being 0 */ !=
> +	BUILD_BUG_ON(21 - 1 /* for O_RDONLY being 0 */ !=
>  		HWEIGHT32(
>  			(VALID_OPEN_FLAGS & ~(O_NONBLOCK | O_NDELAY)) |
>  			__FMODE_EXEC));
> diff --git a/fs/open.c b/fs/open.c
> index 91f1139591ab..32865822ca1c 100644
> --- a/fs/open.c
> +++ b/fs/open.c
> @@ -1160,7 +1160,7 @@ struct file *kernel_file_open(const struct path *path, int flags,
>  EXPORT_SYMBOL_GPL(kernel_file_open);
>  
>  #define WILL_CREATE(flags)	(flags & (O_CREAT | __O_TMPFILE))
> -#define O_PATH_FLAGS		(O_DIRECTORY | O_NOFOLLOW | O_PATH | O_CLOEXEC)
> +#define O_PATH_FLAGS		(O_DIRECTORY | O_NOFOLLOW | O_PATH | O_CLOEXEC | O_EMPTY_PATH)
>  
>  inline struct open_how build_open_how(int flags, umode_t mode)
>  {
> @@ -1277,6 +1277,8 @@ inline int build_open_flags(const struct open_how *how, struct open_flags *op)
>  		}
>  	}
>  
> +	if (flags & O_EMPTY_PATH)
> +		lookup_flags |= LOOKUP_EMPTY;
>  	if (flags & O_DIRECTORY)
>  		lookup_flags |= LOOKUP_DIRECTORY;
>  	if (!(flags & O_NOFOLLOW))
> @@ -1362,7 +1364,7 @@ static int do_sys_openat2(int dfd, const char __user *filename,
>  	if (unlikely(err))
>  		return err;
>  
> -	CLASS(filename, name)(filename);
> +	CLASS(filename_flags, name)(filename, op.lookup_flags);
>  	return FD_ADD(how->flags, do_file_open(dfd, name, &op));
>  }
>  
> diff --git a/include/linux/fcntl.h b/include/linux/fcntl.h
> index a332e79b3207..ce742f67bf60 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_EMPTY_PATH | __O_TMPFILE)
>  
>  /* 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/fcntl.h
> index 613475285643..8e4e796ad212 100644
> --- a/include/uapi/asm-generic/fcntl.h
> +++ b/include/uapi/asm-generic/fcntl.h
> @@ -88,6 +88,10 @@
>  #define __O_TMPFILE	020000000
>  #endif
>  
> +#ifndef O_EMPTY_PATH
> +#define O_EMPTY_PATH	0100000000
> +#endif
> +
>  /* a horrid kludge trying to make sure that this will fail on old kernels */
>  #define O_TMPFILE (__O_TMPFILE | O_DIRECTORY)
>  


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Add support for empty path in openat and openat2 syscalls
  2026-02-23 15:16 [PATCH] Add support for empty path in openat and openat2 syscalls Jori Koolstra
                   ` (2 preceding siblings ...)
  2026-02-23 16:45 ` David Laight
@ 2026-02-24  9:30 ` Christian Brauner
  2026-02-24 13:33   ` Jori Koolstra
  3 siblings, 1 reply; 9+ messages in thread
From: Christian Brauner @ 2026-02-24  9:30 UTC (permalink / raw)
  To: Jori Koolstra
  Cc: jlayton, chuck.lever, alex.aring, viro, jack, arnd, linux-fsdevel,
	linux-kernel, linux-arch

On Mon, Feb 23, 2026 at 04:16:52PM +0100, Jori Koolstra wrote:
> To get an operable version of an O_PATH file descriptors, it is possible
> to use openat(fd, ".", O_DIRECTORY) for directories, but other files
> currently require going through open("/proc/<pid>/fd/<nr>") which
> depends on a functioning procfs.
> 
> This patch adds the O_EMPTY_PATH flag to openat and openat2. If passed
> LOOKUP_EMPTY is set at path resolve time.
> 
> Signed-off-by: Jori Koolstra <jkoolstra@xs4all.nl>
> ---

Out of curiosity, did you pick this taken from our uapi-group list?

https://github.com/uapi-group/kernel-features?tab=readme-ov-file#at_empty_path-support-for-openat-and-openat2
https://github.com/uapi-group/kernel-features/issues/47

?

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Add support for empty path in openat and openat2 syscalls
  2026-02-23 15:28 ` Jeff Layton
@ 2026-02-24 10:10   ` Christian Brauner
  2026-02-24 13:35     ` Jori Koolstra
  0 siblings, 1 reply; 9+ messages in thread
From: Christian Brauner @ 2026-02-24 10:10 UTC (permalink / raw)
  To: Jeff Layton
  Cc: Jori Koolstra, chuck.lever, alex.aring, viro, jack, arnd,
	linux-fsdevel, linux-kernel, linux-arch

On Mon, Feb 23, 2026 at 10:28:24AM -0500, Jeff Layton wrote:
> On Mon, 2026-02-23 at 16:16 +0100, Jori Koolstra wrote:
> > To get an operable version of an O_PATH file descriptors, it is possible
> > to use openat(fd, ".", O_DIRECTORY) for directories, but other files
> > currently require going through open("/proc/<pid>/fd/<nr>") which
> > depends on a functioning procfs.
> > 
> > This patch adds the O_EMPTY_PATH flag to openat and openat2. If passed
> > LOOKUP_EMPTY is set at path resolve time.
> > 
> 
> This sounds valuable, but there was recent discussion around the
> O_REGULAR flag that said that we shouldn't be adding new flags to older
> syscalls [1]. Should this only be an OPENAT2_* flag instead?
> 
> [1]: https://lore.kernel.org/linux-fsdevel/20260129-siebzehn-adler-efe74ff8f1a9@brauner/

I do like restricting it to openat2() as well.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Add support for empty path in openat and openat2 syscalls
  2026-02-24  9:30 ` Christian Brauner
@ 2026-02-24 13:33   ` Jori Koolstra
  0 siblings, 0 replies; 9+ messages in thread
From: Jori Koolstra @ 2026-02-24 13:33 UTC (permalink / raw)
  To: Christian Brauner
  Cc: jlayton, chuck.lever, alex.aring, viro, jack, arnd, linux-fsdevel,
	linux-kernel, linux-arch

Hi Christian,

> Op 24-02-2026 10:30 CET schreef Christian Brauner <brauner@kernel.org>:
> 
> Out of curiosity, did you pick this taken from our uapi-group list?
> 
> https://github.com/uapi-group/kernel-features?tab=readme-ov-file#at_empty_path-support-for-openat-and-openat2
> https://github.com/uapi-group/kernel-features/issues/47
> 
> ?

Yes, I took the advice you gave me at FOSDEM to heart :) . I should have maybe
mentioned that this patch is in reference to the UAPI list, but forgot that in
the patch message and did not want to send another email about it.

Best,
Jori.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Add support for empty path in openat and openat2 syscalls
  2026-02-24 10:10   ` Christian Brauner
@ 2026-02-24 13:35     ` Jori Koolstra
  2026-02-24 14:31       ` Christian Brauner
  0 siblings, 1 reply; 9+ messages in thread
From: Jori Koolstra @ 2026-02-24 13:35 UTC (permalink / raw)
  To: Christian Brauner, Jeff Layton
  Cc: chuck.lever, alex.aring, viro, jack, arnd, linux-fsdevel,
	linux-kernel, linux-arch


> Op 24-02-2026 11:10 CET schreef Christian Brauner <brauner@kernel.org>:
> 
>  
> On Mon, Feb 23, 2026 at 10:28:24AM -0500, Jeff Layton wrote:
> > On Mon, 2026-02-23 at 16:16 +0100, Jori Koolstra wrote:
> > > To get an operable version of an O_PATH file descriptors, it is possible
> > > to use openat(fd, ".", O_DIRECTORY) for directories, but other files
> > > currently require going through open("/proc/<pid>/fd/<nr>") which
> > > depends on a functioning procfs.
> > > 
> > > This patch adds the O_EMPTY_PATH flag to openat and openat2. If passed
> > > LOOKUP_EMPTY is set at path resolve time.
> > > 
> > 
> > This sounds valuable, but there was recent discussion around the
> > O_REGULAR flag that said that we shouldn't be adding new flags to older
> > syscalls [1]. Should this only be an OPENAT2_* flag instead?
> > 
> > [1]: https://lore.kernel.org/linux-fsdevel/20260129-siebzehn-adler-efe74ff8f1a9@brauner/
> 
> I do like restricting it to openat2() as well.

So would you want to filter the O_EMPTY_PATH flag from openat(), or maybe add
a RESOLVE_EMPTY flag to the resolve options?

Thanks,
Jori.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Add support for empty path in openat and openat2 syscalls
  2026-02-24 13:35     ` Jori Koolstra
@ 2026-02-24 14:31       ` Christian Brauner
  0 siblings, 0 replies; 9+ messages in thread
From: Christian Brauner @ 2026-02-24 14:31 UTC (permalink / raw)
  To: Jori Koolstra
  Cc: Jeff Layton, chuck.lever, alex.aring, viro, jack, arnd,
	linux-fsdevel, linux-kernel, linux-arch

On Tue, Feb 24, 2026 at 02:35:00PM +0100, Jori Koolstra wrote:
> 
> > Op 24-02-2026 11:10 CET schreef Christian Brauner <brauner@kernel.org>:
> > 
> >  
> > On Mon, Feb 23, 2026 at 10:28:24AM -0500, Jeff Layton wrote:
> > > On Mon, 2026-02-23 at 16:16 +0100, Jori Koolstra wrote:
> > > > To get an operable version of an O_PATH file descriptors, it is possible
> > > > to use openat(fd, ".", O_DIRECTORY) for directories, but other files
> > > > currently require going through open("/proc/<pid>/fd/<nr>") which
> > > > depends on a functioning procfs.
> > > > 
> > > > This patch adds the O_EMPTY_PATH flag to openat and openat2. If passed
> > > > LOOKUP_EMPTY is set at path resolve time.
> > > > 
> > > 
> > > This sounds valuable, but there was recent discussion around the
> > > O_REGULAR flag that said that we shouldn't be adding new flags to older
> > > syscalls [1]. Should this only be an OPENAT2_* flag instead?
> > > 
> > > [1]: https://lore.kernel.org/linux-fsdevel/20260129-siebzehn-adler-efe74ff8f1a9@brauner/
> > 
> > I do like restricting it to openat2() as well.
> 
> So would you want to filter the O_EMPTY_PATH flag from openat(), or maybe add
> a RESOLVE_EMPTY flag to the resolve options?

No, add a OPENAT2_EMPTY_PATH in the upper 32 bit of the 64-bit flag
argument for struct open_how. Then it cannot be used in openat(). But
let's wait a day or so to see whether we have someone that really wants
to extend this to openat() as well...

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2026-02-24 14:31 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-23 15:16 [PATCH] Add support for empty path in openat and openat2 syscalls Jori Koolstra
2026-02-23 15:28 ` Jeff Layton
2026-02-24 10:10   ` Christian Brauner
2026-02-24 13:35     ` Jori Koolstra
2026-02-24 14:31       ` Christian Brauner
2026-02-23 16:32 ` kernel test robot
2026-02-23 16:45 ` David Laight
2026-02-24  9:30 ` Christian Brauner
2026-02-24 13:33   ` Jori Koolstra

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox