Initial f2fs support

Need to add this to your source tree:
https://github.com/razrqcom-dev-team/android_external_f2fs-tools

Change-Id: I3ee9ebbb617259655518f8ea356ce7b8c246cd4d
diff --git a/partition.cpp b/partition.cpp
index 444eb4b..e6c6221 100644
--- a/partition.cpp
+++ b/partition.cpp
@@ -500,6 +500,7 @@
 		File_System == "ntfs" ||
 		File_System == "yaffs2" ||
 		File_System == "exfat" ||
+		File_System == "f2fs" ||
 		File_System == "auto")
 		return true;
 	else
@@ -1005,6 +1006,8 @@
 			wiped = Wipe_EXFAT();
 		else if (New_File_System == "yaffs2")
 			wiped = Wipe_MTD();
+		else if (New_File_System == "f2fs")
+			wiped = Wipe_F2FS();
 		else {
 			LOGERR("Unable to wipe '%s' -- unknown file system '%s'\n", Mount_Point.c_str(), New_File_System.c_str());
 			unlink("/.layout_version");
@@ -1398,6 +1401,32 @@
 	return true;
 }
 
+bool TWPartition::Wipe_F2FS() {
+	string command, result;
+
+	if (TWFunc::Path_Exists("/sbin/mkfs.f2fs")) {
+		if (!UnMount(true))
+			return false;
+
+		gui_print("Formatting %s using mkfs.f2fs...\n", Display_Name.c_str());
+		Find_Actual_Block_Device();
+		command = "mkfs.f2fs " + Actual_Block_Device;
+		if (TWFunc::Exec_Cmd(command, result) == 0) {
+			Recreate_AndSec_Folder();
+			gui_print("Done.\n");
+			return true;
+		} else {
+			LOGERR("Unable to wipe '%s'.\n", Mount_Point.c_str());
+			return false;
+		}
+		return true;
+	} else {
+		gui_print("mkfs.f2fs binary not found, using rm -rf to wipe.\n");
+		return Wipe_RMRF();
+	}
+	return false;
+}
+
 bool TWPartition::Wipe_Data_Without_Wiping_Media() {
 	string dir;
 
diff --git a/partitions.hpp b/partitions.hpp
index 736304e..25ae4db 100644
--- a/partitions.hpp
+++ b/partitions.hpp
@@ -92,6 +92,7 @@
 	bool Wipe_EXFAT();                                                        // Formats as EXFAT
 	bool Wipe_MTD();                                                          // Formats as yaffs2 for MTD memory types
 	bool Wipe_RMRF();                                                         // Uses rm -rf to wipe
+	bool Wipe_F2FS();                                                         // Uses mkfs.f2fs to wipe
 	bool Wipe_Data_Without_Wiping_Media();                                    // Uses rm -rf to wipe but does not wipe /data/media
 	bool Backup_Tar(string backup_folder);                                    // Backs up using tar for file systems
 	bool Backup_DD(string backup_folder);                                     // Backs up using dd for emmc memory types
diff --git a/prebuilt/Android.mk b/prebuilt/Android.mk
index 74923a0..39f702b 100644
--- a/prebuilt/Android.mk
+++ b/prebuilt/Android.mk
@@ -89,6 +89,11 @@
     RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/openaes
     RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libopenaes.so
 endif
+ifeq ($(TARGET_USERIMAGES_USE_F2FS), true)
+    RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mkfs.f2fs
+    RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/fsck.f2fs
+    RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/fibmap.f2fs
+endif
 
 TWRP_AUTOGEN := $(intermediates)/teamwin