diff --git a/src/backend/libc/mount/syscalls.rs b/src/backend/libc/mount/syscalls.rs index 724511480..e354eb43a 100644 --- a/src/backend/libc/mount/syscalls.rs +++ b/src/backend/libc/mount/syscalls.rs @@ -270,3 +270,17 @@ pub(crate) fn fsconfig_reconfigure(fs_fd: BorrowedFd<'_>) -> io::Result<()> { )) } } + +#[cfg(linux_kernel)] +#[cfg(feature = "mount")] +pub(crate) fn fsconfig_create_excl(fs_fd: BorrowedFd<'_>) -> io::Result<()> { + unsafe { + ret(fsconfig( + borrowed_fd(fs_fd), + super::types::FsConfigCmd::CreateExclusive as _, + null(), + null(), + 0, + )) + } +} diff --git a/src/backend/libc/mount/types.rs b/src/backend/libc/mount/types.rs index c39405a49..631fe1b28 100644 --- a/src/backend/libc/mount/types.rs +++ b/src/backend/libc/mount/types.rs @@ -146,6 +146,9 @@ pub(crate) enum FsConfigCmd { /// `FSCONFIG_CMD_RECONFIGURE` Reconfigure = 7, + + /// `FSCONFIG_CMD_CREATE_EXCL` + CreateExclusive = 8, } #[cfg(feature = "mount")] diff --git a/src/backend/linux_raw/mount/syscalls.rs b/src/backend/linux_raw/mount/syscalls.rs index 5cb80cc09..31eee0c82 100644 --- a/src/backend/linux_raw/mount/syscalls.rs +++ b/src/backend/linux_raw/mount/syscalls.rs @@ -237,3 +237,18 @@ pub(crate) fn fsconfig_reconfigure(fs_fd: BorrowedFd<'_>) -> io::Result<()> { )) } } + +#[cfg(feature = "mount")] +#[inline] +pub(crate) fn fsconfig_create_excl(fs_fd: BorrowedFd<'_>) -> io::Result<()> { + unsafe { + ret(syscall_readonly!( + __NR_fsconfig, + fs_fd, + super::types::FsConfigCmd::CreateExclusive, + zero(), + zero(), + zero() + )) + } +} diff --git a/src/backend/linux_raw/mount/types.rs b/src/backend/linux_raw/mount/types.rs index 0e1465d65..04f93c0e1 100644 --- a/src/backend/linux_raw/mount/types.rs +++ b/src/backend/linux_raw/mount/types.rs @@ -144,6 +144,9 @@ pub(crate) enum FsConfigCmd { /// `FSCONFIG_CMD_RECONFIGURE` Reconfigure = linux_raw_sys::general::fsconfig_command::FSCONFIG_CMD_RECONFIGURE as u32, + + /// `FSCONFIG_CMD_CREATE_EXCL` + CreateExclusive = linux_raw_sys::general::fsconfig_command::FSCONFIG_CMD_CREATE_EXCL as u32, } #[cfg(feature = "mount")] diff --git a/src/mount/fsopen.rs b/src/mount/fsopen.rs index 54ba4011f..cacf2c785 100644 --- a/src/mount/fsopen.rs +++ b/src/mount/fsopen.rs @@ -217,3 +217,15 @@ pub fn fsconfig_create(fs_fd: BorrowedFd<'_>) -> io::Result<()> { pub fn fsconfig_reconfigure(fs_fd: BorrowedFd<'_>) -> io::Result<()> { backend::mount::syscalls::fsconfig_reconfigure(fs_fd) } + +/// `fsconfig(fs_fd, FSCONFIG_CMD_CREATE_EXCL, key, NULL, 0)` +/// +/// # References +/// - [Unfinished draft] +/// +/// [Unfinished draft]: https://github.com/sunfishcode/linux-mount-api-documentation/blob/main/fsconfig.md +#[inline] +#[doc(alias = "fsconfig")] +pub fn fsconfig_create_exclusive(fs_fd: BorrowedFd<'_>) -> io::Result<()> { + backend::mount::syscalls::fsconfig_create_excl(fs_fd) +}