aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAkira Fujita <a-fujita@rs.jp.nec.com>2012-08-30 20:16:01 +0900
committerTheodore Ts'o <tytso@mit.edu>2012-09-07 00:09:19 -0400
commit321649c9f491c2012f5e1a20337fd276bc5290f0 (patch)
tree61cef9847d0ce75c6db90757a8add03a3855af0a /lib
parent91d11da1430b801476f6d5f71ad8669b232731af (diff)
downloade2fsprogs-321649c9f491c2012f5e1a20337fd276bc5290f0.tar.gz
mke2fs: recalculate the reserved blocks when the last BG is dropped
mke2fs -m option can set reserved blocks ratio up to 50%. But if the last block group is not big enough to support the necessary data structures, it gets dropped, we have to recalculate the number of reserved blocks so that the reserved blocks matches the requested percentage. It also avoids a problem where if the user specifies a reserved blocks of 50%, and after the last partial block group was dropped, if the number of reserved blocks is greater than 50%, e2fsck will complain. Steps to reproduce: 1. Create a FS which has the overhead for the last BG and specify 50 % for reserved blocks ratio # mke2fs -m 50 -t ext4 DEV 1025M mke2fs 1.42.5 (29-Jul-2012) warning: 256 blocks unused. Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 656640 inodes, 2621440 blocks 1310848 blocks (50.00%) reserved for the super user ~~~~~~~ <-- Reserved blocks exceed 50% of FS blocks count! 2. e2fsck outputs filesystem corruption # e2fsck DEV e2fsck 1.42.5 (29-Jul-2012) Corruption found in superblock. (r_blocks_count = 1310848). The superblock could not be read or does not describe a correct ext2 filesystem. If the device is valid and it really contains an ext2 filesystem (and not swap or ufs or something else), then the superblock is corrupt, and you might try running e2fsck with an alternate superblock: e2fsck -b 32768 <device> Signed-off-by: Akira Fujita <a-fujita@rs.jp.ne.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'lib')
-rw-r--r--lib/ext2fs/initialize.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/ext2fs/initialize.c b/lib/ext2fs/initialize.c
index 5a6f8ea2..35677229 100644
--- a/lib/ext2fs/initialize.c
+++ b/lib/ext2fs/initialize.c
@@ -101,6 +101,7 @@ errcode_t ext2fs_initialize(const char *name, int flags,
unsigned reserved_inos;
char *buf = 0;
char c;
+ double reserved_ratio;
if (!param || !ext2fs_blocks_count(param))
return EXT2_ET_INVALID_ARGUMENT;
@@ -391,6 +392,14 @@ ipg_retry:
if (rem && (rem < overhead+50)) {
ext2fs_blocks_count_set(super, ext2fs_blocks_count(super) -
rem);
+ /*
+ * If blocks count is changed, we need to recalculate
+ * reserved blocks count not to exceed 50%.
+ */
+ reserved_ratio = 100.0 * ext2fs_r_blocks_count(param) /
+ ext2fs_blocks_count(param);
+ ext2fs_r_blocks_count_set(super, reserved_ratio *
+ ext2fs_blocks_count(super) / 100.0);
goto retry;
}