From 1ef396b684a419b5a50ab215103486d189068800 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Mon, 5 Feb 2024 20:33:10 -0500 Subject: [PATCH] cmd_subvolume: Fix snapshot creation with implicit source Signed-off-by: Kent Overstreet --- src/commands/cmd_subvolume.rs | 3 ++- src/wrappers/handle.rs | 16 +++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/commands/cmd_subvolume.rs b/src/commands/cmd_subvolume.rs index 57c679a..85183fa 100644 --- a/src/commands/cmd_subvolume.rs +++ b/src/commands/cmd_subvolume.rs @@ -22,11 +22,12 @@ enum Subcommands { /// Path target: PathBuf }, + #[command(allow_missing_positional = true)] Snapshot { /// Make snapshot read only #[arg(long, short = 'r')] read_only: bool, - source: PathBuf, + source: Option, dest: PathBuf } } diff --git a/src/wrappers/handle.rs b/src/wrappers/handle.rs index 9dd6618..336a029 100644 --- a/src/wrappers/handle.rs +++ b/src/wrappers/handle.rs @@ -82,17 +82,23 @@ impl BcachefsHandle { /// Snapshot a subvolume for this bcachefs filesystem /// at the given path - pub fn snapshot_subvolume>(&self, extra_flags: u32, src: P, dst: P) -> Result<(), Errno> { - let src = CString::new(src.as_ref().as_os_str().as_bytes()).expect("Failed to cast source path for subvolume in a C-style string"); + pub fn snapshot_subvolume>(&self, extra_flags: u32, src: Option

, dst: P) -> Result<(), Errno> { + let src = src.map(|src| CString::new(src.as_ref().as_os_str().as_bytes()).expect("Failed to cast source path for subvolume in a C-style string")); let dst = CString::new(dst.as_ref().as_os_str().as_bytes()).expect("Failed to cast destination path for subvolume in a C-style string"); - self.ioctl(BcachefsIoctl::SubvolumeCreate, &BcachefsIoctlPayload::Subvolume(bch_ioctl_subvolume { + + let res = self.ioctl(BcachefsIoctl::SubvolumeCreate, &BcachefsIoctlPayload::Subvolume(bch_ioctl_subvolume { flags: BCH_SUBVOL_SNAPSHOT_CREATE | extra_flags, dirfd: libc::AT_FDCWD, mode: 0o777, - src_ptr: src.as_ptr() as u64, + src_ptr: src.as_ref().map_or(0, |x| x.as_ptr() as u64), + //src_ptr: if let Some(src) = src { src.as_ptr() } else { std::ptr::null() } as u64, dst_ptr: dst.as_ptr() as u64, ..Default::default() - })) + })); + + drop(src); + drop(dst); + res } } -- 2.39.5