Add support for casefolding and project quotas

This enables ext4 casefolding and project quotas for adopted storage
cards.

Test: Enable virtual sdcard, adopt, check options on formatted disk
Bug: 138321217
Bug: 138322712
Change-Id: I99c09283cd78c30237cf18ad9ae9384ba0c05396
diff --git a/fs/Ext4.cpp b/fs/Ext4.cpp
index 0059233..8bb930d 100644
--- a/fs/Ext4.cpp
+++ b/fs/Ext4.cpp
@@ -171,6 +171,14 @@
     cmd.push_back("-M");
     cmd.push_back(target);
 
+    bool needs_casefold = android::base::GetBoolProperty("ro.emulated_storage.casefold", false);
+    bool needs_projid = android::base::GetBoolProperty("ro.emulated_storage.projid", false);
+
+    if (needs_projid) {
+        cmd.push_back("-I");
+        cmd.push_back("512");
+    }
+
     std::string options("has_journal");
     if (android::base::GetBoolProperty("vold.has_quota", false)) {
         options += ",quota";
@@ -178,10 +186,21 @@
     if (fscrypt_is_native()) {
         options += ",encrypt";
     }
+    if (needs_casefold) {
+        options += ",casefold";
+    }
 
     cmd.push_back("-O");
     cmd.push_back(options);
 
+    if (needs_casefold || needs_projid) {
+        cmd.push_back("-E");
+        std::string extopts = "";
+        if (needs_casefold) extopts += "encoding=utf8,";
+        if (needs_projid) extopts += "quotatype=prjquota,";
+        cmd.push_back(extopts);
+    }
+
     cmd.push_back(source);
 
     if (numSectors) {