aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTianjie Xu <xunchang@google.com>2016-06-22 05:11:24 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2016-06-22 05:11:24 +0000
commit0eade3f02775733fba1404d8f26ad0386f225f72 (patch)
treeea6a2a2c55096ff40b30d08f5372d75943c1b988
parent1f87a820ad227befc84f6a2a11fa73333f8deb5f (diff)
parentb64439b2916913ed0d544e6e19724868ffa4008c (diff)
downloadbuild-0eade3f02775733fba1404d8f26ad0386f225f72.tar.gz
Merge "Limit the number of blocks in command zero" into nyc-dev
-rw-r--r--tools/releasetools/blockimgdiff.py23
1 files changed, 19 insertions, 4 deletions
diff --git a/tools/releasetools/blockimgdiff.py b/tools/releasetools/blockimgdiff.py
index a7a4098f76..66d59077dd 100644
--- a/tools/releasetools/blockimgdiff.py
+++ b/tools/releasetools/blockimgdiff.py
@@ -342,6 +342,21 @@ class BlockImageDiff(object):
return ctx.hexdigest()
def WriteTransfers(self, prefix):
+ def WriteTransfersZero(out, to_zero):
+ """Limit the number of blocks in command zero to 1024 blocks.
+
+ This prevents the target size of one command from being too large; and
+ might help to avoid fsync errors on some devices."""
+
+ zero_blocks_limit = 1024
+ total = 0
+ while to_zero:
+ zero_blocks = to_zero.first(zero_blocks_limit)
+ out.append("zero %s\n" % (zero_blocks.to_string_raw(),))
+ total += zero_blocks.size()
+ to_zero = to_zero.subtract(zero_blocks)
+ return total
+
out = []
total = 0
@@ -523,9 +538,8 @@ class BlockImageDiff(object):
elif xf.style == "zero":
assert xf.tgt_ranges
to_zero = xf.tgt_ranges.subtract(xf.src_ranges)
- if to_zero:
- out.append("%s %s\n" % (xf.style, to_zero.to_string_raw()))
- total += to_zero.size()
+ assert WriteTransfersZero(out, to_zero) == to_zero.size()
+ total += to_zero.size()
else:
raise ValueError("unknown transfer style '%s'\n" % xf.style)
@@ -554,7 +568,8 @@ class BlockImageDiff(object):
# Zero out extended blocks as a workaround for bug 20881595.
if self.tgt.extended:
- out.append("zero %s\n" % (self.tgt.extended.to_string_raw(),))
+ assert (WriteTransfersZero(out, self.tgt.extended) ==
+ self.tgt.extended.size())
total += self.tgt.extended.size()
# We erase all the blocks on the partition that a) don't contain useful