lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-Id: <2CCEFA1A-7136-4E78-A0D2-DCA2EFC10C4B@dilger.ca>
Date: Mon, 26 Jan 2026 12:08:29 -0700
From: Andreas Dilger <adilger@...ger.ca>
To: Dorjoy Chowdhury <dorjoychy111@...il.com>
Cc: linux-fsdevel@...r.kernel.org,
 linux-kernel@...r.kernel.org,
 viro@...iv.linux.org.uk,
 brauner@...nel.org,
 jack@...e.cz,
 jlayton@...nel.org,
 chuck.lever@...cle.com,
 alex.aring@...il.com,
 arnd@...db.de
Subject: Re: [PATCH v2 1/2] open: new O_REGULAR flag support

On Jan 26, 2026, at 08:39, Dorjoy Chowdhury <dorjoychy111@...il.com> wrote:
> 
> This flag indicates the path should be opened if it's a regular file.
> A relevant error code ENOTREGULAR(35) has been introduced. For example,
> if open is called on path /dev/null with O_REGULAR in the flag param,
> it will return -ENOTREGULAR.

This appears to be ENOTREG in the actual patch?

It seems possible to use ENOTREG=140 to avoid collisions for _most_ 
of the architectures, leaving only parisc and mips with different
values (which are mostly obsolete anyway).

Similarly, it seems possible to use O_REGULAR 0400000000 to avoid
conflicts for most (all?) architectures as well, instead of having
a different value for several of them.

While it isn't _required_ to have the same values across architectures,
it doesn't hurt and makes human identification of these values easier.

Cheers, Andreas

> When used in combination with O_CREAT, either the regular file is
> created, or if the path already exists, it is opened if it's a regular
> file. Otherwise, -ENOTREGULAR is returned.
> 
> -EINVAL is returned when O_REGULAR is combined with O_DIRECTORY (not
> part of O_TMPFILE) because it doesn't make sense to open a path that
> is both a directory and a regular file.
> 
> Signed-off-by: Dorjoy Chowdhury <dorjoychy111@...il.com>
> ---
> arch/alpha/include/uapi/asm/errno.h        | 2 ++
> arch/alpha/include/uapi/asm/fcntl.h        | 1 +
> arch/mips/include/uapi/asm/errno.h         | 2 ++
> arch/parisc/include/uapi/asm/errno.h       | 2 ++
> arch/parisc/include/uapi/asm/fcntl.h       | 1 +
> arch/sparc/include/uapi/asm/errno.h        | 2 ++
> arch/sparc/include/uapi/asm/fcntl.h        | 1 +
> fs/fcntl.c                                 | 2 +-
> fs/namei.c                                 | 6 ++++++
> fs/open.c                                  | 4 +++-
> include/linux/fcntl.h                      | 2 +-
> include/uapi/asm-generic/errno.h           | 2 ++
> include/uapi/asm-generic/fcntl.h           | 4 ++++
> tools/arch/alpha/include/uapi/asm/errno.h  | 2 ++
> tools/arch/mips/include/uapi/asm/errno.h   | 2 ++
> tools/arch/parisc/include/uapi/asm/errno.h | 2 ++
> tools/arch/sparc/include/uapi/asm/errno.h  | 2 ++
> tools/include/uapi/asm-generic/errno.h     | 2 ++
> 18 files changed, 38 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/alpha/include/uapi/asm/errno.h b/arch/alpha/include/uapi/asm/errno.h
> index 6791f6508632..8bbcaa9024f9 100644
> --- a/arch/alpha/include/uapi/asm/errno.h
> +++ b/arch/alpha/include/uapi/asm/errno.h
> @@ -127,4 +127,6 @@
> 
> #define EHWPOISON 139 /* Memory page has hardware error */
> 
> +#define ENOTREG 140 /* Not a regular file */
> +
> #endif
> diff --git a/arch/alpha/include/uapi/asm/fcntl.h b/arch/alpha/include/uapi/asm/fcntl.h
> index 50bdc8e8a271..4da5a64c23bd 100644
> --- a/arch/alpha/include/uapi/asm/fcntl.h
> +++ b/arch/alpha/include/uapi/asm/fcntl.h
> @@ -34,6 +34,7 @@
> 
> #define O_PATH 040000000
> #define __O_TMPFILE 0100000000
> +#define O_REGULAR 0200000000
> 
> #define F_GETLK 7
> #define F_SETLK 8
> diff --git a/arch/mips/include/uapi/asm/errno.h b/arch/mips/include/uapi/asm/errno.h
> index c01ed91b1ef4..293c78777254 100644
> --- a/arch/mips/include/uapi/asm/errno.h
> +++ b/arch/mips/include/uapi/asm/errno.h
> @@ -126,6 +126,8 @@
> 
> #define EHWPOISON 168 /* Memory page has hardware error */
> 
> +#define ENOTREG 169 /* Not a regular file */
> +
> #define EDQUOT 1133 /* Quota exceeded */
> 
> 
> diff --git a/arch/parisc/include/uapi/asm/errno.h b/arch/parisc/include/uapi/asm/errno.h
> index 8cbc07c1903e..442917484f99 100644
> --- a/arch/parisc/include/uapi/asm/errno.h
> +++ b/arch/parisc/include/uapi/asm/errno.h
> @@ -124,4 +124,6 @@
> 
> #define EHWPOISON 257 /* Memory page has hardware error */
> 
> +#define ENOTREG 258 /* Not a regular file */
> +
> #endif
> diff --git a/arch/parisc/include/uapi/asm/fcntl.h b/arch/parisc/include/uapi/asm/fcntl.h
> index 03dee816cb13..efd763335ff7 100644
> --- a/arch/parisc/include/uapi/asm/fcntl.h
> +++ b/arch/parisc/include/uapi/asm/fcntl.h
> @@ -19,6 +19,7 @@
> 
> #define O_PATH 020000000
> #define __O_TMPFILE 040000000
> +#define O_REGULAR 060000000
> 
> #define F_GETLK64 8
> #define F_SETLK64 9
> diff --git a/arch/sparc/include/uapi/asm/errno.h b/arch/sparc/include/uapi/asm/errno.h
> index 4a41e7835fd5..8dce0bfeab74 100644
> --- a/arch/sparc/include/uapi/asm/errno.h
> +++ b/arch/sparc/include/uapi/asm/errno.h
> @@ -117,4 +117,6 @@
> 
> #define EHWPOISON 135 /* Memory page has hardware error */
> 
> +#define ENOTREG 136 /* Not a regular file */
> +
> #endif
> diff --git a/arch/sparc/include/uapi/asm/fcntl.h b/arch/sparc/include/uapi/asm/fcntl.h
> index 67dae75e5274..a93d18d2c23e 100644
> --- a/arch/sparc/include/uapi/asm/fcntl.h
> +++ b/arch/sparc/include/uapi/asm/fcntl.h
> @@ -37,6 +37,7 @@
> 
> #define O_PATH 0x1000000
> #define __O_TMPFILE 0x2000000
> +#define O_REGULAR 0x4000000
> 
> #define F_GETOWN 5 /*  for sockets. */
> #define F_SETOWN 6 /*  for sockets. */
> 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/namei.c b/fs/namei.c
> index b28ecb699f32..f5504ae4b03c 100644
> --- a/fs/namei.c
> +++ b/fs/namei.c
> @@ -4616,6 +4616,10 @@ static int do_open(struct nameidata *nd,
> if (unlikely(error))
> return error;
> }
> +
> + if ((open_flag & O_REGULAR) && !d_is_reg(nd->path.dentry))
> + return -ENOTREG;
> +
> if ((nd->flags & LOOKUP_DIRECTORY) && !d_can_lookup(nd->path.dentry))
> return -ENOTDIR;
> 
> @@ -4765,6 +4769,8 @@ static int do_o_path(struct nameidata *nd, unsigned flags, struct file *file)
> struct path path;
> int error = path_lookupat(nd, flags, &path);
> if (!error) {
> + if ((file->f_flags & O_REGULAR) && !d_is_reg(path.dentry))
> + return -ENOTREG;
> audit_inode(nd->name, path.dentry, 0);
> error = vfs_open(&path, file);
> path_put(&path);
> diff --git a/fs/open.c b/fs/open.c
> index 74c4c1462b3e..82153e21907e 100644
> --- a/fs/open.c
> +++ b/fs/open.c
> @@ -1173,7 +1173,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_REGULAR)
> 
> inline struct open_how build_open_how(int flags, umode_t mode)
> {
> @@ -1250,6 +1250,8 @@ inline int build_open_flags(const struct open_how *how, struct open_flags *op)
> return -EINVAL;
> if (!(acc_mode & MAY_WRITE))
> return -EINVAL;
> + } else if ((flags & O_DIRECTORY) && (flags & O_REGULAR)) {
> + return -EINVAL;
> }
> if (flags & O_PATH) {
> /* O_PATH only permits certain other flags to be set. */
> diff --git a/include/linux/fcntl.h b/include/linux/fcntl.h
> index a332e79b3207..4fd07b0e0a17 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_REGULAR)
> 
> /* List of all valid flags for the how->resolve argument: */
> #define VALID_RESOLVE_FLAGS \
> diff --git a/include/uapi/asm-generic/errno.h b/include/uapi/asm-generic/errno.h
> index 92e7ae493ee3..2216ab9aa32e 100644
> --- a/include/uapi/asm-generic/errno.h
> +++ b/include/uapi/asm-generic/errno.h
> @@ -122,4 +122,6 @@
> 
> #define EHWPOISON 133 /* Memory page has hardware error */
> 
> +#define ENOTREG 134 /* Not a regular file */
> +
> #endif
> diff --git a/include/uapi/asm-generic/fcntl.h b/include/uapi/asm-generic/fcntl.h
> index 613475285643..3468b352a575 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_REGULAR
> +#define O_REGULAR 040000000
> +#endif
> +
> /* a horrid kludge trying to make sure that this will fail on old kernels */
> #define O_TMPFILE (__O_TMPFILE | O_DIRECTORY)
> 
> diff --git a/tools/arch/alpha/include/uapi/asm/errno.h b/tools/arch/alpha/include/uapi/asm/errno.h
> index 6791f6508632..8bbcaa9024f9 100644
> --- a/tools/arch/alpha/include/uapi/asm/errno.h
> +++ b/tools/arch/alpha/include/uapi/asm/errno.h
> @@ -127,4 +127,6 @@
> 
> #define EHWPOISON 139 /* Memory page has hardware error */
> 
> +#define ENOTREG 140 /* Not a regular file */
> +
> #endif
> diff --git a/tools/arch/mips/include/uapi/asm/errno.h b/tools/arch/mips/include/uapi/asm/errno.h
> index c01ed91b1ef4..293c78777254 100644
> --- a/tools/arch/mips/include/uapi/asm/errno.h
> +++ b/tools/arch/mips/include/uapi/asm/errno.h
> @@ -126,6 +126,8 @@
> 
> #define EHWPOISON 168 /* Memory page has hardware error */
> 
> +#define ENOTREG 169 /* Not a regular file */
> +
> #define EDQUOT 1133 /* Quota exceeded */
> 
> 
> diff --git a/tools/arch/parisc/include/uapi/asm/errno.h b/tools/arch/parisc/include/uapi/asm/errno.h
> index 8cbc07c1903e..442917484f99 100644
> --- a/tools/arch/parisc/include/uapi/asm/errno.h
> +++ b/tools/arch/parisc/include/uapi/asm/errno.h
> @@ -124,4 +124,6 @@
> 
> #define EHWPOISON 257 /* Memory page has hardware error */
> 
> +#define ENOTREG 258 /* Not a regular file */
> +
> #endif
> diff --git a/tools/arch/sparc/include/uapi/asm/errno.h b/tools/arch/sparc/include/uapi/asm/errno.h
> index 4a41e7835fd5..8dce0bfeab74 100644
> --- a/tools/arch/sparc/include/uapi/asm/errno.h
> +++ b/tools/arch/sparc/include/uapi/asm/errno.h
> @@ -117,4 +117,6 @@
> 
> #define EHWPOISON 135 /* Memory page has hardware error */
> 
> +#define ENOTREG 136 /* Not a regular file */
> +
> #endif
> diff --git a/tools/include/uapi/asm-generic/errno.h b/tools/include/uapi/asm-generic/errno.h
> index 92e7ae493ee3..2216ab9aa32e 100644
> --- a/tools/include/uapi/asm-generic/errno.h
> +++ b/tools/include/uapi/asm-generic/errno.h
> @@ -122,4 +122,6 @@
> 
> #define EHWPOISON 133 /* Memory page has hardware error */
> 
> +#define ENOTREG 134 /* Not a regular file */
> +
> #endif
> -- 
> 2.52.0
> 
> 


Cheers, Andreas






Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ