diff --git a/native/jni/core/init.cpp b/native/jni/core/init.cpp index 1c4b52bf1..5004b219f 100644 --- a/native/jni/core/init.cpp +++ b/native/jni/core/init.cpp @@ -160,7 +160,7 @@ static bool setup_block(struct device *dev, const char *partname) { return true; } -static bool read_fstab_dt(const struct cmdline *cmd, const char *mnt_point, char *partname) { +static bool read_fstab_dt(const struct cmdline *cmd, const char *mnt_point, char *partname, char *partfs) { char buf[128]; struct stat st; sprintf(buf, "/%s", mnt_point); @@ -175,7 +175,14 @@ static bool read_fstab_dt(const struct cmdline *cmd, const char *mnt_point, char close(fd); char *name = strrchr(buf, '/') + 1; sprintf(partname, "%s%s", name, strend(name, cmd->slot) ? cmd->slot : ""); - return true; + sprintf(buf, "%s/fstab/%s/type", cmd->dt_dir, mnt_point); + if (access(buf, F_OK) == 0) { + int fd = open(buf, O_RDONLY | O_CLOEXEC); + lstat(buf, &st); + read(fd, partfs, st.st_size); + close(fd); + return true; + } } return false; } @@ -419,6 +426,7 @@ int main(int argc, char *argv[]) { struct device dev; char partname[32]; + char partfs[32]; if (cmd.early_boot) { sprintf(partname, "system%s", cmd.slot); @@ -436,15 +444,15 @@ int main(int argc, char *argv[]) { xmkdir("/system", 0755); xmount("/system_root/system", "/system", nullptr, MS_BIND, nullptr); - } else if (read_fstab_dt(&cmd, "system", partname)) { + } else if (read_fstab_dt(&cmd, "system", partname, partfs)) { setup_block(&dev, partname); - xmount(dev.path, "/system", "ext4", MS_RDONLY, nullptr); + xmount(dev.path, "/system", partfs, MS_RDONLY, nullptr); mnt_system = true; } - if (read_fstab_dt(&cmd, "vendor", partname)) { + if (read_fstab_dt(&cmd, "vendor", partname, partfs)) { setup_block(&dev, partname); - xmount(dev.path, "/vendor", "ext4", MS_RDONLY, nullptr); + xmount(dev.path, "/vendor", partfs, MS_RDONLY, nullptr); mnt_vendor = true; } diff --git a/scripts/util_functions.sh b/scripts/util_functions.sh index e69fc5818..05af12367 100644 --- a/scripts/util_functions.sh +++ b/scripts/util_functions.sh @@ -91,7 +91,7 @@ mount_partitions() { [ -f /system/build.prop ] || is_mounted /system || mount -o ro /system 2>/dev/null if ! is_mounted /system && ! [ -f /system/build.prop ]; then SYSTEMBLOCK=`find_block system$SLOT` - mount -t ext4 -o ro $SYSTEMBLOCK /system + mount -o ro $SYSTEMBLOCK /system fi [ -f /system/build.prop ] || is_mounted /system || abort "! Cannot mount /system" grep -qE '/dev/root|/system_root' /proc/mounts && SYSTEM_ROOT=true || SYSTEM_ROOT=false @@ -106,7 +106,7 @@ mount_partitions() { is_mounted /vendor || mount -o ro /vendor 2>/dev/null if ! is_mounted /vendor; then VENDORBLOCK=`find_block vendor$SLOT` - mount -t ext4 -o ro $VENDORBLOCK /vendor + mount -o ro $VENDORBLOCK /vendor fi is_mounted /vendor || abort "! Cannot mount /vendor" fi