Merge "Use non-LTO variant of libhwbinder" into pi-dev
diff --git a/roots.cpp b/roots.cpp
index 9ff5186..8907bbd 100644
--- a/roots.cpp
+++ b/roots.cpp
@@ -324,19 +324,34 @@
   }
 
   // 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 645faad..bb43c2c 100644
--- a/uncrypt/uncrypt.cpp
+++ b/uncrypt/uncrypt.cpp
@@ -172,10 +172,14 @@
     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 @@
                     *encrypted = true;
                 }
             }
+            if (f2fs_fs && strcmp(v->fs_type, "f2fs") == 0)
+                *f2fs_fs = true;
             return v->blk_device;
         }
     }
@@ -244,7 +250,7 @@
 }
 
 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 @@
         }
     }
 
+#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 @@
 
     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 @@
     // 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 2b6c20f..6732ab8 100644
--- a/updater/install.cpp
+++ b/updater/install.cpp
@@ -548,6 +548,8 @@
                                 "encrypt",
                                 "-O",
                                 "quota",
+                                "-w",
+                                "512",
                                 location.c_str(),
                                 (size < 512) ? nullptr : num_sectors.c_str(),
                                 nullptr };