binman: Update Entry.WriteData() to handle special sections

At present this method assumes that the parent section does not need
to recalculate its position or adjust any metadata it may contain. But
when the entry changes size this may not be true. Also if the parent
section is more than just a container (e.g. it is a CBFS) then the
section may need to regenerate its output.

Add a new WriteChildData() method to sections and call this from the
WriteData() method, to handle this situation.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2019-07-20 12:24:05 -06:00
parent a9cd39ef75
commit 7210c89eac
3 changed files with 29 additions and 3 deletions

View File

@ -751,7 +751,26 @@ features to produce new behaviours.
self.contents_size = self.size
ok = self.ProcessContentsUpdate(data)
self.Detail('WriteData: size=%x, ok=%s' % (len(data), ok))
return ok
section_ok = self.section.WriteChildData(self)
return ok and section_ok
def WriteChildData(self, child):
"""Handle writing the data in a child entry
This should be called on the child's parent section after the child's
data has been updated. It
This base-class implementation does nothing, since the base Entry object
does not have any children.
Args:
child: Child Entry that was written
Returns:
True if the section could be updated successfully, False if the
data is such that the section could not updat
"""
return True
def GetSiblingOrder(self):
"""Get the relative order of an entry amoung its siblings

View File

@ -169,7 +169,7 @@ class Entry_cbfs(Entry):
self._cbfs_entries = OrderedDict()
self._ReadSubnodes()
def ObtainContents(self):
def ObtainContents(self, skip=None):
arch = cbfs_util.find_arch(self._cbfs_arg)
if arch is None:
self.Raise("Invalid architecture '%s'" % self._cbfs_arg)
@ -179,7 +179,7 @@ class Entry_cbfs(Entry):
for entry in self._cbfs_entries.values():
# First get the input data and put it in a file. If not available,
# try later.
if not entry.ObtainContents():
if entry != skip and not entry.ObtainContents():
return False
data = entry.GetData()
cfile = None
@ -274,3 +274,7 @@ class Entry_cbfs(Entry):
reader = self.reader
cfile = reader.files.get(child.name)
return cfile.data if decomp else cfile.orig_data
def WriteChildData(self, child):
self.ObtainContents(skip=child)
return True

View File

@ -520,3 +520,6 @@ class Entry_section(Entry):
(child.GetPath(), len(indata), child.compress,
len(data)))
return data
def WriteChildData(self, child):
return True