summaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
authorDarren Hart <dvhart@linux.intel.com>2012-04-11 10:51:11 -0700
committerRichard Purdie <richard.purdie@linuxfoundation.org>2012-04-14 23:11:38 +0100
commitd1c5de9ccb93ac30afcd98126fff4a74e243b6f9 (patch)
treef1e2dcc5e3b0778111e1ac1d63ff7e52a7b8c704 /meta
parent4274ebdd009163bd199f6cb08df373fdfeb67178 (diff)
downloadpoky-d1c5de9ccb93ac30afcd98126fff4a74e243b6f9.tar.gz
bootimg: Account for FAT filesystem overhead in image size
Fixes [YOCTO #1852] The bootimg class wasn't accounting for non-trivial amount of space required by the directory entries and FATs for the FAT filesystem. This patch attempts to make an accurate prediction of FAT overhead and adjusts the image size accordingly. It assumes no more than 16 directory entries per directory (which fit in a single sector). It also assumes 8.3 filenames. With the ceiling functions rounding up to full sectors and tracks, these assumptions seem reasonable. In order to ensure the calculations are accurate, this patch forces the FAT size to 32, rather than allowing mkdosfs to automatically select 12, 16, or 32 depending on the image being built. Tested by setting BOOTIMG_EXTRA_SPACE=0 and building core-image-minimal and core-image-sato for fri2-noemgd from meta-intel. (From OE-Core rev: 68aa18609c10a3ae2f738930c933fa2a95ce8959) Signed-off-by: Darren Hart <dvhart@linux.intel.com> CC: Saul Wold <sgw@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> Backported to edison by Darren Hart. Signed-off-by: Darren Hart <dvhart@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r--meta/classes/bootimg.bbclass45
1 files changed, 36 insertions, 9 deletions
diff --git a/meta/classes/bootimg.bbclass b/meta/classes/bootimg.bbclass
index bcae2aeab1..c2d43c86ee 100644
--- a/meta/classes/bootimg.bbclass
+++ b/meta/classes/bootimg.bbclass
@@ -62,19 +62,46 @@ build_boot_bin() {
62 62
63 install -m 444 ${STAGING_LIBDIR}/syslinux/ldlinux.sys ${HDDDIR}/ldlinux.sys 63 install -m 444 ${STAGING_LIBDIR}/syslinux/ldlinux.sys ${HDDDIR}/ldlinux.sys
64 64
65 # Determine the 1024 byte block count for the final image. 65 # Calculate the size required for the final image including the
66 BLOCKS=`du --apparent-size -ks ${HDDDIR} | cut -f 1` 66 # data and filesystem overhead.
67 SIZE=`expr $BLOCKS + ${BOOTIMG_EXTRA_SPACE}` 67 # Sectors: 512 bytes
68 # Blocks: 1024 bytes
69
70 # Determine the sector count just for the data
71 SECTORS=$(expr $(du --apparent-size -ks ${HDDDIR} | cut -f 1) \* 2)
72
73 # Account for the filesystem overhead. This includes directory
74 # entries in the clusters as well as the FAT itself.
75 # Assumptions:
76 # < 16 entries per directory
77 # 8.3 filenames only
78
79 # 32 bytes per dir entry
80 DIR_BYTES=$(expr $(find ${HDDDIR} | tail -n +2 | wc -l) \* 32)
81 # 32 bytes for every end-of-directory dir entry
82 DIR_BYTES=$(expr $DIR_BYTES + $(expr $(find ${HDDDIR} -type d | tail -n +2 | wc -l) \* 32))
83 # 4 bytes per FAT entry per sector of data
84 FAT_BYTES=$(expr $SECTORS \* 4)
85 # 4 bytes per FAT entry per end-of-cluster list
86 FAT_BYTES=$(expr $FAT_BYTES + $(expr $(find ${HDDDIR} -type d | tail -n +2 | wc -l) \* 4))
87
88 # Use a ceiling function to determine FS overhead in sectors
89 DIR_SECTORS=$(expr $(expr $DIR_BYTES + 511) / 512)
90 # There are two FATs on the image
91 FAT_SECTORS=$(expr $(expr $(expr $FAT_BYTES + 511) / 512) \* 2)
92 SECTORS=$(expr $SECTORS + $(expr $DIR_SECTORS + $FAT_SECTORS))
93
94 # Determine the final size in blocks accounting for some padding
95 BLOCKS=$(expr $(expr $SECTORS \* 2) + ${BOOTIMG_EXTRA_SPACE})
68 96
69 # Ensure total sectors is an integral number of sectors per 97 # Ensure total sectors is an integral number of sectors per
70 # track or mcopy will complain. Sectors are 512 bytes, and and 98 # track or mcopy will complain. Sectors are 512 bytes, and we
71 # we generate images with 32 sectors per track. This calculation 99 # generate images with 32 sectors per track. This calculation is
72 # is done in blocks, which are twice the size of sectors, thus 100 # done in blocks, thus the mod by 16 instead of 32.
73 # the 16 instead of 32. 101 BLOCKS=$(expr $BLOCKS + $(expr 16 - $(expr $BLOCKS % 16)))
74 SIZE=$(expr $SIZE + $(expr 16 - $(expr $SIZE % 16)))
75 102
76 IMG=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.hddimg 103 IMG=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.hddimg
77 mkdosfs -n ${BOOTIMG_VOLUME_ID} -S 512 -C ${IMG} ${SIZE} 104 mkdosfs -F 32 -n ${BOOTIMG_VOLUME_ID} -S 512 -C ${IMG} ${BLOCKS}
78 # Copy HDDDIR recursively into the image file directly 105 # Copy HDDDIR recursively into the image file directly
79 mcopy -i ${IMG} -s ${HDDDIR}/* ::/ 106 mcopy -i ${IMG} -s ${HDDDIR}/* ::/
80 107