summaryrefslogtreecommitdiff
path: root/fastboot/fs.cpp
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk@google.com>2020-11-09 08:54:13 -0800
committerJaegeuk Kim <jaegeuk@google.com>2020-11-09 10:04:30 -0800
commit638d05e84ec0c81ce6a5a8a53deb955ee6413d2c (patch)
treef17ee25bceead00ecb755f7820638b9831ae18a5 /fastboot/fs.cpp
parent56850e12e304f63c7939e4be553d7a176176bd9f (diff)
fastboot: add casefold/projid/compress options
fastboot -w --fs-options=casefold fastboot -w --fs-options=casefold,projid fastboot format:f2fs --fs-options=casefold fastboot format:f2fs --fs-options=casefold,projid fastboot format:f2fs --fs-options=casefold,projid,compress Bug: 172514669 Bug: 160198145 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com> Change-Id: If3fad004fdd25dd754432ce98934b4ae6c8a8706
Diffstat (limited to 'fastboot/fs.cpp')
-rw-r--r--fastboot/fs.cpp42
1 files changed, 34 insertions, 8 deletions
diff --git a/fastboot/fs.cpp b/fastboot/fs.cpp
index 8c0aa6bf4..8addcb6b8 100644
--- a/fastboot/fs.cpp
+++ b/fastboot/fs.cpp
@@ -113,7 +113,7 @@ static int exec_cmd(const char* path, const char** argv, const char** envp) {
static int generate_ext4_image(const char* fileName, long long partSize,
const std::string& initial_dir, unsigned eraseBlkSize,
- unsigned logicalBlkSize) {
+ unsigned logicalBlkSize, const unsigned fsOptions) {
static constexpr int block_size = 4096;
const std::string exec_dir = android::base::GetExecutableDirectory();
@@ -137,6 +137,12 @@ static int generate_ext4_image(const char* fileName, long long partSize,
mke2fs_args.push_back(ext_attr.c_str());
mke2fs_args.push_back("-O");
mke2fs_args.push_back("uninit_bg");
+
+ if (fsOptions & (1 << FS_OPT_PROJID)) {
+ mke2fs_args.push_back("-I");
+ mke2fs_args.push_back("512");
+ }
+
mke2fs_args.push_back(fileName);
std::string size_str = std::to_string(partSize / block_size);
@@ -162,9 +168,9 @@ static int generate_ext4_image(const char* fileName, long long partSize,
return exec_cmd(e2fsdroid_args[0], e2fsdroid_args.data(), nullptr);
}
-static int generate_f2fs_image(const char* fileName, long long partSize, const std::string& initial_dir,
- unsigned /* unused */, unsigned /* unused */)
-{
+static int generate_f2fs_image(const char* fileName, long long partSize,
+ const std::string& initial_dir, unsigned /* unused */,
+ unsigned /* unused */, const unsigned fsOptions) {
const std::string exec_dir = android::base::GetExecutableDirectory();
const std::string mkf2fs_path = exec_dir + "/make_f2fs";
std::vector<const char*> mkf2fs_args = {mkf2fs_path.c_str()};
@@ -174,6 +180,26 @@ static int generate_f2fs_image(const char* fileName, long long partSize, const s
mkf2fs_args.push_back(size_str.c_str());
mkf2fs_args.push_back("-g");
mkf2fs_args.push_back("android");
+
+ if (fsOptions & (1 << FS_OPT_PROJID)) {
+ mkf2fs_args.push_back("-O");
+ mkf2fs_args.push_back("project_quota,extra_attr");
+ }
+
+ if (fsOptions & (1 << FS_OPT_CASEFOLD)) {
+ mkf2fs_args.push_back("-O");
+ mkf2fs_args.push_back("casefold");
+ mkf2fs_args.push_back("-C");
+ mkf2fs_args.push_back("utf8");
+ }
+
+ if (fsOptions & (1 << FS_OPT_COMPRESS)) {
+ mkf2fs_args.push_back("-O");
+ mkf2fs_args.push_back("compression");
+ mkf2fs_args.push_back("-O");
+ mkf2fs_args.push_back("extra_attr");
+ }
+
mkf2fs_args.push_back(fileName);
mkf2fs_args.push_back(nullptr);
@@ -198,7 +224,7 @@ static const struct fs_generator {
//returns 0 or error value
int (*generate)(const char* fileName, long long partSize, const std::string& initial_dir,
- unsigned eraseBlkSize, unsigned logicalBlkSize);
+ unsigned eraseBlkSize, unsigned logicalBlkSize, const unsigned fsOptions);
} generators[] = {
{ "ext4", generate_ext4_image},
@@ -215,7 +241,7 @@ const struct fs_generator* fs_get_generator(const std::string& fs_type) {
}
int fs_generator_generate(const struct fs_generator* gen, const char* fileName, long long partSize,
- const std::string& initial_dir, unsigned eraseBlkSize, unsigned logicalBlkSize)
-{
- return gen->generate(fileName, partSize, initial_dir, eraseBlkSize, logicalBlkSize);
+ const std::string& initial_dir, unsigned eraseBlkSize,
+ unsigned logicalBlkSize, const unsigned fsOptions) {
+ return gen->generate(fileName, partSize, initial_dir, eraseBlkSize, logicalBlkSize, fsOptions);
}