Merge "fs_mgr: Add support for A/B partitions"
diff --git a/fs_mgr/fs_mgr_fstab.c b/fs_mgr/fs_mgr_fstab.c
index 8b0f714..d77d41f 100644
--- a/fs_mgr/fs_mgr_fstab.c
+++ b/fs_mgr/fs_mgr_fstab.c
@@ -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 @@
{ "zramsize=", MF_ZRAMSIZE },
{ "verify", MF_VERIFY },
{ "noemulatedsd", MF_NOEMULATEDSD },
+ { "slotselect", MF_SLOTSELECT },
{ "defaults", 0 },
{ 0, 0 },
};
@@ -307,6 +310,23 @@
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 @@
{
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 d56111a..cc02bac 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