Description: e2fsck reports "invalid unused inodes count"
Details : If a new ldiskfs filesystem is created with the "uninit_groups"
feature and only a single inode is created in a group then the
"bg_unused_inodes" count is incorrectly updated. Creating a
second inode in that group would update it correctly.
i=behlendorf
i=valerie
+ if (EXT3_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
+ if (gdp->bg_flags & cpu_to_le16(EXT3_BG_INODE_UNINIT)) {
+ gdp->bg_flags &= cpu_to_le16(~EXT3_BG_INODE_UNINIT);
+ if (EXT3_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
+ if (gdp->bg_flags & cpu_to_le16(EXT3_BG_INODE_UNINIT)) {
+ gdp->bg_flags &= cpu_to_le16(~EXT3_BG_INODE_UNINIT);
-+ free = EXT3_INODES_PER_GROUP(sb);
+ } else {
+ free = EXT3_INODES_PER_GROUP(sb) -
+ le16_to_cpu(gdp->bg_itable_unused);
+ } else {
+ free = EXT3_INODES_PER_GROUP(sb) -
+ le16_to_cpu(gdp->bg_itable_unused);
+ if (EXT3_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
+ if (gdp->bg_flags & cpu_to_le16(EXT3_BG_INODE_UNINIT)) {
+ gdp->bg_flags &= cpu_to_le16(~EXT3_BG_INODE_UNINIT);
+ if (EXT3_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
+ if (gdp->bg_flags & cpu_to_le16(EXT3_BG_INODE_UNINIT)) {
+ gdp->bg_flags &= cpu_to_le16(~EXT3_BG_INODE_UNINIT);
-+ free = EXT3_INODES_PER_GROUP(sb);
+ } else {
+ free = EXT3_INODES_PER_GROUP(sb) -
+ le16_to_cpu(gdp->bg_itable_unused);
+ } else {
+ free = EXT3_INODES_PER_GROUP(sb) -
+ le16_to_cpu(gdp->bg_itable_unused);
+ if (EXT3_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
+ if (gdp->bg_flags & cpu_to_le16(EXT3_BG_INODE_UNINIT)) {
+ gdp->bg_flags &= cpu_to_le16(~EXT3_BG_INODE_UNINIT);
+ if (EXT3_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
+ if (gdp->bg_flags & cpu_to_le16(EXT3_BG_INODE_UNINIT)) {
+ gdp->bg_flags &= cpu_to_le16(~EXT3_BG_INODE_UNINIT);
-+ free = EXT3_INODES_PER_GROUP(sb);
+ } else {
+ free = EXT3_INODES_PER_GROUP(sb) -
+ le16_to_cpu(gdp->bg_itable_unused);
+ } else {
+ free = EXT3_INODES_PER_GROUP(sb) -
+ le16_to_cpu(gdp->bg_itable_unused);
+ if (EXT3_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
+ if (gdp->bg_flags & cpu_to_le16(EXT3_BG_INODE_UNINIT)) {
+ gdp->bg_flags &= cpu_to_le16(~EXT3_BG_INODE_UNINIT);
+ if (EXT3_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
+ if (gdp->bg_flags & cpu_to_le16(EXT3_BG_INODE_UNINIT)) {
+ gdp->bg_flags &= cpu_to_le16(~EXT3_BG_INODE_UNINIT);
-+ free = EXT3_INODES_PER_GROUP(sb);
+ } else {
+ free = EXT3_INODES_PER_GROUP(sb) -
+ le16_to_cpu(gdp->bg_itable_unused);
+ } else {
+ free = EXT3_INODES_PER_GROUP(sb) -
+ le16_to_cpu(gdp->bg_itable_unused);