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