Use fallback method to mount overlayfs when fsopen one failed

Co-authored-by: natsumerinchan
This commit is contained in:
weishu
2024-03-04 12:05:05 +08:00
parent cd772fa250
commit 3829894d4d

View File

@@ -109,14 +109,21 @@ pub fn mount_overlayfs(
upperdir, upperdir,
workdir 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(); let fs = fs.as_fd();
fsconfig_set_string(fs, "lowerdir", lowerdir_config)?; fsconfig_set_string(fs, "lowerdir", &lowerdir_config)?;
if let (Some(upperdir), Some(workdir)) = (upperdir, workdir) { if let (Some(upperdir), Some(workdir)) = (&upperdir, &workdir) {
if upperdir.exists() && workdir.exists() { fsconfig_set_string(fs, "upperdir", upperdir)?;
fsconfig_set_string(fs, "upperdir", upperdir.display().to_string())?; fsconfig_set_string(fs, "workdir", workdir)?;
fsconfig_set_string(fs, "workdir", workdir.display().to_string())?;
}
} }
fsconfig_set_string(fs, "source", KSU_OVERLAY_SOURCE)?; fsconfig_set_string(fs, "source", KSU_OVERLAY_SOURCE)?;
fsconfig_create(fs)?; fsconfig_create(fs)?;
@@ -127,17 +134,14 @@ pub fn mount_overlayfs(
CWD, CWD,
dest.as_ref(), dest.as_ref(),
MoveMountFlags::MOVE_MOUNT_F_EMPTY_PATH, 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}"); let mut data = format!("lowerdir={lowerdir_config}");
if let (Some(upperdir), Some(workdir)) = (upperdir, workdir) { if let (Some(upperdir), Some(workdir)) = (upperdir, workdir) {
if upperdir.exists() && workdir.exists() { data = format!("{data},upperdir={upperdir},workdir={workdir}");
data = format!(
"{data},upperdir={},workdir={}",
upperdir.display(),
workdir.display()
);
}
} }
mount( mount(
KSU_OVERLAY_SOURCE, KSU_OVERLAY_SOURCE,