From eeea3ea6a88a8f1c7511abf0b429297a562e7d30 Mon Sep 17 00:00:00 2001 From: Peter Korsgaard Date: Thu, 30 Dec 2010 23:10:21 +0100 Subject: genext2fs.sh: improve number of blocks calculation Closes #2929 Instead of just adding a fixed amount to the blocks used, try to estimate the real space needed according to the filesystem structure (bitmaps, inodes, blocks). The side effect of this is that we no longer significantly overestimate the size needed for small file systems. Signed-off-by: Peter Korsgaard --- CHANGES | 1 + fs/ext2/genext2fs.sh | 25 +++++++++++-------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/CHANGES b/CHANGES index 4fef0eb1e..a67d1d142 100644 --- a/CHANGES +++ b/CHANGES @@ -24,6 +24,7 @@ #1735: [PATCH] mplayer: convert to autotools infrastructure #2371: QT MYSQL Module does not build when MySQL installed on the host #2905: Qt: Speed up compilation, if gui-module isn't selected + #2929: genext2fs: couldn't allocate a block (no free space) #2965: Broken linkage to xkbcomp (blocking X server startup) #2983: xlib_libX11 build failed diff --git a/fs/ext2/genext2fs.sh b/fs/ext2/genext2fs.sh index b315ec30a..7a518aea7 100755 --- a/fs/ext2/genext2fs.sh +++ b/fs/ext2/genext2fs.sh @@ -10,24 +10,11 @@ while getopts x:d:D:b:i:N:m:g:e:zfqUPhVv f do case $f in b) CALC_BLOCKS=0 ;; - N) CALC_INODES=0 ;; + N) CALC_INODES=0; INODES=$OPTARG ;; d) TARGET_DIR=$OPTARG ;; esac done -# calculate needed blocks -if [ $CALC_BLOCKS -eq 1 ]; -then - BLOCKS=$(du -s -c -k $TARGET_DIR | grep total | sed -e "s/total//") - if [ $BLOCKS -ge 20000 ]; - then - BLOCKS=$(expr $BLOCKS + 16384) - else - BLOCKS=$(expr $BLOCKS + 2400) - fi - set -- $@ -b $BLOCKS -fi - # calculate needed inodes if [ $CALC_INODES -eq 1 ]; then @@ -36,4 +23,14 @@ then set -- $@ -N $INODES fi +# calculate needed blocks +if [ $CALC_BLOCKS -eq 1 ]; +then + # size ~= superblock, block+inode bitmaps, inodes (8 per block), blocks + # we scale inodes / blocks with 10% to compensate for bitmaps size + slack + BLOCKS=$(du -s -c -k $TARGET_DIR | grep total | sed -e "s/total//") + BLOCKS=$(expr 500 + \( $BLOCKS + $INODES / 8 \) \* 11 / 10) + set -- $@ -b $BLOCKS +fi + exec genext2fs $@ -- cgit v1.2.3