Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 619b162d authored by Jin Qian's avatar Jin Qian
Browse files

recovery: replace make_ext4 with e2fsprogs

Execute mke2fs to create empty ext4 filesystem.
Execute e2fsdroid to add files to filesystem.

Test: enter recovery mode and wipe data
Bug: 35219933
Change-Id: I10a9f4c1f4754ad864b2df45b1f879180ab33876
Merged-In: I10a9f4c1f4754ad864b2df45b1f879180ab33876
parent 855eafff
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -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

@@ -112,6 +114,7 @@ LOCAL_STATIC_LIBRARIES := \
    libverifier \
    libbatterymonitor \
    libbootloader_message \
    libfs_mgr \
    libext4_utils \
    libsparse \
    libziparchive \
@@ -122,7 +125,6 @@ LOCAL_STATIC_LIBRARIES := \
    libfusesideload \
    libminui \
    libpng \
    libfs_mgr \
    libcrypto_utils \
    libcrypto \
    libvintf_recovery \
@@ -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)
+56 −6
Original line number Diff line number Diff line
@@ -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>

@@ -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) {
+25 −2
Original line number Diff line number Diff line
@@ -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;