releasetools: Perform erase commands first.

We used to erase all the unused blocks at the end of an update. In order
to work around the eMMC issue in b/28347095, we move part of the erase
commands, which won't be used during the update, to the beginning. The
reset would be erased at the end. This is in hopes of avoiding eMMC
getting starved for clean blocks which would otherwise fail an OTA.

Bug: 28347095
Change-Id: Ia96b06216b35d6700858687a66734af36d0ec213
This commit is contained in:
Tao Bao 2016-05-03 10:02:01 -07:00
parent 878775fd75
commit 66f1fa6565
1 changed files with 13 additions and 3 deletions

View File

@ -556,12 +556,22 @@ class BlockImageDiff(object):
total += self.tgt.extended.size()
# We erase all the blocks on the partition that a) don't contain useful
# data in the new image and b) will not be touched by dm-verity.
# data in the new image; b) will not be touched by dm-verity. Out of those
# blocks, we erase the ones that won't be used in this update at the
# beginning of an update. The rest would be erased at the end. This is to
# work around the eMMC issue observed on some devices, which may otherwise
# get starving for clean blocks and thus fail the update. (b/28347095)
all_tgt = RangeSet(data=(0, self.tgt.total_blocks))
all_tgt_minus_extended = all_tgt.subtract(self.tgt.extended)
new_dontcare = all_tgt_minus_extended.subtract(self.tgt.care_map)
if new_dontcare:
out.append("erase %s\n" % (new_dontcare.to_string_raw(),))
erase_first = new_dontcare.subtract(self.touched_src_ranges)
if erase_first:
out.insert(0, "erase %s\n" % (erase_first.to_string_raw(),))
erase_last = new_dontcare.subtract(erase_first)
if erase_last:
out.append("erase %s\n" % (erase_last.to_string_raw(),))
out.insert(0, "%d\n" % (self.version,)) # format version number
out.insert(1, "%d\n" % (total,))