/* Protect loop from wrap-around if s_inodes_count maxed */
for (i=1; i <= fs->super->s_inodes_count && i > 0; i++) {
+ int isdir = ext2fs_test_inode_bitmap(ctx->inode_dir_map, i);
+
if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
goto errout;
if ((i % fs->super->s_inodes_per_group) == 0) {
ext2fs_icount_fetch(ctx->inode_count, i,
&link_counted);
}
- if (ext2fs_test_inode_bitmap(ctx->inode_dir_map, i) &&
- (link_counted > EXT2_LINK_MAX))
+ if (isdir && (link_counted > EXT2_LINK_MAX))
link_counted = 1;
if (link_counted != link_count) {
e2fsck_read_inode(ctx, i, inode, "pass4");
pctx.ino = i;
pctx.inode = inode;
- if (link_count != inode->i_links_count) {
+ if ((link_count != inode->i_links_count) && !isdir &&
+ (inode->i_links_count <= EXT2_LINK_MAX)) {
pctx.num = link_count;
fix_problem(ctx,
PR_4_INCONSISTENT_COUNT, &pctx);
pctx.num = link_counted;
/* i_link_count was previously exceeded, but no longer
* is, fix this but don't consider it an error */
- if ((LINUX_S_ISDIR(inode->i_mode) && link_counted > 1 &&
+ if ((isdir && link_counted > 1 &&
(inode->i_flags & EXT2_INDEX_FL) &&
link_count == 1 && !(ctx->options & E2F_OPT_NO)) ||
- (fix_problem(ctx, PR_4_BAD_REF_COUNT, &pctx))) {
+ fix_problem(ctx, PR_4_BAD_REF_COUNT, &pctx)) {
inode->i_links_count = link_counted;
e2fsck_write_inode(ctx, i, inode, "pass4");
}