From 3829894d4d205642bb241fc5846463729e4d3eba Mon Sep 17 00:00:00 2001 From: weishu Date: Mon, 4 Mar 2024 12:05:05 +0800 Subject: [PATCH] Use fallback method to mount overlayfs when fsopen one failed Co-authored-by: natsumerinchan --- userspace/ksud/src/mount.rs | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/userspace/ksud/src/mount.rs b/userspace/ksud/src/mount.rs index a7f34837f446..11be898bbeb7 100644 --- a/userspace/ksud/src/mount.rs +++ b/userspace/ksud/src/mount.rs @@ -109,14 +109,21 @@ pub fn mount_overlayfs( upperdir, workdir ); - if let Result::Ok(fs) = fsopen("overlay", FsOpenFlags::FSOPEN_CLOEXEC) { + + let upperdir = upperdir + .filter(|up| up.exists()) + .map(|e| e.display().to_string()); + let workdir = workdir + .filter(|wd| wd.exists()) + .map(|e| e.display().to_string()); + + let result = (|| { + let fs = fsopen("overlay", FsOpenFlags::FSOPEN_CLOEXEC)?; let fs = fs.as_fd(); - fsconfig_set_string(fs, "lowerdir", lowerdir_config)?; - if let (Some(upperdir), Some(workdir)) = (upperdir, workdir) { - if upperdir.exists() && workdir.exists() { - fsconfig_set_string(fs, "upperdir", upperdir.display().to_string())?; - fsconfig_set_string(fs, "workdir", workdir.display().to_string())?; - } + fsconfig_set_string(fs, "lowerdir", &lowerdir_config)?; + if let (Some(upperdir), Some(workdir)) = (&upperdir, &workdir) { + fsconfig_set_string(fs, "upperdir", upperdir)?; + fsconfig_set_string(fs, "workdir", workdir)?; } fsconfig_set_string(fs, "source", KSU_OVERLAY_SOURCE)?; fsconfig_create(fs)?; @@ -127,17 +134,14 @@ pub fn mount_overlayfs( CWD, dest.as_ref(), MoveMountFlags::MOVE_MOUNT_F_EMPTY_PATH, - )?; - } else { + ) + })(); + + if let Err(e) = result { + warn!("fsopen mount failed: {:#}, fallback to mount", e); let mut data = format!("lowerdir={lowerdir_config}"); if let (Some(upperdir), Some(workdir)) = (upperdir, workdir) { - if upperdir.exists() && workdir.exists() { - data = format!( - "{data},upperdir={},workdir={}", - upperdir.display(), - workdir.display() - ); - } + data = format!("{data},upperdir={upperdir},workdir={workdir}"); } mount( KSU_OVERLAY_SOURCE,