Use fallback method to mount overlayfs when fsopen one failed
Co-authored-by: natsumerinchan
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user