diff --git a/Android.mk b/Android.mk index 46deaaf2..870ffe43 100644 --- a/Android.mk +++ b/Android.mk @@ -55,6 +55,10 @@ ifneq ($(BOARD_VOLD_MAX_PARTITIONS),) LOCAL_CFLAGS += -DVOLD_MAX_PARTITIONS=$(BOARD_VOLD_MAX_PARTITIONS) endif +ifeq ($(BOARD_VOLD_EMMC_SHARES_DEV_MAJOR), true) +LOCAL_CFLAGS += -DVOLD_EMMC_SHARES_DEV_MAJOR +endif + ifneq ($(TARGET_USE_CUSTOM_LUN_FILE_PATH),) LOCAL_CFLAGS += -DCUSTOM_LUN_FILE=\"$(TARGET_USE_CUSTOM_LUN_FILE_PATH)\" endif diff --git a/Volume.cpp b/Volume.cpp index c4d26494..a42c1990 100644 --- a/Volume.cpp +++ b/Volume.cpp @@ -233,6 +233,15 @@ int Volume::formatVol() { sprintf(devicePath, "/dev/block/vold/%d:%d", MAJOR(partNode), MINOR(partNode)); +#ifdef VOLD_EMMC_SHARES_DEV_MAJOR + // If emmc and sdcard share dev major number, vold may pick + // incorrectly based on partition nodes alone, formatting + // the wrong device. Use device nodes instead. + dev_t deviceNodes; + getDeviceNodes((dev_t *) &deviceNodes, 1); + sprintf(devicePath, "/dev/block/vold/%d:%d", MAJOR(deviceNodes), MINOR(deviceNodes)); +#endif + if (mDebug) { SLOGI("Formatting volume %s (%s)", getLabel(), devicePath); }