diff options
author | Michael Runge <mrunge@google.com> | 2014-11-21 16:00:45 -0800 |
---|---|---|
committer | Michael Runge <mrunge@google.com> | 2014-11-21 16:27:28 -0800 |
commit | 4b54239173f685a558a65e53c01b461c65006e5c (patch) | |
tree | f87b44625e6aab649429befb0b986fa393616bb5 /uncrypt | |
parent | de27d4cbb75a9c2f5ad0fc24edf5295d0f3d9fe0 (diff) | |
download | bootable_recovery-4b54239173f685a558a65e53c01b461c65006e5c.zip bootable_recovery-4b54239173f685a558a65e53c01b461c65006e5c.tar.gz bootable_recovery-4b54239173f685a558a65e53c01b461c65006e5c.tar.bz2 |
Force write to disk while doing uncrypt
This should reduce errors if the device reboots before the blocks
are commited to disk.
Bug: 18481902
Change-Id: I13cda1c78955e4c83522fbcf87ddb16cc9f97683
Diffstat (limited to 'uncrypt')
-rw-r--r-- | uncrypt/uncrypt.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/uncrypt/uncrypt.c b/uncrypt/uncrypt.c index 189fa57..361c804 100644 --- a/uncrypt/uncrypt.c +++ b/uncrypt/uncrypt.c @@ -164,7 +164,8 @@ char* parse_recovery_command_file() if (f == NULL) { return NULL; } - FILE* fo = fopen(RECOVERY_COMMAND_FILE_TMP, "w"); + int fd = open(RECOVERY_COMMAND_FILE_TMP, O_WRONLY | O_SYNC); + FILE* fo = fdopen(fd, "w"); while (fgets(temp, sizeof(temp), f)) { printf("read: %s", temp); @@ -175,6 +176,7 @@ char* parse_recovery_command_file() fputs(temp, fo); } fclose(f); + fsync(fd); fclose(fo); if (fn) { @@ -190,7 +192,8 @@ int produce_block_map(const char* path, const char* map_file, const char* blk_de struct stat sb; int ret; - FILE* mapf = fopen(map_file, "w"); + int mapfd = open(map_file, O_WRONLY | O_SYNC); + FILE* mapf = fdopen(mapfd, "w"); ret = stat(path, &sb); if (ret != 0) { @@ -232,7 +235,7 @@ int produce_block_map(const char* path, const char* map_file, const char* blk_de int wfd = -1; if (encrypted) { - wfd = open(blk_dev, O_WRONLY); + wfd = open(blk_dev, O_WRONLY | O_SYNC); if (wfd < 0) { ALOGE("failed to open fd for writing: %s\n", strerror(errno)); return -1; @@ -302,9 +305,11 @@ int produce_block_map(const char* path, const char* map_file, const char* blk_de fprintf(mapf, "%d %d\n", ranges[i*2], ranges[i*2+1]); } + fsync(mapfd); fclose(mapf); close(fd); if (encrypted) { + fsync(wfd); close(wfd); } @@ -318,7 +323,7 @@ void wipe_misc() { struct fstab_rec* v = &fstab->recs[i]; if (!v->mount_point) continue; if (strcmp(v->mount_point, "/misc") == 0) { - int fd = open(v->blk_device, O_WRONLY); + int fd = open(v->blk_device, O_WRONLY | O_SYNC); uint8_t zeroes[1088]; // sizeof(bootloader_message) from recovery memset(zeroes, 0, sizeof(zeroes)); @@ -333,7 +338,7 @@ void wipe_misc() { written += w; } } - + fsync(fd); close(fd); } } |