summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--roots.cpp25
-rw-r--r--uncrypt/uncrypt.cpp26
-rw-r--r--updater/install.cpp2
3 files changed, 44 insertions, 9 deletions
diff --git a/roots.cpp b/roots.cpp
index 9ff5186c1..8907bbd9b 100644
--- a/roots.cpp
+++ b/roots.cpp
@@ -324,19 +324,34 @@ int format_volume(const char* volume, const char* directory) {
}
// Has to be f2fs because we checked earlier.
+ static constexpr int kSectorSize = 4096;
std::string cmd("/sbin/mkfs.f2fs");
- std::vector<std::string> make_f2fs_cmd = { cmd, "-d1", "-f", "-O",
- "encrypt", "-O", "quota", v->blk_device };
- if (length >= 512) {
- make_f2fs_cmd.push_back(std::to_string(length / 512));
+ // clang-format off
+ std::vector<std::string> make_f2fs_cmd = {
+ cmd,
+ "-d1",
+ "-f",
+ "-O", "encrypt",
+ "-O", "quota",
+ "-w", std::to_string(kSectorSize),
+ v->blk_device,
+ };
+ // clang-format on
+ if (length >= kSectorSize) {
+ make_f2fs_cmd.push_back(std::to_string(length / kSectorSize));
}
int result = exec_cmd(make_f2fs_cmd);
if (result == 0 && directory != nullptr) {
cmd = "/sbin/sload.f2fs";
+ // clang-format off
std::vector<std::string> sload_f2fs_cmd = {
- cmd, "-f", directory, "-t", volume, v->blk_device,
+ cmd,
+ "-f", directory,
+ "-t", volume,
+ v->blk_device,
};
+ // clang-format on
result = exec_cmd(sload_f2fs_cmd);
}
if (result != 0) {
diff --git a/uncrypt/uncrypt.cpp b/uncrypt/uncrypt.cpp
index 645faadbf..bb43c2c4a 100644
--- a/uncrypt/uncrypt.cpp
+++ b/uncrypt/uncrypt.cpp
@@ -172,10 +172,14 @@ static struct fstab* read_fstab() {
return fstab;
}
-static const char* find_block_device(const char* path, bool* encryptable, bool* encrypted) {
+static const char* find_block_device(const char* path, bool* encryptable, bool* encrypted, bool *f2fs_fs) {
// Look for a volume whose mount point is the prefix of path and
// return its block device. Set encrypted if it's currently
// encrypted.
+
+ // ensure f2fs_fs is set to 0 first.
+ if (f2fs_fs)
+ *f2fs_fs = false;
for (int i = 0; i < fstab->num_entries; ++i) {
struct fstab_rec* v = &fstab->recs[i];
if (!v->mount_point) {
@@ -192,6 +196,8 @@ static const char* find_block_device(const char* path, bool* encryptable, bool*
*encrypted = true;
}
}
+ if (f2fs_fs && strcmp(v->fs_type, "f2fs") == 0)
+ *f2fs_fs = true;
return v->blk_device;
}
}
@@ -244,7 +250,7 @@ static int retry_fibmap(const int fd, const char* name, int* block, const int he
}
static int produce_block_map(const char* path, const char* map_file, const char* blk_dev,
- bool encrypted, int socket) {
+ bool encrypted, bool f2fs_fs, int socket) {
std::string err;
if (!android::base::RemoveFileIfExists(map_file, &err)) {
LOG(ERROR) << "failed to remove the existing map file " << map_file << ": " << err;
@@ -307,6 +313,17 @@ static int produce_block_map(const char* path, const char* map_file, const char*
}
}
+#ifndef F2FS_IOC_SET_DONTMOVE
+#ifndef F2FS_IOCTL_MAGIC
+#define F2FS_IOCTL_MAGIC 0xf5
+#endif
+#define F2FS_IOC_SET_DONTMOVE _IO(F2FS_IOCTL_MAGIC, 13)
+#endif
+ if (f2fs_fs && ioctl(fd, F2FS_IOC_SET_DONTMOVE) < 0) {
+ PLOG(ERROR) << "Failed to set non-movable file for f2fs: " << path << " on " << blk_dev;
+ return kUncryptIoctlError;
+ }
+
off64_t pos = 0;
int last_progress = 0;
while (pos < sb.st_size) {
@@ -458,7 +475,8 @@ static int uncrypt(const char* input_path, const char* map_file, const int socke
bool encryptable;
bool encrypted;
- const char* blk_dev = find_block_device(path, &encryptable, &encrypted);
+ bool f2fs_fs;
+ const char* blk_dev = find_block_device(path, &encryptable, &encrypted, &f2fs_fs);
if (blk_dev == nullptr) {
LOG(ERROR) << "failed to find block device for " << path;
return kUncryptBlockDeviceFindError;
@@ -479,7 +497,7 @@ static int uncrypt(const char* input_path, const char* map_file, const int socke
// and /sdcard we leave the file alone.
if (strncmp(path, "/data/", 6) == 0) {
LOG(INFO) << "writing block map " << map_file;
- return produce_block_map(path, map_file, blk_dev, encrypted, socket);
+ return produce_block_map(path, map_file, blk_dev, encrypted, f2fs_fs, socket);
}
return 0;
diff --git a/updater/install.cpp b/updater/install.cpp
index 2b6c20fe3..6732ab897 100644
--- a/updater/install.cpp
+++ b/updater/install.cpp
@@ -548,6 +548,8 @@ Value* FormatFn(const char* name, State* state, const std::vector<std::unique_pt
"encrypt",
"-O",
"quota",
+ "-w",
+ "512",
location.c_str(),
(size < 512) ? nullptr : num_sectors.c_str(),
nullptr };