struct problem_context pctx;
__u16 link_count;
__u32 link_counted;
+ __u32 many_subdirs = 0;
char *buf = 0;
int group, maxgroup;
e2fsck_write_inode(ctx, i, inode, "pass4");
}
}
+ if (link_count == 1 && link_counted > EXT2_LINK_MAX)
+ many_subdirs++;
}
+
+ if (many_subdirs) {
+ if (!(fs->super->s_feature_ro_compat &
+ EXT4_FEATURE_RO_COMPAT_DIR_NLINK) &&
+ fix_problem(ctx, PR_4_FEATURE_DIR_NLINK, &pctx)) {
+ fs->super->s_feature_ro_compat |=
+ EXT4_FEATURE_RO_COMPAT_DIR_NLINK;
+ ext2fs_mark_super_dirty(fs);
+ }
+ }
+
ext2fs_free_icount(ctx->inode_link_info); ctx->inode_link_info = 0;
ext2fs_free_icount(ctx->inode_count); ctx->inode_count = 0;
ext2fs_free_inode_bitmap(ctx->inode_bb_map);
"They @s the same!\n"),
PROMPT_NONE, 0 },
+ /* DIR_NLINK flag not set but dirs with > 65000 subdirs found */
+ { PR_4_FEATURE_DIR_NLINK,
+ N_("@f has @d with > 65000 subdirs, but no DIR_NLINK flag in @S.\n"),
+ PROMPT_FIX, 0 },
+
/* Pass 5 errors */
/* Pass 5: Checking group summary information */
EXT2_FEATURE_COMPAT_DIR_INDEX, /* Compat */
EXT2_FEATURE_INCOMPAT_FILETYPE, /* Incompat */
EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| /* R/O compat */
- EXT4_FEATURE_RO_COMPAT_GDT_CSUM
+ EXT4_FEATURE_RO_COMPAT_GDT_CSUM |
+ EXT4_FEATURE_RO_COMPAT_DIR_NLINK
};
/*
int sparse, old_sparse, filetype, old_filetype;
int journal, old_journal, dxdir, old_dxdir, uninit;
struct ext2_super_block *sb= fs->super;
+ int dir_nlink, old_dir_nlink;
__u32 old_compat, old_incompat, old_ro_compat, old_uninit;
old_compat = sb->s_feature_compat;
old_sparse = sb->s_feature_ro_compat &
EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER;
+ old_dir_nlink = sb->s_feature_ro_compat &
+ EXT4_FEATURE_RO_COMPAT_DIR_NLINK;
old_filetype = sb->s_feature_incompat &
EXT2_FEATURE_INCOMPAT_FILETYPE;
old_journal = sb->s_feature_compat &
}
sparse = sb->s_feature_ro_compat &
EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER;
+ dir_nlink = sb->s_feature_ro_compat &
+ EXT4_FEATURE_RO_COMPAT_DIR_NLINK;
filetype = sb->s_feature_incompat &
EXT2_FEATURE_INCOMPAT_FILETYPE;
journal = sb->s_feature_compat &