Loading Android.mk +5 −3 Original line number Diff line number Diff line Loading @@ -83,9 +83,11 @@ LOCAL_MODULE := recovery LOCAL_FORCE_STATIC_EXECUTABLE := true LOCAL_REQUIRED_MODULES := e2fsdroid_static mke2fs_static mke2fs.conf ifeq ($(TARGET_USERIMAGES_USE_F2FS),true) ifeq ($(HOST_OS),linux) LOCAL_REQUIRED_MODULES := mkfs.f2fs LOCAL_REQUIRED_MODULES += mkfs.f2fs endif endif Loading @@ -112,6 +114,7 @@ LOCAL_STATIC_LIBRARIES := \ libverifier \ libbatterymonitor \ libbootloader_message \ libfs_mgr \ libext4_utils \ libsparse \ libziparchive \ Loading @@ -122,7 +125,6 @@ LOCAL_STATIC_LIBRARIES := \ libfusesideload \ libminui \ libpng \ libfs_mgr \ libcrypto_utils \ libcrypto \ libvintf_recovery \ Loading Loading @@ -151,7 +153,7 @@ else endif ifeq ($(BOARD_CACHEIMAGE_PARTITION_SIZE),) LOCAL_REQUIRED_MODULES := recovery-persist recovery-refresh LOCAL_REQUIRED_MODULES += recovery-persist recovery-refresh endif include $(BUILD_EXECUTABLE) Loading roots.cpp +56 −6 Original line number Diff line number Diff line Loading @@ -27,7 +27,8 @@ #include <fcntl.h> #include <android-base/logging.h> #include <ext4_utils/make_ext4fs.h> #include <android-base/properties.h> #include <android-base/stringprintf.h> #include <ext4_utils/wipe.h> #include <fs_mgr.h> Loading Loading @@ -215,11 +216,60 @@ int format_volume(const char* volume, const char* directory) { } int result; if (strcmp(v->fs_type, "ext4") == 0) { static constexpr int block_size = 4096; int raid_stride = v->logical_blk_size / block_size; int raid_stripe_width = v->erase_blk_size / block_size; // stride should be the max of 8kb and logical block size if (v->logical_blk_size != 0 && v->logical_blk_size < 8192) { raid_stride = 8192 / block_size; } const char* mke2fs_argv[] = { "/sbin/mke2fs_static", "-F", "-t", "ext4", "-b", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; int i = 5; std::string block_size_str = std::to_string(block_size); mke2fs_argv[i++] = block_size_str.c_str(); std::string ext_args; if (v->erase_blk_size != 0 && v->logical_blk_size != 0) { result = make_ext4fs_directory_align(v->blk_device, length, volume, sehandle, directory, v->erase_blk_size, v->logical_blk_size); } else { result = make_ext4fs_directory(v->blk_device, length, volume, sehandle, directory); ext_args = android::base::StringPrintf("stride=%d,stripe-width=%d", raid_stride, raid_stripe_width); mke2fs_argv[i++] = "-E"; mke2fs_argv[i++] = ext_args.c_str(); } mke2fs_argv[i++] = v->blk_device; std::string size_str = std::to_string(length / block_size); if (length != 0) { mke2fs_argv[i++] = size_str.c_str(); } result = exec_cmd(mke2fs_argv[0], const_cast<char**>(mke2fs_argv)); if (result == 0 && directory != nullptr) { const char* e2fsdroid_argv[] = { "/sbin/e2fsdroid_static", "-e", "-S", "/file_contexts", "-f", directory, "-a", volume, v->blk_device, nullptr }; result = exec_cmd(e2fsdroid_argv[0], const_cast<char**>(e2fsdroid_argv)); } } else { /* Has to be f2fs because we checked earlier. */ if (v->key_loc != NULL && strcmp(v->key_loc, "footer") == 0 && length < 0) { Loading updater/install.cpp +25 −2 Original line number Diff line number Diff line Loading @@ -302,12 +302,35 @@ Value* FormatFn(const char* name, State* state, const std::vector<std::unique_pt } if (fs_type == "ext4") { int status = make_ext4fs(location.c_str(), size, mount_point.c_str(), sehandle); const char* mke2fs_argv[] = { "/sbin/mke2fs_static", "-t", "ext4", "-b", "4096", location.c_str(), nullptr, nullptr }; std::string size_str; if (size != 0) { size_str = std::to_string(size / 4096LL); mke2fs_argv[6] = size_str.c_str(); } int status = exec_cmd(mke2fs_argv[0], const_cast<char**>(mke2fs_argv)); if (status != 0) { LOG(WARNING) << name << ": mke2fs failed (" << status << ") on " << location << ", falling back to make_ext4fs"; status = make_ext4fs(location.c_str(), size, mount_point.c_str(), sehandle); if (status != 0) { LOG(ERROR) << name << ": make_ext4fs failed (" << status << ") on " << location; return StringValue(""); } return StringValue(location); } const char* e2fsdroid_argv[] = { "/sbin/e2fsdroid_static", "-e", "-S", "/file_contexts", "-a", mount_point.c_str(), location.c_str(), nullptr }; status = exec_cmd(e2fsdroid_argv[0], const_cast<char**>(e2fsdroid_argv)); if (status != 0) { LOG(ERROR) << name << ": e2fsdroid failed (" << status << ") on " << location; return StringValue(""); } return StringValue(location); } else if (fs_type == "f2fs") { if (size < 0) { LOG(ERROR) << name << ": fs_size can't be negative for f2fs: " << fs_size; Loading Loading
Android.mk +5 −3 Original line number Diff line number Diff line Loading @@ -83,9 +83,11 @@ LOCAL_MODULE := recovery LOCAL_FORCE_STATIC_EXECUTABLE := true LOCAL_REQUIRED_MODULES := e2fsdroid_static mke2fs_static mke2fs.conf ifeq ($(TARGET_USERIMAGES_USE_F2FS),true) ifeq ($(HOST_OS),linux) LOCAL_REQUIRED_MODULES := mkfs.f2fs LOCAL_REQUIRED_MODULES += mkfs.f2fs endif endif Loading @@ -112,6 +114,7 @@ LOCAL_STATIC_LIBRARIES := \ libverifier \ libbatterymonitor \ libbootloader_message \ libfs_mgr \ libext4_utils \ libsparse \ libziparchive \ Loading @@ -122,7 +125,6 @@ LOCAL_STATIC_LIBRARIES := \ libfusesideload \ libminui \ libpng \ libfs_mgr \ libcrypto_utils \ libcrypto \ libvintf_recovery \ Loading Loading @@ -151,7 +153,7 @@ else endif ifeq ($(BOARD_CACHEIMAGE_PARTITION_SIZE),) LOCAL_REQUIRED_MODULES := recovery-persist recovery-refresh LOCAL_REQUIRED_MODULES += recovery-persist recovery-refresh endif include $(BUILD_EXECUTABLE) Loading
roots.cpp +56 −6 Original line number Diff line number Diff line Loading @@ -27,7 +27,8 @@ #include <fcntl.h> #include <android-base/logging.h> #include <ext4_utils/make_ext4fs.h> #include <android-base/properties.h> #include <android-base/stringprintf.h> #include <ext4_utils/wipe.h> #include <fs_mgr.h> Loading Loading @@ -215,11 +216,60 @@ int format_volume(const char* volume, const char* directory) { } int result; if (strcmp(v->fs_type, "ext4") == 0) { static constexpr int block_size = 4096; int raid_stride = v->logical_blk_size / block_size; int raid_stripe_width = v->erase_blk_size / block_size; // stride should be the max of 8kb and logical block size if (v->logical_blk_size != 0 && v->logical_blk_size < 8192) { raid_stride = 8192 / block_size; } const char* mke2fs_argv[] = { "/sbin/mke2fs_static", "-F", "-t", "ext4", "-b", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; int i = 5; std::string block_size_str = std::to_string(block_size); mke2fs_argv[i++] = block_size_str.c_str(); std::string ext_args; if (v->erase_blk_size != 0 && v->logical_blk_size != 0) { result = make_ext4fs_directory_align(v->blk_device, length, volume, sehandle, directory, v->erase_blk_size, v->logical_blk_size); } else { result = make_ext4fs_directory(v->blk_device, length, volume, sehandle, directory); ext_args = android::base::StringPrintf("stride=%d,stripe-width=%d", raid_stride, raid_stripe_width); mke2fs_argv[i++] = "-E"; mke2fs_argv[i++] = ext_args.c_str(); } mke2fs_argv[i++] = v->blk_device; std::string size_str = std::to_string(length / block_size); if (length != 0) { mke2fs_argv[i++] = size_str.c_str(); } result = exec_cmd(mke2fs_argv[0], const_cast<char**>(mke2fs_argv)); if (result == 0 && directory != nullptr) { const char* e2fsdroid_argv[] = { "/sbin/e2fsdroid_static", "-e", "-S", "/file_contexts", "-f", directory, "-a", volume, v->blk_device, nullptr }; result = exec_cmd(e2fsdroid_argv[0], const_cast<char**>(e2fsdroid_argv)); } } else { /* Has to be f2fs because we checked earlier. */ if (v->key_loc != NULL && strcmp(v->key_loc, "footer") == 0 && length < 0) { Loading
updater/install.cpp +25 −2 Original line number Diff line number Diff line Loading @@ -302,12 +302,35 @@ Value* FormatFn(const char* name, State* state, const std::vector<std::unique_pt } if (fs_type == "ext4") { int status = make_ext4fs(location.c_str(), size, mount_point.c_str(), sehandle); const char* mke2fs_argv[] = { "/sbin/mke2fs_static", "-t", "ext4", "-b", "4096", location.c_str(), nullptr, nullptr }; std::string size_str; if (size != 0) { size_str = std::to_string(size / 4096LL); mke2fs_argv[6] = size_str.c_str(); } int status = exec_cmd(mke2fs_argv[0], const_cast<char**>(mke2fs_argv)); if (status != 0) { LOG(WARNING) << name << ": mke2fs failed (" << status << ") on " << location << ", falling back to make_ext4fs"; status = make_ext4fs(location.c_str(), size, mount_point.c_str(), sehandle); if (status != 0) { LOG(ERROR) << name << ": make_ext4fs failed (" << status << ") on " << location; return StringValue(""); } return StringValue(location); } const char* e2fsdroid_argv[] = { "/sbin/e2fsdroid_static", "-e", "-S", "/file_contexts", "-a", mount_point.c_str(), location.c_str(), nullptr }; status = exec_cmd(e2fsdroid_argv[0], const_cast<char**>(e2fsdroid_argv)); if (status != 0) { LOG(ERROR) << name << ": e2fsdroid failed (" << status << ") on " << location; return StringValue(""); } return StringValue(location); } else if (fs_type == "f2fs") { if (size < 0) { LOG(ERROR) << name << ": fs_size can't be negative for f2fs: " << fs_size; Loading