Adjust the size computation for reserved blocks

Due to the change in https://lwn.net/Articles/546473/, kernel reserves a
few extra blocks (lesser of 2% and 4096 blocks) on ext4 FS which leads to
OTA update failures. Adjust the size computation if the device has
BOARD_HAS_EXT4_RESERVED_BLOCKS := true.

Bug: 21522719
Bug: 22023465
Change-Id: I49f16adbf2dedc5279fbb8622bf99ef71dcc494f
This commit is contained in:
Tao Bao
2015-06-23 11:16:05 -07:00
parent bebd3cfbf9
commit efbb5d2e69
2 changed files with 36 additions and 1 deletions

View File

@@ -255,6 +255,22 @@ def BuildImage(in_dir, prop_dict, out_file):
prop_dict["partition_size"] = str(adjusted_size)
prop_dict["original_partition_size"] = str(partition_size)
# Bug: 21522719, 22023465
# There are some reserved blocks on ext4 FS (lesser of 4096 blocks and 2%).
# We need to deduct those blocks from the available space, since they are
# not writable even with root privilege. It only affects devices using
# file-based OTA and a kernel version of 3.10 or greater (currently just
# sprout).
reserved_blocks = prop_dict.get("has_ext4_reserved_blocks") == "true"
if reserved_blocks and fs_type.startswith("ext4"):
partition_size = int(prop_dict.get("partition_size"))
block_size = int(prop_dict.get("blocksize"))
reserved_size = min(4096 * block_size, int(partition_size * 0.02))
adjusted_size = partition_size - reserved_size
if not prop_dict.has_key("original_partition_size"):
prop_dict["original_partition_size"] = str(partition_size)
prop_dict["partition_size"] = str(adjusted_size)
if fs_type.startswith("ext"):
build_command = ["mkuserimg.sh"]
if "extfs_sparse_flag" in prop_dict:
@@ -386,6 +402,8 @@ def ImagePropFromGlobalDict(glob_dict, mount_point):
copy_prop("system_verity_block_device", "verity_block_device")
copy_prop("system_root_image", "system_root_image")
copy_prop("ramdisk_dir", "ramdisk_dir")
copy_prop("has_ext4_reserved_blocks", "has_ext4_reserved_blocks")
copy_prop("blocksize", "blocksize")
elif mount_point == "data":
# Copy the generic fs type first, override with specific one if available.
copy_prop("fs_type", "fs_type")
@@ -399,10 +417,14 @@ def ImagePropFromGlobalDict(glob_dict, mount_point):
copy_prop("vendor_size", "partition_size")
copy_prop("vendor_journal_size", "journal_size")
copy_prop("vendor_verity_block_device", "verity_block_device")
copy_prop("has_ext4_reserved_blocks", "has_ext4_reserved_blocks")
copy_prop("blocksize", "blocksize")
elif mount_point == "oem":
copy_prop("fs_type", "fs_type")
copy_prop("oem_size", "partition_size")
copy_prop("oem_journal_size", "journal_size")
copy_prop("has_ext4_reserved_blocks", "has_ext4_reserved_blocks")
copy_prop("blocksize", "blocksize")
return d