]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
libext2fs: don't look for O_EXCL in the F_GETFL output
authorDarrick J. Wong <djwong@kernel.org>
Thu, 28 Aug 2025 17:30:38 +0000 (10:30 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Fri, 17 Oct 2025 23:34:21 +0000 (16:34 -0700)
For decades, Linux has never propagated O_EXCL into the user-visible
file flags in do_dentry_open:

f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);

Therefore, one cannot use F_GETFL to determine if the file was opened
with O_EXCL.  The unixfd IO manager will have to trust that the caller
opened the file in O_EXCL mode.  Without this patch, the upcoming flock
patch will not work correctly in determining the lock mode to keep other
copies of fuse4fs and/or systemd from touching a fuse4fs mounted
filesystem.

Cc: <linux-ext4@vger.kernel.org> # v1.43.2
Fixes: 4ccf9e4fe165cf ("libext2fs: add unixfd_io_manager")
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
lib/ext2fs/unix_io.c

index adbdd5f6603d74c578bb1a7e45a814acb662ff63..723a5c2474cdd5d0d3f3aed75c148ba31d009575 100644 (file)
@@ -1090,11 +1090,10 @@ static errcode_t unixfd_open(const char *str_fd, int flags,
        if (fd_flags == -1)
                return EBADF;
 
-       flags = 0;
+       /* O_EXCL is cleared by Linux at open and not returned by F_GETFL */
+       flags &= IO_FLAG_EXCLUSIVE;
        if (fd_flags & O_RDWR)
                flags |= IO_FLAG_RW;
-       if (fd_flags & O_EXCL)
-               flags |= IO_FLAG_EXCLUSIVE;
 #if defined(O_DIRECT)
        if (fd_flags & O_DIRECT)
                flags |= IO_FLAG_DIRECT_IO;