Whamcloud - gitweb
LU-16971 ext2fs: make sure we have at least EXT2_FIRST_INO + 1 inodes 22/51722/2
authorLi Dongyang <dongyangli@ddn.com>
Thu, 20 Jul 2023 12:43:31 +0000 (22:43 +1000)
committerAndreas Dilger <adilger@whamcloud.com>
Mon, 7 Aug 2023 14:08:49 +0000 (14:08 +0000)
When creating a small fs with 100 1k blocks, mke2fs fails with:

Creating filesystem with 100 1k blocks and 8 inodes

Allocating group tables: done
Writing inode tables: done
ext2fs_mkdir: Could not allocate inode in ext2 filesystem while creating /lost+found

Increase s_inodes_per_group with a step of 8 to make
sure we have at least EXT2_FIRST_INO + 1 inodes.

Change-Id: I5ac30bdadf72e17780ebef93b2e81365a8a90641
Signed-off-by: Li Dongyang <dongyangli@ddn.com>
Reviewed-on: https://review.whamcloud.com/c/tools/e2fsprogs/+/51722
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
lib/ext2fs/initialize.c

index edd692b..e96f3ca 100644 (file)
@@ -308,13 +308,6 @@ retry:
                set_field(s_inodes_count, ext2fs_blocks_count(super) / i);
 
        /*
-        * Make sure we have at least EXT2_FIRST_INO + 1 inodes, so
-        * that we have enough inodes for the filesystem(!)
-        */
-       if (super->s_inodes_count < EXT2_FIRST_INODE(super)+1)
-               super->s_inodes_count = EXT2_FIRST_INODE(super)+1;
-
-       /*
         * There should be at least as many inodes as the user
         * requested.  Figure out how many inodes per group that
         * should be.  But make sure that we don't allocate more than
@@ -375,6 +368,15 @@ ipg_retry:
        }
        super->s_inodes_count = super->s_inodes_per_group *
                fs->group_desc_count;
+       /*
+        * Make sure we have at least EXT2_FIRST_INO + 1 inodes, so
+        * that we have enough inodes for the filesystem(!)
+        */
+       if (super->s_inodes_count < EXT2_FIRST_INODE(super)+1) {
+               ipg += 8;
+               goto ipg_retry;
+       }
+
        super->s_free_inodes_count = super->s_inodes_count;
 
        /*