Reserve the last 16 Kbytes of /data for the crypto footer.
When formatting /data, if it's an ext4 filesystem, reserve the
last 16 Kbytes for the crypto footer.
Change-Id: I7b401d851ee87732e5da5860df0287a1c331c5b7
diff --git a/roots.c b/roots.c
index 92ce789..5731d74 100644
--- a/roots.c
+++ b/roots.c
@@ -238,8 +238,12 @@
}
if (strcmp(v->fs_type, "ext4") == 0) {
- reset_ext4fs_info();
- int result = make_ext4fs(v->device, NULL, NULL, 0, 0, 0, 0);
+ s64 len = 0;
+
+ if (strcmp(volume, "/data") == 0) {
+ len = -16384; /* Reserve 16 Kbytes for the crypto footer */
+ }
+ int result = make_ext4fs(v->device, len);
if (result != 0) {
LOGE("format_volume: make_extf4fs failed on %s\n", v->device);
return -1;
diff --git a/updater/install.c b/updater/install.c
index 656c607..6a79964 100644
--- a/updater/install.c
+++ b/updater/install.c
@@ -177,19 +177,23 @@
}
-// format(fs_type, partition_type, location)
+// format(fs_type, partition_type, location, fs_size)
//
-// fs_type="yaffs2" partition_type="MTD" location=partition
-// fs_type="ext4" partition_type="EMMC" location=device
+// fs_type="yaffs2" partition_type="MTD" location=partition fs_size=<bytes>
+// fs_type="ext4" partition_type="EMMC" location=device fs_size=<bytes>
+// if fs_size == 0, then make_ext4fs uses the entire partition.
+// if fs_size > 0, that is the size to use
+// if fs_size < 0, then reserve that many bytes at the end of the partition
Value* FormatFn(const char* name, State* state, int argc, Expr* argv[]) {
char* result = NULL;
- if (argc != 3) {
- return ErrorAbort(state, "%s() expects 3 args, got %d", name, argc);
+ if (argc != 4) {
+ return ErrorAbort(state, "%s() expects 4 args, got %d", name, argc);
}
char* fs_type;
char* partition_type;
char* location;
- if (ReadArgs(state, argv, 3, &fs_type, &partition_type, &location) < 0) {
+ char* fs_size;
+ if (ReadArgs(state, argv, 4, &fs_type, &partition_type, &location, &fs_size) < 0) {
return NULL;
}
@@ -236,8 +240,7 @@
result = location;
#ifdef USE_EXT4
} else if (strcmp(fs_type, "ext4") == 0) {
- reset_ext4fs_info();
- int status = make_ext4fs(location, NULL, NULL, 0, 0, 0, 0);
+ int status = make_ext4fs(location, atoll(fs_size));
if (status != 0) {
fprintf(stderr, "%s: make_ext4fs failed (%d) on %s",
name, status, location);