Revert "kernel: expose umount list to ioctl interface #2950"

This reverts commit 029ae8d389.
This commit is contained in:
ShirkNeko
2025-11-20 18:48:59 +08:00
parent 52a3a04b11
commit 088996da9b
48 changed files with 271 additions and 257 deletions

View File

@@ -390,32 +390,6 @@ enum Kernel {
/// mount point
mnt: String,
},
/// Manage umount list
Umount {
#[command(subcommand)]
command: UmountOp,
},
/// Notify that module is mounted
NotifyModuleMounted,
}
#[derive(clap::Subcommand, Debug)]
enum UmountOp {
/// Add mount point to umount list
Add {
/// mount point path
mnt: String,
/// umount flags (default: 0, MNT_DETACH: 2)
#[arg(short, long, default_value = "0")]
flags: u32,
},
/// Delete mount point from umount list
Del {
/// mount point path
mnt: String,
},
/// Wipe all entries from umount list
Wipe,
}
#[cfg(target_arch = "aarch64")]
@@ -451,6 +425,7 @@ enum Umount {
/// Check mount type (overlay)
#[arg(long, default_value = "false")]
check_mnt: bool,
/// Umount flags (0 or 8 for MNT_DETACH)
#[arg(long, default_value = "-1")]
@@ -631,15 +606,6 @@ pub fn run() -> Result<()> {
} => crate::boot_patch::restore(boot, magiskboot, flash),
Commands::Kernel { command } => match command {
Kernel::NukeExt4Sysfs { mnt } => ksucalls::nuke_ext4_sysfs(&mnt),
Kernel::Umount { command } => match command {
UmountOp::Add { mnt, flags } => ksucalls::umount_list_add(&mnt, flags),
UmountOp::Del { mnt } => ksucalls::umount_list_del(&mnt),
UmountOp::Wipe => ksucalls::umount_list_wipe().map_err(Into::into),
},
Kernel::NotifyModuleMounted => {
ksucalls::report_module_mounted();
Ok(())
}
},
#[cfg(target_arch = "aarch64")]
Commands::Kpm { command } => {
@@ -661,7 +627,11 @@ pub fn run() -> Result<()> {
}
}
Commands::Umount { command } => match command {
Umount::Add { path, flags } => crate::umount_manager::add_umount_path(&path, flags),
Umount::Add {
path,
check_mnt,
flags,
} => crate::umount_manager::add_umount_path(&path, check_mnt, flags),
Umount::Remove { path } => crate::umount_manager::remove_umount_path(&path),
Umount::List => crate::umount_manager::list_umount_paths(),
Umount::ClearCustom => crate::umount_manager::clear_custom_paths(),

View File

@@ -18,7 +18,6 @@ const KSU_IOCTL_SET_FEATURE: u32 = 0x40004b0e; // _IOC(_IOC_WRITE, 'K', 14, 0)
const KSU_IOCTL_GET_WRAPPER_FD: u32 = 0x40004b0f; // _IOC(_IOC_WRITE, 'K', 15, 0)
const KSU_IOCTL_MANAGE_MARK: u32 = 0xc0004b10; // _IOC(_IOC_READ|_IOC_WRITE, 'K', 16, 0)
const KSU_IOCTL_NUKE_EXT4_SYSFS: u32 = 0x40004b11; // _IOC(_IOC_WRITE, 'K', 17, 0)
const KSU_IOCTL_ADD_TRY_UMOUNT: u32 = 0x40004b12; // _IOC(_IOC_WRITE, 'K', 18, 0)
#[repr(C)]
#[derive(Clone, Copy, Default)]
@@ -81,25 +80,12 @@ pub struct NukeExt4SysfsCmd {
pub arg: u64,
}
#[repr(C)]
#[derive(Clone, Copy, Default)]
struct AddTryUmountCmd {
arg: u64, // char ptr, this is the mountpoint
flags: u32, // this is the flag we use for it
mode: u8, // denotes what to do with it 0:wipe_list 1:add_to_list 2:delete_entry
}
// Mark operation constants
const KSU_MARK_GET: u32 = 1;
const KSU_MARK_MARK: u32 = 2;
const KSU_MARK_UNMARK: u32 = 3;
const KSU_MARK_REFRESH: u32 = 4;
// Umount operation constants
const KSU_UMOUNT_WIPE: u8 = 0;
const KSU_UMOUNT_ADD: u8 = 1;
const KSU_UMOUNT_DEL: u8 = 2;
// Global driver fd cache
#[cfg(any(target_os = "linux", target_os = "android"))]
static DRIVER_FD: OnceLock<RawFd> = OnceLock::new();
@@ -324,38 +310,3 @@ pub fn nuke_ext4_sysfs(mnt: &str) -> anyhow::Result<()> {
ksuctl(KSU_IOCTL_NUKE_EXT4_SYSFS, &mut ioctl_cmd as *mut _)?;
Ok(())
}
/// Wipe all entries from umount list
pub fn umount_list_wipe() -> std::io::Result<()> {
let mut cmd = AddTryUmountCmd {
arg: 0,
flags: 0,
mode: KSU_UMOUNT_WIPE,
};
ksuctl(KSU_IOCTL_ADD_TRY_UMOUNT, &mut cmd as *mut _)?;
Ok(())
}
/// Add mount point to umount list
pub fn umount_list_add(path: &str, flags: u32) -> anyhow::Result<()> {
let c_path = std::ffi::CString::new(path)?;
let mut cmd = AddTryUmountCmd {
arg: c_path.as_ptr() as u64,
flags,
mode: KSU_UMOUNT_ADD,
};
ksuctl(KSU_IOCTL_ADD_TRY_UMOUNT, &mut cmd as *mut _)?;
Ok(())
}
/// Delete mount point from umount list
pub fn umount_list_del(path: &str) -> anyhow::Result<()> {
let c_path = std::ffi::CString::new(path)?;
let mut cmd = AddTryUmountCmd {
arg: c_path.as_ptr() as u64,
flags: 0,
mode: KSU_UMOUNT_DEL,
};
ksuctl(KSU_IOCTL_ADD_TRY_UMOUNT, &mut cmd as *mut _)?;
Ok(())
}

View File

@@ -13,6 +13,7 @@ const KSU_IOCTL_UMOUNT_MANAGER: u32 = 0xc0004b6b; // _IOC(_IOC_READ|_IOC_WRITE,
#[derive(Clone, Serialize, Deserialize, Debug)]
pub struct UmountEntry {
pub path: String,
pub check_mnt: bool,
pub flags: i32,
pub is_default: bool,
}
@@ -33,6 +34,7 @@ pub struct UmountManager {
struct UmountManagerCmd {
pub operation: u32,
pub path: [u8; 256],
pub check_mnt: u8,
pub flags: i32,
pub count: u32,
pub entries_ptr: u64,
@@ -43,6 +45,7 @@ impl Default for UmountManagerCmd {
UmountManagerCmd {
operation: 0,
path: [0; 256],
check_mnt: 0,
flags: 0,
count: 0,
entries_ptr: 0,
@@ -109,7 +112,7 @@ impl UmountManager {
Ok(())
}
pub fn add_entry(&mut self, path: &str, flags: i32) -> Result<()> {
pub fn add_entry(&mut self, path: &str, check_mnt: bool, flags: i32) -> Result<()> {
let exists = self
.defaults
.iter()
@@ -123,6 +126,7 @@ impl UmountManager {
let entry = UmountEntry {
path: path.to_string(),
check_mnt,
flags,
is_default,
};
@@ -161,36 +165,43 @@ impl UmountManager {
vec![
UmountEntry {
path: "/odm".to_string(),
check_mnt: true,
flags: 0,
is_default: true,
},
UmountEntry {
path: "/system".to_string(),
check_mnt: true,
flags: 0,
is_default: true,
},
UmountEntry {
path: "/vendor".to_string(),
check_mnt: true,
flags: 0,
is_default: true,
},
UmountEntry {
path: "/product".to_string(),
check_mnt: true,
flags: 0,
is_default: true,
},
UmountEntry {
path: "/system_ext".to_string(),
check_mnt: true,
flags: 0,
is_default: true,
},
UmountEntry {
path: "/data/adb/modules".to_string(),
check_mnt: false,
flags: -1, // MNT_DETACH
is_default: true,
},
UmountEntry {
path: "/debug_ramdisk".to_string(),
check_mnt: false,
flags: -1, // MNT_DETACH
is_default: true,
},
@@ -215,6 +226,7 @@ impl UmountManager {
fn kernel_add_entry(entry: &UmountEntry) -> Result<()> {
let mut cmd = UmountManagerCmd {
operation: 0,
check_mnt: entry.check_mnt as u8,
flags: entry.flags,
..Default::default()
};
@@ -243,9 +255,9 @@ pub fn init_umount_manager() -> Result<UmountManager> {
Ok(manager)
}
pub fn add_umount_path(path: &str, flags: i32) -> Result<()> {
pub fn add_umount_path(path: &str, check_mnt: bool, flags: i32) -> Result<()> {
let mut manager = init_umount_manager()?;
manager.add_entry(path, flags)?;
manager.add_entry(path, check_mnt, flags)?;
manager.save_config()?;
println!("✓ Added umount path: {}", path);
Ok(())
@@ -268,13 +280,17 @@ pub fn list_umount_paths() -> Result<()> {
return Ok(());
}
println!("{:<30} {:<8} {:<10}", "Path", "Flags", "Default");
println!(
"{:<30} {:<12} {:<8} {:<10}",
"Path", "CheckMnt", "Flags", "Default"
);
println!("{}", "=".repeat(60));
for entry in entries {
println!(
"{:<30} {:<8} {:<10}",
"{:<30} {:<12} {:<8} {:<10}",
entry.path,
entry.check_mnt,
entry.flags,
if entry.is_default { "Yes" } else { "No" }
);