Merge "recovery: replace make_ext4 with e2fsprogs"
This commit is contained in:
commit
f7c00ddaf6
3 changed files with 86 additions and 11 deletions
|
@ -85,9 +85,11 @@ LOCAL_MODULE := recovery
|
||||||
|
|
||||||
LOCAL_FORCE_STATIC_EXECUTABLE := true
|
LOCAL_FORCE_STATIC_EXECUTABLE := true
|
||||||
|
|
||||||
|
LOCAL_REQUIRED_MODULES := e2fsdroid_static mke2fs_static mke2fs.conf
|
||||||
|
|
||||||
ifeq ($(TARGET_USERIMAGES_USE_F2FS),true)
|
ifeq ($(TARGET_USERIMAGES_USE_F2FS),true)
|
||||||
ifeq ($(HOST_OS),linux)
|
ifeq ($(HOST_OS),linux)
|
||||||
LOCAL_REQUIRED_MODULES := mkfs.f2fs
|
LOCAL_REQUIRED_MODULES += mkfs.f2fs
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -120,6 +122,7 @@ LOCAL_STATIC_LIBRARIES := \
|
||||||
libverifier \
|
libverifier \
|
||||||
libbatterymonitor \
|
libbatterymonitor \
|
||||||
libbootloader_message \
|
libbootloader_message \
|
||||||
|
libfs_mgr \
|
||||||
libext4_utils \
|
libext4_utils \
|
||||||
libsparse \
|
libsparse \
|
||||||
libziparchive \
|
libziparchive \
|
||||||
|
@ -130,7 +133,6 @@ LOCAL_STATIC_LIBRARIES := \
|
||||||
libfusesideload \
|
libfusesideload \
|
||||||
libminui \
|
libminui \
|
||||||
libpng \
|
libpng \
|
||||||
libfs_mgr \
|
|
||||||
libcrypto_utils \
|
libcrypto_utils \
|
||||||
libcrypto \
|
libcrypto \
|
||||||
libvintf_recovery \
|
libvintf_recovery \
|
||||||
|
@ -159,7 +161,7 @@ else
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(BOARD_CACHEIMAGE_PARTITION_SIZE),)
|
ifeq ($(BOARD_CACHEIMAGE_PARTITION_SIZE),)
|
||||||
LOCAL_REQUIRED_MODULES := recovery-persist recovery-refresh
|
LOCAL_REQUIRED_MODULES += recovery-persist recovery-refresh
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include $(BUILD_EXECUTABLE)
|
include $(BUILD_EXECUTABLE)
|
||||||
|
|
62
roots.cpp
62
roots.cpp
|
@ -27,7 +27,8 @@
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include <android-base/logging.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 <ext4_utils/wipe.h>
|
||||||
#include <fs_mgr.h>
|
#include <fs_mgr.h>
|
||||||
|
|
||||||
|
@ -215,11 +216,60 @@ int format_volume(const char* volume, const char* directory) {
|
||||||
}
|
}
|
||||||
int result;
|
int result;
|
||||||
if (strcmp(v->fs_type, "ext4") == 0) {
|
if (strcmp(v->fs_type, "ext4") == 0) {
|
||||||
if (v->erase_blk_size != 0 && v->logical_blk_size != 0) {
|
static constexpr int block_size = 4096;
|
||||||
result = make_ext4fs_directory_align(v->blk_device, length, volume, sehandle,
|
int raid_stride = v->logical_blk_size / block_size;
|
||||||
directory, v->erase_blk_size, v->logical_blk_size);
|
int raid_stripe_width = v->erase_blk_size / block_size;
|
||||||
} else {
|
|
||||||
result = make_ext4fs_directory(v->blk_device, length, volume, sehandle, directory);
|
// 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) {
|
||||||
|
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. */
|
} else { /* Has to be f2fs because we checked earlier. */
|
||||||
if (v->key_loc != NULL && strcmp(v->key_loc, "footer") == 0 && length < 0) {
|
if (v->key_loc != NULL && strcmp(v->key_loc, "footer") == 0 && length < 0) {
|
||||||
|
|
|
@ -302,9 +302,32 @@ Value* FormatFn(const char* name, State* state, const std::vector<std::unique_pt
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fs_type == "ext4") {
|
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) {
|
if (status != 0) {
|
||||||
LOG(ERROR) << name << ": make_ext4fs failed (" << status << ") on " << location;
|
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("");
|
||||||
}
|
}
|
||||||
return StringValue(location);
|
return StringValue(location);
|
||||||
|
|
Loading…
Reference in a new issue