From 14239d291ac21857c7c099a84bd9bba079137cef Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Mon, 14 Jun 2010 15:02:48 -0700 Subject: [PATCH] begin to abstract out the file system and mount information. known issue: create_fstab causes segfault on incredible. and thus subsequent crash loop of recovery. --- Android.mk | 44 +++++++++++++++++-------------- extendedcommands.c | 29 +++++++++++++++++++++ extendedcommands.h | 1 + mkfstab.sh | 41 ----------------------------- mtdutils/mtdutils.c | 7 ----- mtdutils/mtdutils.h | 7 +++++ recovery.c | 6 +---- roots.c | 63 +++++++++++++++++++++------------------------ roots.h | 9 +++++++ 9 files changed, 101 insertions(+), 106 deletions(-) delete mode 100755 mkfstab.sh diff --git a/Android.mk b/Android.mk index cab7032..2c5da9c 100644 --- a/Android.mk +++ b/Android.mk @@ -26,7 +26,7 @@ LOCAL_MODULE := recovery LOCAL_FORCE_STATIC_EXECUTABLE := true -RECOVERY_VERSION := ClockworkMod Recovery v1.8.2.5 +RECOVERY_VERSION := ClockworkMod Recovery v1.8.2.8 LOCAL_CFLAGS := -DRECOVERY_VERSION="$(RECOVERY_VERSION)" RECOVERY_API_VERSION := 2 LOCAL_CFLAGS += -DRECOVERY_API_VERSION=$(RECOVERY_API_VERSION) @@ -35,22 +35,36 @@ ifeq ($(BOARD_HAS_NO_SELECT_BUTTON),true) LOCAL_CFLAGS += -DKEY_POWER_IS_SELECT_ITEM endif -# This file system specific stuff is in need of some serious cleaning up... - -ifeq ($BOARD_SDCARD_MMCBLK1,true) - LOCAL_CFLAGS += -DSDCARD_MMCBLK1 +ifdef BOARD_SDCARD_DEVICE_PRIMARY + LOCAL_CFLAGS += -DSDCARD_DEVICE_PRIMARY=\"$(BOARD_SDCARD_DEVICE_PRIMARY)\" endif -ifeq ($(BOARD_SD_EXT3),true) - LOCAL_CFLAGS += -DSD_EXT3 +ifdef BOARD_SDCARD_DEVICE_SECONDARY + LOCAL_CFLAGS += -DSDCARD_DEVICE_SECONDARY=\"$(BOARD_SDCARD_DEVICE_SECONDARY)\" endif -ifeq ($(BOARD_USERDATA_EXT3),true) - LOCAL_CFLAGS += -DUSERDATA_EXT3 +ifdef BOARD_SDEXT_DEVICE + LOCAL_CFLAGS += -DSDEXT_DEVICE=\"$(BOARD_SDEXT_DEVICE)\" endif -ifeq ($(BOARD_CACHE_EXT3),true) - LOCAL_CFLAGS += -DCACHE_EXT3 +ifdef BOARD_SDEXT_FILESYSTEM + LOCAL_CFLAGS += -DSDCARD_DEVICE_PRIMARY=\"$(BOARD_SDEXT_FILESYSTEM)\" +endif + +ifdef BOARD_DATA_DEVICE + LOCAL_CFLAGS += -DDATA_DEVICE=\"$(BOARD_DATA_DEVICE)\" +endif + +ifdef BOARD_DATA_FILESYSTEM + LOCAL_CFLAGS += -DDATA_FILESYSTEM=\"$(BOARD_DATA_FILESYSTEM)\" +endif + +ifdef BOARD_CACHE_DEVICE + LOCAL_CFLAGS += -DCACHE_DEVICE=\"$(BOARD_CACHE_DEVICE)\" +endif + +ifdef BOARD_CACHE_FILESYSTEM + LOCAL_CFLAGS += -DCACHE_FILESYSTEM=\"$(BOARD_CACHE_FILESYSTEM)\" endif # This binary is in the recovery ramdisk, which is otherwise a copy of root. @@ -106,14 +120,6 @@ LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin LOCAL_SRC_FILES := nandroid-md5.sh include $(BUILD_PREBUILT) -include $(CLEAR_VARS) -LOCAL_MODULE := mkfstab.sh -LOCAL_MODULE_TAGS := eng -LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES -LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin -LOCAL_SRC_FILES := mkfstab.sh -include $(BUILD_PREBUILT) - include $(CLEAR_VARS) LOCAL_MODULE := killrecovery.sh LOCAL_MODULE_TAGS := eng diff --git a/extendedcommands.c b/extendedcommands.c index 3b32c12..d4e20fd 100644 --- a/extendedcommands.c +++ b/extendedcommands.c @@ -33,6 +33,7 @@ #include "commands.h" #include "amend/amend.h" +#include "mtdutils/mtdutils.h" #include "mtdutils/dump_image.h" #include "../../external/yaffs2/yaffs2/utils/mkyaffs2image.h" #include "../../external/yaffs2/yaffs2/utils/unyaffs.h" @@ -785,4 +786,32 @@ void show_advanced_menu() } } } +} + +void write_fstab_root(char *root_path, FILE *file) +{ + RootInfo *info = get_root_info_for_path(root_path); + MtdPartition *mtd = get_root_mtd_partition(root_path); + if (mtd != NULL) + { + fprintf(file, "/dev/block/mtdblock%d ", mtd->device_index); + } + else + { + fprintf(file, "%s ", info->device); + } + + fprintf(file, "%s ", info->mount_point); + fprintf(file, "%s rw\n", info->filesystem); +} + +void create_fstab() +{ + FILE *file = fopen("/etc/fstab", "w"); + write_fstab_root("CACHE:", file); + write_fstab_root("DATA:", file); + write_fstab_root("SYSTEM:", file); + write_fstab_root("SDCARD:", file); + write_fstab_root("SDEXT:", file); + fclose(file); } \ No newline at end of file diff --git a/extendedcommands.h b/extendedcommands.h index 83e5213..9d38116 100644 --- a/extendedcommands.h +++ b/extendedcommands.h @@ -43,3 +43,4 @@ format_non_mtd_device(const char* root); void wipe_battery_stats(); +void create_fstab(); diff --git a/mkfstab.sh b/mkfstab.sh deleted file mode 100755 index 80505dc..0000000 --- a/mkfstab.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/sbin/sh - -rm -f /etc/fstab -cat /proc/mtd | while read mtdentry -do - mtd=$(echo $mtdentry | awk '{print $1}') - mtd=$(echo $mtd | sed s/mtd//) - mtd=$(echo $mtd | sed s/://) - exist=$(ls -l /dev/block/mtdblock$mtd) 2> /dev/null - if [ -z "$exist" ] - then - continue - fi - partition=$(echo $mtdentry | awk '{print $4}') - partition=$(echo $partition | sed s/\"//g) - mount=$partition - type= - if [ "$partition" = "system" ] - then - type=yaffs2 - elif [ "$partition" = "userdata" ] - then - type=yaffs2 - mount=data - elif [ "$partition" == "cache" ] - then - type=yaffs2 - else - continue - fi - - echo "/dev/block/mtdblock$mtd /$mount $type rw" >> /etc/fstab -done -if [ ! -z $SDCARD_MMCBLK1 ] -then - echo "/dev/block/mmcblk1p1" /sdcard vfat rw >> /etc/fstab - echo "/dev/block/mmcblk1p2" /sd-ext auto rw >> /etc/fstab -else - echo "/dev/block/mmcblk0p1" /sdcard vfat rw >> /etc/fstab - echo "/dev/block/mmcblk0p2" /sd-ext auto rw >> /etc/fstab -fi \ No newline at end of file diff --git a/mtdutils/mtdutils.c b/mtdutils/mtdutils.c index 18e6a5d..8069c3f 100644 --- a/mtdutils/mtdutils.c +++ b/mtdutils/mtdutils.c @@ -28,13 +28,6 @@ #include "mtdutils.h" -struct MtdPartition { - int device_index; - unsigned int size; - unsigned int erase_size; - char *name; -}; - struct MtdReadContext { const MtdPartition *partition; char *buffer; diff --git a/mtdutils/mtdutils.h b/mtdutils/mtdutils.h index 528a5bb..b3bad68 100644 --- a/mtdutils/mtdutils.h +++ b/mtdutils/mtdutils.h @@ -52,4 +52,11 @@ off_t mtd_erase_blocks(MtdWriteContext *, int blocks); /* 0 ok, -1 for all */ off_t mtd_find_write_start(MtdWriteContext *ctx, off_t pos); int mtd_write_close(MtdWriteContext *); +struct MtdPartition { + int device_index; + unsigned int size; + unsigned int erase_size; + char *name; +}; + #endif // MTDUTILS_H_ diff --git a/recovery.c b/recovery.c index 4195726..442d2b6 100644 --- a/recovery.c +++ b/recovery.c @@ -491,11 +491,7 @@ main(int argc, char **argv) return amend_main(argc, argv); return busybox_driver(argc, argv); } -#ifdef SDCARD_MMCBLK1 - __system("SDCARD_MMCBLK1=true /sbin/mkfstab.sh"); -#else - __system("/sbin/mkfstab.sh"); -#endif + //create_fstab(); __system("/sbin/postrecoveryboot.sh"); int is_user_initiated_recovery = 0; diff --git a/roots.c b/roots.c index 32ecc5c..22988eb 100644 --- a/roots.c +++ b/roots.c @@ -29,15 +29,6 @@ #include "extendedcommands.h" -typedef struct { - const char *name; - const char *device; - const char *device2; // If the first one doesn't work (may be NULL) - const char *partition_name; - const char *mount_point; - const char *filesystem; -} RootInfo; - /* Canonical pointers. xxx may just want to use enums */ @@ -45,43 +36,47 @@ static const char g_mtd_device[] = "@\0g_mtd_device"; static const char g_raw[] = "@\0g_raw"; static const char g_package_file[] = "@\0g_package_file"; -#ifdef SDCARD_MMCBLK1 -#define SDCARD_MMCBLK_SECONDARY "/dev/block/mmcblk1" -#define SDCARD_MMCBLK_PRIMARY "/dev/block/mmcblk1p1" -#define SDEXT "/dev/block/mmcblk1p2" -#else -#define SDCARD_MMCBLK_SECONDARY "/dev/block/mmcblk0" -#define SDCARD_MMCBLK_PRIMARY "/dev/block/mmcblk0p1" -#define SDEXT "/dev/block/mmcblk0p2" +#ifndef SDCARD_DEVICE_PRIMARY +#define SDCARD_DEVICE_PRIMARY "/dev/block/mmcblk0p1" #endif -#ifdef SD_EXT3 -#define SD_EXT_FILE_SYSTEM "ext3" -#else -#define SD_EXT_FILE_SYSTEM "ext4" +#ifndef SDCARD_DEVICE_SECONDARY +#define SDCARD_DEVICE_SECONDARY "/dev/block/mmcblk0p2" #endif -#ifdef USERDATA_EXT3 -#define SD_EXT_FILE_SYSTEM "ext3" -#else -#define SD_EXT_FILE_SYSTEM "ext4" +#ifndef SDEXT_DEVICE +#define SDEXT_DEVICE "/dev/block/mmcblk0p2" #endif -#ifdef CACHE_EXT3 -#define SD_EXT_FILE_SYSTEM "ext3" -#else -#define SD_EXT_FILE_SYSTEM "ext4" +#ifndef SDEXT_FILESYSTEM +#define SDEXT_FILESYSTEM "ext4" +#endif + +#ifndef DATA_DEVICE +#define DATA_DEVICE g_mtd_device +#endif + +#ifndef DATA_FILESYSTEM +#define DATA_FILESYSTEM "yaffs2" +#endif + +#ifndef CACHE_DEVICE +#define CACHE_DEVICE g_mtd_device +#endif + +#ifndef CACHE_FILESYSTEM +#define CACHE_FILESYSTEM "yaffs2" #endif static RootInfo g_roots[] = { { "BOOT:", g_mtd_device, NULL, "boot", NULL, g_raw }, - { "CACHE:", g_mtd_device, NULL, "cache", "/cache", "yaffs2" }, - { "DATA:", g_mtd_device, NULL, "userdata", "/data", "yaffs2" }, + { "CACHE:", CACHE_DEVICE, NULL, "cache", "/cache", CACHE_FILESYSTEM }, + { "DATA:", DATA_DEVICE, NULL, "userdata", "/data", DATA_FILESYSTEM }, { "MISC:", g_mtd_device, NULL, "misc", NULL, g_raw }, { "PACKAGE:", NULL, NULL, NULL, NULL, g_package_file }, { "RECOVERY:", g_mtd_device, NULL, "recovery", "/", g_raw }, - { "SDCARD:", SDCARD_MMCBLK_PRIMARY, SDCARD_MMCBLK_SECONDARY, NULL, "/sdcard", "vfat" }, - { "SDEXT:", SDEXT, NULL, NULL, "/sd-ext", SD_EXT_FILE_SYSTEM }, + { "SDCARD:", SDCARD_DEVICE_PRIMARY, SDCARD_DEVICE_SECONDARY, NULL, "/sdcard", "vfat" }, + { "SDEXT:", SDEXT_DEVICE, NULL, NULL, "/sd-ext", SDEXT_FILESYSTEM }, { "SYSTEM:", g_mtd_device, NULL, "system", "/system", "yaffs2" }, { "MBM:", g_mtd_device, NULL, "mbm", NULL, g_raw }, { "TMP:", NULL, NULL, NULL, "/tmp", NULL }, @@ -90,7 +85,7 @@ static RootInfo g_roots[] = { // TODO: for SDCARD:, try /dev/block/mmcblk0 if mmcblk0p1 fails -static const RootInfo * +const RootInfo * get_root_info_for_path(const char *root_path) { const char *c; diff --git a/roots.h b/roots.h index bc847ea..7b15ed1 100644 --- a/roots.h +++ b/roots.h @@ -60,4 +60,13 @@ const MtdPartition *get_root_mtd_partition(const char *root_path); */ int format_root_device(const char *root); +typedef struct { + const char *name; + const char *device; + const char *device2; // If the first one doesn't work (may be NULL) + const char *partition_name; + const char *mount_point; + const char *filesystem; +} RootInfo; + #endif // RECOVERY_ROOTS_H_