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.
diff --git a/Android.mk b/Android.mk
index cab7032..2c5da9c 100644
--- a/Android.mk
+++ b/Android.mk
@@ -26,7 +26,7 @@
 
 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 @@
   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.
@@ -107,14 +121,6 @@
 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
 LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
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 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 @@
 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_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 @@
             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_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 @@
 
 // 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 @@
  */
 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_