From db475c9015dbc850edda779c6487be0724682c59 Mon Sep 17 00:00:00 2001 From: systemad Date: Thu, 12 Aug 2021 20:33:20 +0200 Subject: [PATCH] f2fs format: Remade f2fs command Main reason for this change was to add proper support for casefolding and project id quota so I adapted how the command was built, similar how the AOSP recovery crafts it. Your device tree also need to include this $(call inherit-product, $(SRC_TARGET_DIR)/product/emulated_storage.mk) references: https://android.googlesource.com/platform/bootable/recovery/+/refs/tags/android-11.0.0_r29/recovery_utils/roots.cpp#246 https://source.android.com/devices/storage/sdcardfs-deprecate Change-Id: Id45b8ed33fe4f2317f0559ef77423f70d892b91c --- partition.cpp | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/partition.cpp b/partition.cpp index 3efa9bfa..6ef9ff9e 100755 --- a/partition.cpp +++ b/partition.cpp @@ -2386,22 +2386,23 @@ bool TWPartition::Wipe_RMRF() { } bool TWPartition::Wipe_F2FS() { - std::string command; - std::string f2fs_bin; + std::string f2fs_command; if (!UnMount(true)) return false; if (TWFunc::Path_Exists("/system/bin/mkfs.f2fs")) - f2fs_bin = "/system/bin/mkfs.f2fs"; + f2fs_command = "/system/bin/mkfs.f2fs"; else if (TWFunc::Path_Exists("/system/bin/make_f2fs")) - f2fs_bin = "/system/bin/make_f2fs"; + f2fs_command = "/system/bin/make_f2fs -g android"; else { LOGINFO("mkfs.f2fs binary not found, using rm -rf to wipe.\n"); return Wipe_RMRF(); } bool NeedPreserveFooter = true; + bool needs_casefold = false; + bool needs_projid = false; Find_Actual_Block_Device(); if (!Is_Present) { @@ -2409,19 +2410,27 @@ bool TWPartition::Wipe_F2FS() { gui_msg(Msg(msg::kError, "unable_to_wipe=Unable to wipe {1}.")(Display_Name)); return false; } - + + needs_casefold = android::base::GetBoolProperty("external_storage.casefold.enabled", false); + needs_projid = android::base::GetBoolProperty("external_storage.projid.enabled", false); unsigned long long dev_sz = TWFunc::IOCTL_Get_Block_Size(Actual_Block_Device.c_str()); if (!dev_sz) return false; if (NeedPreserveFooter) Length < 0 ? dev_sz += Length : dev_sz -= CRYPT_FOOTER_OFFSET; - char dev_sz_str[48]; sprintf(dev_sz_str, "%llu", (dev_sz / 4096)); - command = f2fs_bin + " -d1 -f -O encrypt -O quota -O verity -w 4096 " + Actual_Block_Device + " " + dev_sz_str; + if(needs_projid) + f2fs_command += " -O project_quota,extra_attr"; + + if(needs_casefold) + f2fs_command += " -O casefold -C utf8"; + + f2fs_command += " " + Actual_Block_Device + " " + dev_sz_str; + if (TWFunc::Path_Exists("/system/bin/sload.f2fs")) { - command += " && sload.f2fs -t /data " + Actual_Block_Device; + f2fs_command += " && sload.f2fs -t /data " + Actual_Block_Device; } /** @@ -2432,8 +2441,8 @@ bool TWPartition::Wipe_F2FS() { Crypto_Key_Location != "footer") { NeedPreserveFooter = false; } - LOGINFO("mkfs.f2fs command: %s\n", f2fs_bin.c_str()); - if (TWFunc::Exec_Cmd(command) == 0) { + LOGINFO("mkfs.f2fs command: %s\n", f2fs_command.c_str()); + if (TWFunc::Exec_Cmd(f2fs_command) == 0) { if (NeedPreserveFooter) Wipe_Crypto_Key(); Recreate_AndSec_Folder();