From bb848c54a78572ec2ded3e8ed05ee01f5e8290d9 Mon Sep 17 00:00:00 2001 From: Tianjie Xu Date: Tue, 21 Jun 2016 15:54:09 -0700 Subject: [PATCH] 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 --- tools/releasetools/blockimgdiff.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/tools/releasetools/blockimgdiff.py b/tools/releasetools/blockimgdiff.py index a7a4098f7..66d59077d 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