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

Commit 8bb2f36a authored by Daniel Rosenberg's avatar Daniel Rosenberg
Browse files

fs_mgr: Add support for A/B partitions



Allow partitions to be marked as A/B partitions
using the slotselect flag in fstab. The partitions
can be identified by appending the correct suffix
to the block device listed in the fstab. The suffix
is provided by the bootloader through a command line
parameter or the device tree, and can be found in
ro.boot.slot_suffix or read from the boot_control HAL.

Change-Id: I6846d80e857f95bfb8f282f4ab81167394613bbe
Signed-off-by: default avatarDaniel Rosenberg <drosen@google.com>
parent 3cf2a8e0
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@
#include <string.h>
#include <sys/mount.h>

#include <cutils/properties.h>

#include "fs_mgr_priv.h"

struct fs_mgr_flag_values {
@@ -70,6 +72,7 @@ static struct flag_list fs_mgr_flags[] = {
    { "zramsize=",   MF_ZRAMSIZE },
    { "verify",      MF_VERIFY },
    { "noemulatedsd", MF_NOEMULATEDSD },
    { "slotselect",  MF_SLOTSELECT },
    { "defaults",    0 },
    { 0,             0 },
};
@@ -307,6 +310,23 @@ struct fstab *fs_mgr_read_fstab(const char *fstab_path)
        fstab->recs[cnt].partnum = flag_vals.partnum;
        fstab->recs[cnt].swap_prio = flag_vals.swap_prio;
        fstab->recs[cnt].zram_size = flag_vals.zram_size;

        /* If an A/B partition, modify block device to be the real block device */
        if (fstab->recs[cnt].fs_mgr_flags & MF_SLOTSELECT) {
            char propbuf[PROPERTY_VALUE_MAX];
            char *tmp;

            /* use the kernel parameter if set */
            property_get("ro.boot.slot_suffix", propbuf, "");

            if (asprintf(&tmp, "%s%s", fstab->recs[cnt].blk_device, propbuf) > 0) {
                free(fstab->recs[cnt].blk_device);
                fstab->recs[cnt].blk_device = tmp;
            } else {
                ERROR("Error updating block device name\n");
                goto err;
            }
        }
        cnt++;
    }
    fclose(fstab_file);
@@ -448,3 +468,8 @@ int fs_mgr_is_noemulatedsd(const struct fstab_rec *fstab)
{
    return fstab->fs_mgr_flags & MF_NOEMULATEDSD;
}

int fs_mgr_is_slotselect(struct fstab_rec *fstab)
{
    return fstab->fs_mgr_flags & MF_SLOTSELECT;
}
+1 −0
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@
#define MF_NOEMULATEDSD 0x800 /* no emulated sdcard daemon, sd card is the only
                                 external storage */
#define MF_FILEENCRYPTION 0x2000
#define MF_SLOTSELECT   0x8000

#define DM_BUF_SIZE 4096