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>
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;