Galaxy S initial support. Fix firmware flash on inc. May need to fix other phones.
diff --git a/Android.mk b/Android.mk
index 1de07d6..ddb2012 100644
--- a/Android.mk
+++ b/Android.mk
@@ -26,12 +26,8 @@
     LOCAL_CFLAGS += -DBOARD_HAS_NO_MISC_PARTITION
 endif
 
-ifdef BOARD_USES_FFORMAT
-    LOCAL_CFLAGS += -DBOARD_USES_FFORMAT
-endif
-
 ifdef BOARD_RECOVERY_IGNORE_BOOTABLES
-    LOCAL_CLFAGS += -DBOARD_RECOVERY_IGNORE_BOOTABLES
+    LOCAL_CFLAGS += -DBOARD_RECOVERY_IGNORE_BOOTABLES
 endif
 
 LOCAL_SRC_FILES += test_roots.c
@@ -101,6 +97,26 @@
   LOCAL_CFLAGS += -DHAS_DATADATA
 endif
 
+ifdef BOARD_DATA_FILESYSTEM_OPTIONS
+  LOCAL_CFLAGS += -DDATA_FILESYSTEM_OPTIONS=\"$(BOARD_DATA_FILESYSTEM_OPTIONS)\"
+endif
+
+ifdef BOARD_DATADATA_FILESYSTEM_OPTIONS
+  LOCAL_CFLAGS += -DDATADATA_FILESYSTEM_OPTIONS=\"$(BOARD_DATADATA_FILESYSTEM_OPTIONS)\"
+endif
+
+ifdef BOARD_CACHE_FILESYSTEM_OPTIONS
+  LOCAL_CFLAGS += -DCACHE_FILESYSTEM_OPTIONS=\"$(BOARD_CACHE_FILESYSTEM_OPTIONS)\"
+endif
+
+ifdef BOARD_SYSTEM_FILESYSTEM_OPTIONS
+  LOCAL_CFLAGS += -DSYSTEM_FILESYSTEM_OPTIONS=\"$(BOARD_SYSTEM_FILESYSTEM_OPTIONS)\"
+endif
+
+ifdef BOARD_HAS_MTD_CACHE
+  LOCAL_CFLAGS += -DBOARD_HAS_MTD_CACHE
+endif
+
 # This binary is in the recovery ramdisk, which is otherwise a copy of root.
 # It gets copied there in config/Makefile.  LOCAL_MODULE_TAGS suppresses
 # a (redundant) copy of the binary in /system/bin for user builds.
@@ -163,16 +179,6 @@
 LOCAL_SRC_FILES := killrecovery.sh
 include $(BUILD_PREBUILT)
 
-ifdef BOARD_USES_FFORMAT
-include $(CLEAR_VARS)
-LOCAL_MODULE := fformat
-LOCAL_MODULE_TAGS := eng
-LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
-LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
-LOCAL_SRC_FILES := prebuilt/fformat
-include $(BUILD_PREBUILT)
-endif
-
 include $(commands_recovery_local_path)/amend/Android.mk
 include $(commands_recovery_local_path)/minui/Android.mk
 include $(commands_recovery_local_path)/minzip/Android.mk
diff --git a/extendedcommands.c b/extendedcommands.c
index fe7de6a..903df1d 100644
--- a/extendedcommands.c
+++ b/extendedcommands.c
@@ -870,7 +870,7 @@
     }
     
     fprintf(file, "%s ", info->mount_point);
-    fprintf(file, "%s rw\n", info->filesystem); 
+    fprintf(file, "%s %s\n", info->filesystem, info->filesystem_options == NULL ? "rw" : info->filesystem_options); 
 }
 
 void create_fstab()
diff --git a/killrecovery.sh b/killrecovery.sh
index c0d9943..90f43e6 100755
--- a/killrecovery.sh
+++ b/killrecovery.sh
@@ -6,5 +6,4 @@
 kill $(ps | grep /sbin/adbd)
 kill $(ps | grep /sbin/recovery)
 
-/sbin/recovery &
 exit 1
\ No newline at end of file
diff --git a/nandroid.c b/nandroid.c
index 33899d1..e3a2bb4 100644
--- a/nandroid.c
+++ b/nandroid.c
@@ -216,7 +216,7 @@
     sprintf(tmp, "%s/%s.img", backup_path, name);
     struct stat file_info;
     if (0 != (ret = statfs(tmp, &file_info))) {
-        ui_print("%s.img not found. Skipping restore of /sd-ext.", name);
+        ui_print("%s.img not found. Skipping restore of %s.\n", name, mount_point);
         return 0;
     }
 
diff --git a/roots.c b/roots.c
index fc2d177..df49cc3 100644
--- a/roots.c
+++ b/roots.c
@@ -39,20 +39,20 @@
 static const char g_package_file[] = "@\0g_package_file";
 
 static RootInfo g_roots[] = {
-    { "BOOT:", g_mtd_device, NULL, "boot", NULL, g_raw },
-    { "CACHE:", CACHE_DEVICE, NULL, "cache", "/cache", CACHE_FILESYSTEM },
-    { "DATA:", DATA_DEVICE, NULL, "userdata", "/data", DATA_FILESYSTEM },
+    { "BOOT:", g_mtd_device, NULL, "boot", NULL, g_raw, NULL },
+    { "CACHE:", CACHE_DEVICE, NULL, "cache", "/cache", CACHE_FILESYSTEM, CACHE_FILESYSTEM_OPTIONS },
+    { "DATA:", DATA_DEVICE, NULL, "userdata", "/data", DATA_FILESYSTEM, DATA_FILESYSTEM_OPTIONS },
 #ifdef HAS_DATADATA
-    { "DATADATA:", DATADATA_DEVICE, NULL, "datadata", "/datadata", DATADATA_FILESYSTEM },
+    { "DATADATA:", DATADATA_DEVICE, NULL, "datadata", "/datadata", DATADATA_FILESYSTEM, DATADATA_FILESYSTEM_OPTIONS },
 #endif
-    { "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_DEVICE_PRIMARY, SDCARD_DEVICE_SECONDARY, NULL, "/sdcard", "vfat" },
-    { "SDEXT:", SDEXT_DEVICE, NULL, NULL, "/sd-ext", SDEXT_FILESYSTEM },
-    { "SYSTEM:", SYSTEM_DEVICE, NULL, "system", "/system", SYSTEM_FILESYSTEM },
-    { "MBM:", g_mtd_device, NULL, "mbm", NULL, g_raw },
-    { "TMP:", NULL, NULL, NULL, "/tmp", NULL },
+    { "MISC:", g_mtd_device, NULL, "misc", NULL, g_raw, NULL },
+    { "PACKAGE:", NULL, NULL, NULL, NULL, g_package_file, NULL },
+    { "RECOVERY:", g_mtd_device, NULL, "recovery", "/", g_raw, NULL },
+    { "SDCARD:", SDCARD_DEVICE_PRIMARY, SDCARD_DEVICE_SECONDARY, NULL, "/sdcard", "vfat", NULL },
+    { "SDEXT:", SDEXT_DEVICE, NULL, NULL, "/sd-ext", SDEXT_FILESYSTEM, NULL },
+    { "SYSTEM:", SYSTEM_DEVICE, NULL, "system", "/system", SYSTEM_FILESYSTEM, SYSTEM_FILESYSTEM_OPTIONS },
+    { "MBM:", g_mtd_device, NULL, "mbm", NULL, g_raw, NULL },
+    { "TMP:", NULL, NULL, NULL, "/tmp", NULL, NULL },
 };
 #define NUM_ROOTS (sizeof(g_roots) / sizeof(g_roots[0]))
 
@@ -207,14 +207,15 @@
     return internal_root_mounted(info) >= 0;
 }
 
-static int mount_internal(const char* device, const char* mount_point, const char* filesystem)
+static int mount_internal(const char* device, const char* mount_point, const char* filesystem, const char* filesystem_options)
 {
-    if (strcmp(filesystem, "auto") != 0) {
+    if (strcmp(filesystem, "auto") != 0 && filesystem_options == NULL) {
         return mount(device, mount_point, filesystem, MS_NOATIME | MS_NODEV | MS_NODIRATIME, "");
     }
     else {
         char mount_cmd[PATH_MAX];
-        sprintf(mount_cmd, "mount -onoatime,nodiratime,nodev %s %s", device, mount_point);
+        const char* options = filesystem_options == NULL ? "noatime,nodiratime,nodev" : filesystem_options;
+        sprintf(mount_cmd, "mount -t %s -o%s %s %s", filesystem, options, device, mount_point);
         return __system(mount_cmd);
     }
 }
@@ -259,7 +260,7 @@
     }
 
     mkdir(info->mount_point, 0755);  // in case it doesn't already exist
-    if (mount_internal(info->device, info->mount_point, info->filesystem)) {
+    if (mount_internal(info->device, info->mount_point, info->filesystem, info->filesystem_options)) {
         if (info->device2 == NULL) {
             LOGE("Can't mount %s\n(%s)\n", info->device, strerror(errno));
             return -1;
@@ -311,7 +312,12 @@
     if (info == NULL || info->device != g_mtd_device ||
             info->partition_name == NULL)
     {
+#ifdef BOARD_HAS_MTD_CACHE
+        if (strcmp(root_path, "CACHE:") != 0)
+            return NULL;
+#else
         return NULL;
+#endif
     }
     mtd_scan_partitions();
     return mtd_find_partition_by_name(info->partition_name);
@@ -377,14 +383,6 @@
             }
         }
     }
-
-#ifdef BOARD_USES_FFORMAT
-    if (info->filesystem != NULL && strcmp("rfs", info->filesystem) == 0) {
-        char cmd[PATH_MAX];
-        sprintf("/sbin/fformat %s", info->device);
-        return __system(cmd);
-    }
-#endif
-
+    
     return format_non_mtd_device(root);
 }
diff --git a/roots.h b/roots.h
index a75de9c..4f7c229 100644
--- a/roots.h
+++ b/roots.h
@@ -68,6 +68,23 @@
 #define SYSTEM_FILESYSTEM "yaffs2"
 #endif
 
+#ifndef DATA_FILESYSTEM_OPTIONS
+#define DATA_FILESYSTEM_OPTIONS NULL
+#endif
+
+#ifndef CACHE_FILESYSTEM_OPTIONS
+#define CACHE_FILESYSTEM_OPTIONS NULL
+#endif
+
+#ifndef DATADATA_FILESYSTEM_OPTIONS
+#define DATADATA_FILESYSTEM_OPTIONS NULL
+#endif
+
+#ifndef SYSTEM_FILESYSTEM_OPTIONS
+#define SYSTEM_FILESYSTEM_OPTIONS NULL
+#endif
+
+
 /* Any of the "root_path" arguments can be paths with relative
  * components, like "SYSTEM:a/b/c".
  */
@@ -115,6 +132,7 @@
     const char *partition_name;
     const char *mount_point;
     const char *filesystem;
+    const char *filesystem_options;
 } RootInfo;
 
 #endif  // RECOVERY_ROOTS_H_