Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ec07ce68 authored by chenyc5's avatar chenyc5 Committed by Yinchu Chen
Browse files

fs_mgr: Copy the blk_device from start_idx to current index

If next same mount point also is logical partition, but its blk_device
is not updated yet and still is logical partition name not a mapper
device (/dev/block/dm-X) to cause mount failed.

To support the below fstab configs in fstab.postinstall.
system /postinstall ext4  ro,nosuid,nodev,noexec slotselect_other,logical
system /postinstall erofs ro,nosuid,nodev,noexec slotselect_other,logical

Error logs:
system_b: Can't open blockdev
init: [libfs_mgr]__mount(source=system_b(missing),target=/postinstall,type=erofs)=-1: No such file or directory

Bug: b/241716684
Test: After factory device reset, ensure system_b is mounted as EROFS
Change-Id: I02f20f3dfd8c42be9981915eaff88a5948482724
parent cc00a09d
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -889,7 +889,7 @@ static bool fs_match(const std::string& in1, const std::string& in2) {
// attempted_idx: On return, will indicate which fstab entry
//     succeeded. In case of failure, it will be the start_idx.
// Sets errno to match the 1st mount failure on failure.
static bool mount_with_alternatives(const Fstab& fstab, int start_idx, int* end_idx,
static bool mount_with_alternatives(Fstab& fstab, int start_idx, int* end_idx,
                                    int* attempted_idx) {
    unsigned long i;
    int mount_errno = 0;
@@ -909,6 +909,14 @@ static bool mount_with_alternatives(const Fstab& fstab, int start_idx, int* end_
            continue;
        }

        // fstab[start_idx].blk_device is already updated to /dev/dm-<N> by
        // AVB related functions. Copy it from start_idx to the current index i.
        if ((i != start_idx) && fstab[i].fs_mgr_flags.logical &&
            fstab[start_idx].fs_mgr_flags.logical &&
            (fstab[i].logical_partition_name == fstab[start_idx].logical_partition_name)) {
            fstab[i].blk_device = fstab[start_idx].blk_device;
        }

        int fs_stat = prepare_fs_for_mount(fstab[i].blk_device, fstab[i]);
        if (fs_stat & FS_STAT_INVALID_MAGIC) {
            LERROR << __FUNCTION__