aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Runge <mrunge@google.com>2014-10-29 20:23:58 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-10-29 20:23:58 +0000
commit2020564f21bb0216965f0f5c43c5c1c995785bab (patch)
treeb8b0d4e037629eb1112212e3b9e673bc39244f1f
parente908a45420fc4194c6007193d21d5b690e04583f (diff)
parentbe81e51c171a0cf9b9b5045ee949282b7f36d779 (diff)
downloadbootable_recovery-2020564f21bb0216965f0f5c43c5c1c995785bab.zip
bootable_recovery-2020564f21bb0216965f0f5c43c5c1c995785bab.tar.gz
bootable_recovery-2020564f21bb0216965f0f5c43c5c1c995785bab.tar.bz2
am be81e51c: Use more aggressive sync writing to applypatch.
* commit 'be81e51c171a0cf9b9b5045ee949282b7f36d779': Use more aggressive sync writing to applypatch.
-rw-r--r--applypatch/applypatch.c44
1 files changed, 36 insertions, 8 deletions
diff --git a/applypatch/applypatch.c b/applypatch/applypatch.c
index bfb9440..2c86e09 100644
--- a/applypatch/applypatch.c
+++ b/applypatch/applypatch.c
@@ -309,7 +309,7 @@ static int LoadPartitionContents(const char* filename, FileContents* file) {
// Save the contents of the given FileContents object under the given
// filename. Return 0 on success.
int SaveFileContents(const char* filename, const FileContents* file) {
- int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+ int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_SYNC, S_IRUSR | S_IWUSR);
if (fd < 0) {
printf("failed to open \"%s\" for write: %s\n",
filename, strerror(errno));
@@ -324,8 +324,14 @@ int SaveFileContents(const char* filename, const FileContents* file) {
close(fd);
return -1;
}
- fsync(fd);
- close(fd);
+ if (fsync(fd) != 0) {
+ printf("fsync of \"%s\" failed: %s\n", filename, strerror(errno));
+ return -1;
+ }
+ if (close(fd) != 0) {
+ printf("close of \"%s\" failed: %s\n", filename, strerror(errno));
+ return -1;
+ }
if (chmod(filename, file->st.st_mode) != 0) {
printf("chmod of \"%s\" failed: %s\n", filename, strerror(errno));
@@ -408,7 +414,7 @@ int WriteToPartition(unsigned char* data, size_t len,
{
size_t start = 0;
int success = 0;
- int fd = open(partition, O_RDWR);
+ int fd = open(partition, O_RDWR | O_SYNC);
if (fd < 0) {
printf("failed to open %s: %s\n", partition, strerror(errno));
return -1;
@@ -433,7 +439,22 @@ int WriteToPartition(unsigned char* data, size_t len,
}
start += written;
}
- fsync(fd);
+ if (fsync(fd) != 0) {
+ printf("failed to sync to %s (%s)\n",
+ partition, strerror(errno));
+ return -1;
+ }
+ if (close(fd) != 0) {
+ printf("failed to close %s (%s)\n",
+ partition, strerror(errno));
+ return -1;
+ }
+ fd = open(partition, O_RDONLY);
+ if (fd < 0) {
+ printf("failed to reopen %s for verify (%s)\n",
+ partition, strerror(errno));
+ return -1;
+ }
// drop caches so our subsequent verification read
// won't just be reading the cache.
@@ -919,7 +940,8 @@ static int GenerateTarget(FileContents* source_file,
strcpy(outname, target_filename);
strcat(outname, ".patch");
- output = open(outname, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+ output = open(outname, O_WRONLY | O_CREAT | O_TRUNC | O_SYNC,
+ S_IRUSR | S_IWUSR);
if (output < 0) {
printf("failed to open output file %s: %s\n",
outname, strerror(errno));
@@ -950,8 +972,14 @@ static int GenerateTarget(FileContents* source_file,
}
if (output >= 0) {
- fsync(output);
- close(output);
+ if (fsync(output) != 0) {
+ printf("failed to fsync file \"%s\" (%s)\n", outname, strerror(errno));
+ result = 1;
+ }
+ if (close(output) != 0) {
+ printf("failed to close file \"%s\" (%s)\n", outname, strerror(errno));
+ result = 1;
+ }
}
if (result != 0) {