* commit '2020564f21bb0216965f0f5c43c5c1c995785bab': Use more aggressive sync writing to applypatch.
This commit is contained in:
+36
-8
@@ -309,7 +309,7 @@ static int LoadPartitionContents(const char* filename, FileContents* file) {
|
|||||||
// Save the contents of the given FileContents object under the given
|
// Save the contents of the given FileContents object under the given
|
||||||
// filename. Return 0 on success.
|
// filename. Return 0 on success.
|
||||||
int SaveFileContents(const char* filename, const FileContents* file) {
|
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) {
|
if (fd < 0) {
|
||||||
printf("failed to open \"%s\" for write: %s\n",
|
printf("failed to open \"%s\" for write: %s\n",
|
||||||
filename, strerror(errno));
|
filename, strerror(errno));
|
||||||
@@ -324,8 +324,14 @@ int SaveFileContents(const char* filename, const FileContents* file) {
|
|||||||
close(fd);
|
close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fsync(fd);
|
if (fsync(fd) != 0) {
|
||||||
close(fd);
|
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) {
|
if (chmod(filename, file->st.st_mode) != 0) {
|
||||||
printf("chmod of \"%s\" failed: %s\n", filename, strerror(errno));
|
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;
|
size_t start = 0;
|
||||||
int success = 0;
|
int success = 0;
|
||||||
int fd = open(partition, O_RDWR);
|
int fd = open(partition, O_RDWR | O_SYNC);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
printf("failed to open %s: %s\n", partition, strerror(errno));
|
printf("failed to open %s: %s\n", partition, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
@@ -433,7 +439,22 @@ int WriteToPartition(unsigned char* data, size_t len,
|
|||||||
}
|
}
|
||||||
start += written;
|
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
|
// drop caches so our subsequent verification read
|
||||||
// won't just be reading the cache.
|
// won't just be reading the cache.
|
||||||
@@ -919,7 +940,8 @@ static int GenerateTarget(FileContents* source_file,
|
|||||||
strcpy(outname, target_filename);
|
strcpy(outname, target_filename);
|
||||||
strcat(outname, ".patch");
|
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) {
|
if (output < 0) {
|
||||||
printf("failed to open output file %s: %s\n",
|
printf("failed to open output file %s: %s\n",
|
||||||
outname, strerror(errno));
|
outname, strerror(errno));
|
||||||
@@ -950,8 +972,14 @@ static int GenerateTarget(FileContents* source_file,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (output >= 0) {
|
if (output >= 0) {
|
||||||
fsync(output);
|
if (fsync(output) != 0) {
|
||||||
close(output);
|
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) {
|
if (result != 0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user