support for per-partition fs_type (do not merge)

Include the recovery.fstab file in the recovery image.  Remove the
global fs_type and partition_type values from the target-files
key/value dict, and parse the recovery.fstab file instead to find
types for each partition.

Change-Id: I35ee2dd0989441dc2a704b63c1b32e598049acb5
This commit is contained in:
Doug Zongker
2010-09-20 18:04:41 -07:00
parent 1020d271c6
commit 258bf46ea6
5 changed files with 133 additions and 57 deletions

View File

@@ -21,6 +21,9 @@ class EdifyGenerator(object):
"""Class to generate scripts in the 'edify' recovery script language
used from donut onwards."""
# map recovery.fstab's fs_types to mount/format "partition types"
PARTITION_TYPES = { "yaffs2": "MTD", "mtd": "MTD", "ext4": "EMMC" }
def __init__(self, version, info):
self.script = []
self.mounts = set()
@@ -131,15 +134,22 @@ class EdifyGenerator(object):
available on /cache."""
self.script.append("assert(apply_patch_space(%d));" % (amount,))
def Mount(self, what, mount_point):
"""Mount the given 'what' at the given path. 'what' should be a
partition name for an MTD partition, or a block device for
anything else."""
what = self.info.get("partition_path", "") + what
self.script.append('mount("%s", "%s", "%s", "%s");' %
(self.info["fs_type"], self.info["partition_type"],
what, mount_point))
self.mounts.add(mount_point)
def Mount(self, mount_point):
"""Mount the partition with the given mount_point."""
fstab = self.info.get("fstab", None)
if fstab:
p = fstab[mount_point]
self.script.append('mount("%s", "%s", "%s", "%s");' %
(p.fs_type, self.PARTITION_TYPES[p.fs_type],
p.device, p.mount_point))
self.mounts.add(p.mount_point)
else:
what = mount_point.lstrip("/")
what = self.info.get("partition_path", "") + what
self.script.append('mount("%s", "%s", "%s", "%s");' %
(self.info["fs_type"], self.info["partition_type"],
what, mount_point))
self.mounts.add(mount_point)
def UnpackPackageDir(self, src, dst):
"""Unpack a given directory from the OTA package into the given
@@ -158,11 +168,20 @@ class EdifyGenerator(object):
self.script.append('ui_print("%s");' % (message,))
def FormatPartition(self, partition):
"""Format the given partition."""
partition = self.info.get("partition_path", "") + partition
self.script.append('format("%s", "%s", "%s");' %
(self.info["fs_type"], self.info["partition_type"],
partition))
"""Format the given partition, specified by its mount point (eg,
"/system")."""
fstab = self.info.get("fstab", None)
if fstab:
p = fstab[partition]
self.script.append('format("%s", "%s", "%s");' %
(p.fs_type, self.PARTITION_TYPES[p.fs_type], p.device))
else:
# older target-files without per-partition types
partition = self.info.get("partition_path", "") + partition
self.script.append('format("%s", "%s", "%s");' %
(self.info["fs_type"], self.info["partition_type"],
partition))
def DeleteFiles(self, file_list):
"""Delete all files in file_list."""
@@ -196,24 +215,42 @@ class EdifyGenerator(object):
self.script.append(
'write_firmware_image("PACKAGE:%s", "%s");' % (fn, kind))
def WriteRawImage(self, partition, fn):
"""Write the given package file into the given partition."""
def WriteRawImage(self, mount_point, fn):
"""Write the given package file into the partition for the given
mount point."""
if self.info["partition_type"] == "MTD":
self.script.append(
('assert(package_extract_file("%(fn)s", "/tmp/%(partition)s.img"),\n'
' write_raw_image("/tmp/%(partition)s.img", "%(partition)s"),\n'
' delete("/tmp/%(partition)s.img"));')
% {'partition': partition, 'fn': fn})
elif self.info["partition_type"] == "EMMC":
self.script.append(
('package_extract_file("%(fn)s", "%(dir)s%(partition)s");')
% {'partition': partition, 'fn': fn,
'dir': self.info.get("partition_path", ""),
})
fstab = self.info["fstab"]
if fstab:
p = fstab[mount_point]
partition_type = self.PARTITION_TYPES[p.fs_type]
args = {'device': p.device, 'fn': fn}
if partition_type == "MTD":
self.script.append(
('assert(package_extract_file("%(fn)s", "/tmp/%(device)s.img"),\n'
' write_raw_image("/tmp/%(device)s.img", "%(device)s"),\n'
' delete("/tmp/%(device)s.img"));') % args)
elif partition_type == "EMMC":
self.script.append(
'package_extract_file("%(fn)s", "%(device)s");' % args)
else:
raise ValueError("don't know how to write \"%s\" partitions" % (p.fs_type,))
else:
raise ValueError("don't know how to write \"%s\" partitions" %
(self.info["partition_type"],))
# backward compatibility with older target-files that lack recovery.fstab
if self.info["partition_type"] == "MTD":
self.script.append(
('assert(package_extract_file("%(fn)s", "/tmp/%(partition)s.img"),\n'
' write_raw_image("/tmp/%(partition)s.img", "%(partition)s"),\n'
' delete("/tmp/%(partition)s.img"));')
% {'partition': partition, 'fn': fn})
elif self.info["partition_type"] == "EMMC":
self.script.append(
('package_extract_file("%(fn)s", "%(dir)s%(partition)s");')
% {'partition': partition, 'fn': fn,
'dir': self.info.get("partition_path", ""),
})
else:
raise ValueError("don't know how to write \"%s\" partitions" %
(self.info["partition_type"],))
def SetPermissions(self, fn, uid, gid, mode):
"""Set file ownership and permissions."""