From 8bb2f36abd298522941b7ee807c80c5bd3156edb Mon Sep 17 00:00:00 2001 From: Daniel Rosenberg Date: Thu, 27 Aug 2015 13:42:20 -0700 Subject: [PATCH] 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: Daniel Rosenberg --- fs_mgr/fs_mgr_fstab.c | 25 +++++++++++++++++++++++++ fs_mgr/fs_mgr_priv.h | 1 + 2 files changed, 26 insertions(+) diff --git a/fs_mgr/fs_mgr_fstab.c b/fs_mgr/fs_mgr_fstab.c index 8b0f7142a..d77d41f27 100644 --- a/fs_mgr/fs_mgr_fstab.c +++ b/fs_mgr/fs_mgr_fstab.c @@ -20,6 +20,8 @@ #include #include +#include + #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; +} diff --git a/fs_mgr/fs_mgr_priv.h b/fs_mgr/fs_mgr_priv.h index d56111ae6..cc02bac66 100644 --- a/fs_mgr/fs_mgr_priv.h +++ b/fs_mgr/fs_mgr_priv.h @@ -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