summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoug Zongker <dougz@google.com>2013-12-19 15:16:57 -0800
committerDoug Zongker <dougz@google.com>2013-12-19 15:16:57 -0800
commit168724c31ad5241e157ebb35135a734fa075d53b (patch)
tree2767df1a481624b816eeddce4cc1a1ab6b08b2de
parentc87bab101893e8322b49d7c8600e3367b20ab50a (diff)
downloadbootable_recovery-168724c31ad5241e157ebb35135a734fa075d53b.zip
bootable_recovery-168724c31ad5241e157ebb35135a734fa075d53b.tar.gz
bootable_recovery-168724c31ad5241e157ebb35135a734fa075d53b.tar.bz2
fix unnecessarily slow writing of EMMC partitions
These were attempts to write partitions "conservatively" in hopes of fixing the problems with writing the radio partition on Nexus 4. They didn't work (a kernel patch was needed), but got left in. They make writing of partitions unnecessarily slow (ie, we really shouldn't need to sync() after every 4kb). Roll back most of them, but leave the verification read-back in. Change-Id: I94badc0979e88816c5aa0485f6316c02be69173c
-rw-r--r--applypatch/applypatch.c18
1 files changed, 3 insertions, 15 deletions
diff --git a/applypatch/applypatch.c b/applypatch/applypatch.c
index 6b8da2a..cb9bc23 100644
--- a/applypatch/applypatch.c
+++ b/applypatch/applypatch.c
@@ -424,20 +424,18 @@ int WriteToPartition(unsigned char* data, size_t len,
{
size_t start = 0;
int success = 0;
- int fd = open(partition, O_RDWR | O_SYNC);
+ int fd = open(partition, O_RDWR);
if (fd < 0) {
printf("failed to open %s: %s\n", partition, strerror(errno));
return -1;
}
int attempt;
- for (attempt = 0; attempt < 10; ++attempt) {
- size_t next_sync = start + (1<<20);
- printf("raw O_SYNC write %s attempt %d start at %d\n", partition, attempt+1, start);
+ for (attempt = 0; attempt < 2; ++attempt) {
lseek(fd, start, SEEK_SET);
while (start < len) {
size_t to_write = len - start;
- if (to_write > 4096) to_write = 4096;
+ if (to_write > 1<<20) to_write = 1<<20;
ssize_t written = write(fd, data+start, to_write);
if (written < 0) {
@@ -450,10 +448,6 @@ int WriteToPartition(unsigned char* data, size_t len,
}
}
start += written;
- if (start >= next_sync) {
- fsync(fd);
- next_sync = start + (1<<20);
- }
}
fsync(fd);
@@ -506,8 +500,6 @@ int WriteToPartition(unsigned char* data, size_t len,
success = true;
break;
}
-
- sleep(2);
}
if (!success) {
@@ -519,11 +511,7 @@ int WriteToPartition(unsigned char* data, size_t len,
printf("error closing %s (%s)\n", partition, strerror(errno));
return -1;
}
- // hack: sync and sleep after closing in hopes of getting
- // the data actually onto flash.
- printf("sleeping after close\n");
sync();
- sleep(5);
break;
}
}