Limit the number of blocks in command 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 during the OTA update.
Bug: 29535618
Change-Id: Ic630cea2599138516162bd0029e2e4b2af75bf4f
(cherry picked from commit bb848c54a78572ec2ded3e8ed05ee01f5e8290d9)
diff --git a/tools/releasetools/blockimgdiff.py b/tools/releasetools/blockimgdiff.py
index a7a4098..66d5907 100644
--- a/tools/releasetools/blockimgdiff.py
+++ b/tools/releasetools/blockimgdiff.py
@@ -342,6 +342,21 @@
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 @@
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 @@
# 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