genext2fs.sh: improve number of blocks calculation
authorPeter Korsgaard <jacmet@sunsite.dk>
Thu, 30 Dec 2010 22:10:21 +0000 (23:10 +0100)
committerPeter Korsgaard <jacmet@sunsite.dk>
Thu, 30 Dec 2010 22:10:21 +0000 (23:10 +0100)
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 <jacmet@sunsite.dk>
CHANGES
fs/ext2/genext2fs.sh

diff --git a/CHANGES b/CHANGES
index 4fef0eb1e1ddb70c3f527cfb0248c300c82431fc..a67d1d142710844ef5ceb4571d42beea7ee7ab54 100644 (file)
--- 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
 
index b315ec30ac7f3b8459549aec27b4b4bdb0f91dcf..7a518aea745a61d7e4783591635132f33d1d51fb 100755 (executable)
@@ -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 $@