From e9b0ac5eb8f255383e825b16e17fcb9be1401505 Mon Sep 17 00:00:00 2001 From: Andreas Dilger Date: Fri, 13 Apr 2012 01:13:58 -0600 Subject: [PATCH] e2fsck: track errors/badness found for each inode The present e2fsck code checks the inode, per field basis. It doesn't take into consideration to total sanity of the inode. This may cause e2fsck turning a garbage inode into an apparently sane inode ("It is a vessel of fertilizer, and none may abide its strength"). Add heuristics into fix_problem() so that e2fsck tracks the degree of badness of an inode, without needing to be added in many places in code and explicitly set. An icount is used to keep track the badness of every inode. Take advantage of pctx->ino almost always pointing at the bad inode and increment badness when fix_problem() is called on an inode. This also handles future problem addition. That leaves only a handful of places in the code that need special handling to either set a higher badness (e.g. inode blocks that are directly referencing filesystem metadata or have wildly incorrect timestamps), or should not contribute to inode badness at all. Badness above a certain threshold value results in clearing the inode. The default badness threshold value is 12, it can be tuned for e2fsck using "-E inode_badness_threshold=" if needed. When multiply-claimed blocks are found, this is often caused by a corrupted inode or indirect block that causes a bad inode to overlap with many good inodes. This problem is made worse when running on a large filesystem (16TB or more) because random 32-bit numbers in the inode->i_blocks[] array are always "valid" block numbers (with smaller filesystems the random block numbers would be detected as an error). Garbage triple/double/indirect blocks will also point to random "valid" blocks that will themselves contain random 32-bit block numbers and multiply duplicate blocks count exponentially. Rather than clone all of those blocks, or possibly deleting/zeroing all such inodes (as done with "-E shared=delete") it would be better to find the "bad" inode(s) causing the most problems, and clear only those inodes, rather than clearing all of inodes with shared blocks. However, care should be taken to avoid spuriously clearing inodes that only share blocks with a small number of peers, as it is difficult to know for sure in this case which inode is the bad one. An added difficulty in implementing this is that the full list of inodes sharing a given block is only available in pass1d, at which point it is already starting to clone the shared blocks. Some checks could be done in pass1b, by penalizing inodes wiht the most shared *blocks*, but it is better to count the shared *inodes*. If a bad inode is found in pass1b it can be cleared before adding it to the shared cluster/inode dictionaries. Otherwise, if found in pass1d the code to remove inodes/cluster dict_delete_free() code is non-functional. For now, restart e2fsck pass1 if very bad inodes are found. This will not affect already-processed inodes, and should reduce the number of duplicate blocks significantly. Add a new f_ibadness_dup test case for a many-conflicting inode. Update f_ind_inode_collision, which is a many-blocks conflicting case that is much better handled by this new mechanism. Signed-off-by: Girish Shilamkar Change-Id: I9f5f48d979afebb9c953d9fb2777ebf570f30c15 Signed-off-by: Andreas Dilger --- e2fsck/e2fsck.8.in | 10 ++ e2fsck/e2fsck.c | 8 +- e2fsck/e2fsck.h | 27 ++++- e2fsck/pass1.c | 216 ++++++++++++++++++++++++++-------- e2fsck/pass1b.c | 38 ++++-- e2fsck/pass2.c | 102 ++++++++++------ e2fsck/pass3.c | 2 +- e2fsck/problem.c | 34 +++++- e2fsck/problem.h | 25 +++- e2fsck/super.c | 8 +- e2fsck/unix.c | 18 +++ lib/ext2fs/ext2fs.h | 1 + lib/ext2fs/icount.c | 20 +++- tests/f_ibadness/expect.1 | 60 ++++++++++ tests/f_ibadness/expect.2 | 7 ++ tests/f_ibadness/image.gz | Bin 0 -> 41023 bytes tests/f_ibadness/name | 1 + tests/f_ibadness/script | 4 + tests/f_ibadness_bad_extents/expect.1 | 74 ++++++++++++ tests/f_ibadness_bad_extents/expect.2 | 7 ++ tests/f_ibadness_bad_extents/image.gz | Bin 0 -> 91025 bytes tests/f_ibadness_bad_extents/name | 1 + tests/f_ibadness_bad_extents/script | 4 + tests/f_ibadness_dup/expect.1 | 125 ++++++++++++++++++++ tests/f_ibadness_dup/expect.2 | 7 ++ tests/f_ibadness_dup/name | 2 + tests/f_ibadness_dup/script | 76 ++++++++++++ tests/f_ind_inode_collision/expect.1 | 78 +----------- tests/f_ind_inode_collision/expect.2 | 2 +- tests/f_messy_inode/expect.1 | 10 +- tests/f_messy_inode/expect.2 | 2 +- tests/f_messy_inode/script | 5 + tests/filter.sed | 1 + 33 files changed, 782 insertions(+), 193 deletions(-) create mode 100644 tests/f_ibadness/expect.1 create mode 100644 tests/f_ibadness/expect.2 create mode 100644 tests/f_ibadness/image.gz create mode 100644 tests/f_ibadness/name create mode 100644 tests/f_ibadness/script create mode 100644 tests/f_ibadness_bad_extents/expect.1 create mode 100644 tests/f_ibadness_bad_extents/expect.2 create mode 100644 tests/f_ibadness_bad_extents/image.gz create mode 100644 tests/f_ibadness_bad_extents/name create mode 100644 tests/f_ibadness_bad_extents/script create mode 100644 tests/f_ibadness_dup/expect.1 create mode 100644 tests/f_ibadness_dup/expect.2 create mode 100644 tests/f_ibadness_dup/name create mode 100644 tests/f_ibadness_dup/script create mode 100644 tests/f_messy_inode/script diff --git a/e2fsck/e2fsck.8.in b/e2fsck/e2fsck.8.in index 42df117..b5959ad 100644 --- a/e2fsck/e2fsck.8.in +++ b/e2fsck/e2fsck.8.in @@ -221,6 +221,16 @@ be 1 or 2. The default extended attribute version format is 2. Only replay the journal if required, but do not perform any further checks or repairs. .TP +.BI inode_badness_threshold= threshold_value +A badness counter is associated with every inode, which determines the degree +of inode corruption. Each error found in the inode will increase the badness +by 1 or 2, and inodes with a badness at or above +.I threshold_value +will be prompted for deletion. The default +.I threshold_value +is 12, and must either be 0 (disabled), or between 3 and 200, as some valid +inode states may set a badness of 1 or 2 that should not clear the inode. +.TP .BI fragcheck During pass 1, print a detailed report of any discontiguous blocks for files in the file system. diff --git a/e2fsck/e2fsck.c b/e2fsck/e2fsck.c index b79c600..14fd2bb 100644 --- a/e2fsck/e2fsck.c +++ b/e2fsck/e2fsck.c @@ -87,6 +87,10 @@ errcode_t e2fsck_reset_context(e2fsck_t ctx) ext2fs_free_icount(ctx->inode_link_info); ctx->inode_link_info = 0; } + if (ctx->inode_badness) { + ext2fs_free_icount(ctx->inode_badness); + ctx->inode_badness = 0; + } if (ctx->journal_io) { if (ctx->fs && ctx->fs->io != ctx->journal_io) io_channel_close(ctx->journal_io); @@ -138,10 +142,6 @@ errcode_t e2fsck_reset_context(e2fsck_t ctx) ext2fs_free_inode_bitmap(ctx->inode_bb_map); ctx->inode_bb_map = 0; } - if (ctx->inode_bad_map) { - ext2fs_free_inode_bitmap(ctx->inode_bad_map); - ctx->inode_bad_map = 0; - } if (ctx->inode_imagic_map) { ext2fs_free_inode_bitmap(ctx->inode_imagic_map); ctx->inode_imagic_map = 0; diff --git a/e2fsck/e2fsck.h b/e2fsck/e2fsck.h index 72c3eda..40fa4d2 100644 --- a/e2fsck/e2fsck.h +++ b/e2fsck/e2fsck.h @@ -11,6 +11,7 @@ #include #include +#include #ifdef HAVE_UNISTD_H #include #endif @@ -237,6 +238,21 @@ enum clone_opt { E2F_CLONE_ZERO }; +#define EXT4_FITS_IN_INODE(ext4_inode, einode, field) \ + ((offsetof(typeof(*ext4_inode), field) + \ + sizeof(ext4_inode->field)) <= \ + (EXT2_GOOD_OLD_INODE_SIZE + \ + (einode)->i_extra_isize)) \ + +#define EXT4_XTIME_FUTURE(ctx, sb, xtime, margin) \ + (!((ctx)->flags & E2F_FLAG_TIME_INSANE) && \ + (xtime) > (ctx)->now + (margin)) +#define EXT4_XTIME_ANCIENT(ctx, sb, xtime, margin) \ + ((sb)->s_mkfs_time > (margin) && (xtime) < (sb)->s_mkfs_time - (margin)) + +#define BADNESS_THRESHOLD 12 +#define BADNESS_MAX 0x7fff + /* * Define the extended attribute refcount structure */ @@ -331,7 +347,6 @@ struct e2fsck_struct { /* The following inode bitmaps are separately used in thread_ctx Pass1*/ ext2fs_inode_bitmap inode_used_map; /* Inodes which are in use */ - ext2fs_inode_bitmap inode_bad_map; /* Inodes which are bad somehow */ ext2fs_inode_bitmap inode_dir_map; /* Inodes which are directories */ ext2fs_inode_bitmap inode_bb_map; /* Inodes which are in bad blocks */ ext2fs_inode_bitmap inode_imagic_map; /* AFS inodes */ @@ -349,6 +364,8 @@ struct e2fsck_struct { */ ext2_icount_t inode_count; ext2_icount_t inode_link_info; + ext2_icount_t inode_badness; + unsigned int inode_badness_threshold; ext2_refcount_t refcount; ext2_refcount_t refcount_extra; @@ -708,6 +725,14 @@ extern int e2fsck_pass1_check_symlink(ext2_filsys fs, ext2_ino_t ino, extern void e2fsck_clear_inode(e2fsck_t ctx, ext2_ino_t ino, struct ext2_inode *inode, int restart_flag, const char *source); +#define e2fsck_mark_inode_bad(ctx, pctx, code) \ + e2fsck_mark_inode_bad_loc(ctx, pctx, code, 1, __func__, __LINE__) +#define e2fsck_mark_inode_badder(ctx, pctx, code) \ + e2fsck_mark_inode_bad_loc(ctx, pctx, code, 2, __func__, __LINE__) +extern void e2fsck_mark_inode_bad_loc(e2fsck_t ctx, + struct problem_context *pctx, __u32 code, + int count, const char *func, const int line); +extern int e2fsck_fix_bad_inode(e2fsck_t ctx, struct problem_context *pctx); extern void e2fsck_intercept_block_allocations(e2fsck_t ctx); /* pass2.c */ diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c index 329f1ab..5ef3ed9 100644 --- a/e2fsck/pass1.c +++ b/e2fsck/pass1.c @@ -20,7 +20,8 @@ * - A bitmap of which inodes are in use. (inode_used_map) * - A bitmap of which inodes are directories. (inode_dir_map) * - A bitmap of which inodes are regular files. (inode_reg_map) - * - A bitmap of which inodes have bad fields. (inode_bad_map) + * - An icount mechanism is used to keep track of + * inodes with bad fields and its badness (ctx->inode_badness) * - A bitmap of which inodes are in bad blocks. (inode_bb_map) * - A bitmap of which inodes are imagic inodes. (inode_imagic_map) * - A bitmap of which inodes are casefolded. (inode_casefold_map) @@ -86,7 +87,6 @@ static void check_blocks(e2fsck_t ctx, struct problem_context *pctx, static void mark_table_blocks(e2fsck_t ctx); static void alloc_bb_map(e2fsck_t ctx); static void alloc_imagic_map(e2fsck_t ctx); -static void mark_inode_bad(e2fsck_t ctx, ino_t ino); static void add_casefolded_dir(e2fsck_t ctx, ino_t ino); static void handle_fs_bad_blocks(e2fsck_t ctx); static EXT2_QSORT_TYPE process_inode_cmp(const void *a, const void *b); @@ -578,7 +578,7 @@ static void check_inode_extra_space(e2fsck_t ctx, struct problem_context *pctx, struct ext2_super_block *sb = ctx->fs->super; struct ext2_inode_large *inode; __u32 *eamagic; - int min, max; + int min, max, dirty = 0; ea_ibody_quota->blocks = 0; ea_ibody_quota->inodes = 0; @@ -609,8 +609,9 @@ static void check_inode_extra_space(e2fsck_t ctx, struct problem_context *pctx, inode->i_extra_isize = ctx->want_extra_isize; else inode->i_extra_isize = (inode->i_extra_isize + 3) & ~3; - e2fsck_write_inode_full(ctx, pctx->ino, pctx->inode, - EXT2_INODE_SIZE(sb), "pass1"); + dirty = 1; + + goto out; } /* check if there is no place for an EA header */ @@ -625,10 +626,7 @@ static void check_inode_extra_space(e2fsck_t ctx, struct problem_context *pctx, memset((char *)inode + EXT2_GOOD_OLD_INODE_SIZE, 0, EXT2_INODE_SIZE(sb) - EXT2_GOOD_OLD_INODE_SIZE); inode->i_extra_isize = ctx->want_extra_isize; - e2fsck_write_inode_full(ctx, pctx->ino, - (struct ext2_inode *)inode, - EXT2_INODE_SIZE(sb), - "check_inode_extra_space"); + dirty = 1; if (inode->i_extra_isize < ctx->min_extra_isize) ctx->min_extra_isize = inode->i_extra_isize; } @@ -636,6 +634,12 @@ static void check_inode_extra_space(e2fsck_t ctx, struct problem_context *pctx, if (*eamagic == EXT2_EXT_ATTR_MAGIC) check_ea_in_inode(ctx, pctx, ea_ibody_quota); + /* Since crtime cannot be set directly from userspace, consider + * very old/future values worse than a bad atime/mtime. */ + if (EXT4_XTIME_FUTURE(ctx, sb, inode->i_crtime, ctx->time_fudge)) + e2fsck_mark_inode_badder(ctx, pctx, PR_1_CRTIME_BAD); + else if (EXT4_XTIME_ANCIENT(ctx, sb, inode->i_crtime, ctx->time_fudge)) + e2fsck_mark_inode_badder(ctx, pctx, PR_1_CRTIME_BAD); /* * If the inode's extended atime (ctime, crtime, mtime) is stored in * the old, invalid format, repair it. @@ -648,7 +652,7 @@ static void check_inode_extra_space(e2fsck_t ctx, struct problem_context *pctx, CHECK_INODE_EXTRA_NEGATIVE_EPOCH(inode, crtime) || CHECK_INODE_EXTRA_NEGATIVE_EPOCH(inode, mtime))) { - if (!fix_problem(ctx, PR_1_EA_TIME_OUT_OF_RANGE, pctx)) + if (!fix_problem_bad(ctx, PR_1_EA_TIME_OUT_OF_RANGE, pctx, 2)) return; if (CHECK_INODE_EXTRA_NEGATIVE_EPOCH(inode, atime)) @@ -659,10 +663,13 @@ static void check_inode_extra_space(e2fsck_t ctx, struct problem_context *pctx, inode->i_crtime_extra &= ~EXT4_EPOCH_MASK; if (CHECK_INODE_EXTRA_NEGATIVE_EPOCH(inode, mtime)) inode->i_mtime_extra &= ~EXT4_EPOCH_MASK; - e2fsck_write_inode_full(ctx, pctx->ino, pctx->inode, - EXT2_INODE_SIZE(sb), "pass1"); + dirty = 1; } +out: + if (dirty) + e2fsck_write_inode_full(ctx, pctx->ino, pctx->inode, + EXT2_INODE_SIZE(sb), "pass1"); } static _INLINE_ int is_blocks_used(e2fsck_t ctx, blk64_t block, @@ -1130,6 +1137,28 @@ err: return retval; } +int e2fsck_fix_bad_inode(e2fsck_t ctx, struct problem_context *pctx) +{ + __u16 badness; + int rc = 0; + + if (!ctx->inode_badness) + return 0; + + if (ext2fs_icount_fetch(ctx->inode_badness, pctx->ino, &badness)) + return 0; + + if (badness > ctx->inode_badness_threshold) { + __u64 pctx_num_sav = pctx->num; + + pctx->num = badness; + rc = fix_problem_notbad(ctx, PR_1B_INODE_TOOBAD, pctx); + pctx->num = pctx_num_sav; + } + + return rc; +} + static void finish_processing_inode(e2fsck_t ctx, ext2_ino_t ino, struct problem_context *pctx, int failed_csum) @@ -1149,7 +1178,7 @@ static void finish_processing_inode(e2fsck_t ctx, ext2_ino_t ino, #define FINISH_INODE_LOOP(ctx, ino, pctx, failed_csum) \ do { \ finish_processing_inode((ctx), (ino), (pctx), (failed_csum)); \ - if ((ctx)->flags & E2F_FLAG_ABORT) { \ + if (e2fsck_should_abort(ctx)) { \ e2fsck_pass1_check_unlock(ctx); \ return; \ } \ @@ -1637,6 +1666,23 @@ static void e2fsck_pass1_post(e2fsck_t ctx) } +/* + * Lustre FS creates special inodes - precreated objects. + * They are zero-sized and have special attributes: + * mode |= S_ISUID | S_ISGID; + * valid |= LA_ATIME | LA_MTIME | LA_CTIME; + * atime = 0; + * mtime = 0; + * ctime = 0; + */ +static int precreated_object(struct ext2_inode *inode) +{ + if (((inode->i_mode & (S_ISUID | S_ISGID)) == (S_ISUID | S_ISGID)) && + inode->i_ctime == 0) + return 1; + return 0; +} + void e2fsck_pass1_run(e2fsck_t ctx) { int i; @@ -1814,9 +1860,8 @@ void e2fsck_pass1_run(e2fsck_t ctx) if (ctx->global_ctx) { if (ctx->options & E2F_OPT_DEBUG && ctx->options & E2F_OPT_MULTITHREAD) - fprintf(stderr, "thread %d jumping to group %u\n", - ctx->thread_info.et_thread_index, - ctx->thread_info.et_group_start); + log_out(ctx, "jumping to group %u\n", + ctx->thread_info.et_group_start); pctx.errcode = ext2fs_inode_scan_goto_blockgroup(scan, ctx->thread_info.et_group_start); if (pctx.errcode) { @@ -2169,6 +2214,12 @@ void e2fsck_pass1_run(e2fsck_t ctx) #endif e2fsck_write_inode(ctx, ino, inode, "pass1"); failed_csum = 0; + } else { + /* Consider an inode in extent fs w/o extents + * at least a bit suspect. It only matters if + * the inode has several other problems. */ + e2fsck_mark_inode_bad(ctx, &pctx, + PR_1_UNSET_EXTENT_FL); } } @@ -2371,18 +2422,21 @@ void e2fsck_pass1_run(e2fsck_t ctx) frag = fsize = 0; } + /* Fixed in pass2, e2fsck_process_bad_inode(). */ if (inode->i_faddr || frag || fsize || (!ext2fs_has_feature_largedir(fs->super) && - (LINUX_S_ISDIR(inode->i_mode) && inode->i_size_high))) - mark_inode_bad(ctx, ino); + LINUX_S_ISDIR(inode->i_mode) && inode->i_size_high)) + e2fsck_mark_inode_bad(ctx, &pctx, + PR_2_DIR_SIZE_HIGH_ZERO); if ((fs->super->s_creator_os != EXT2_OS_HURD) && !ext2fs_has_feature_64bit(fs->super) && inode->osd2.linux2.l_i_file_acl_high != 0) - mark_inode_bad(ctx, ino); + e2fsck_mark_inode_bad(ctx, &pctx, + PR_2_I_FILE_ACL_HI_ZERO); if ((fs->super->s_creator_os != EXT2_OS_HURD) && !ext2fs_has_feature_huge_file(fs->super) && (inode->osd2.linux2.l_i_blocks_hi != 0)) - mark_inode_bad(ctx, ino); + e2fsck_mark_inode_bad(ctx, &pctx, PR_2_BLOCKS_HI_ZERO); if (inode->i_flags & EXT2_IMAGIC_FL) { if (imagic_fs) { if (!ctx->inode_imagic_map) @@ -2473,8 +2527,37 @@ void e2fsck_pass1_run(e2fsck_t ctx) check_immutable(ctx, &pctx); check_size(ctx, &pctx); ctx->fs_sockets_count++; - } else - mark_inode_bad(ctx, ino); + } else { + e2fsck_mark_inode_bad(ctx, &pctx, PR_2_BAD_MODE); + } + + /* Future atime/mtime may be valid in rare cases, but are more + * likely to indicate corruption. Don't try to fix timestamps, + * but take into consideration whether inode is corrupted. If + * no other problems with the inode, probably it is OK. */ + if (EXT4_XTIME_FUTURE(ctx, sb, inode->i_atime, ctx->time_fudge)) + e2fsck_mark_inode_bad(ctx, &pctx, PR_1_INODE_BAD_TIME); + if (EXT4_XTIME_FUTURE(ctx, sb, inode->i_mtime, ctx->time_fudge)) + e2fsck_mark_inode_bad(ctx, &pctx, PR_1_INODE_BAD_TIME); + + /* Since ctime cannot be set directly from userspace, consider + * very old/future values worse than a bad atime/mtime. Same for + * crtime, but it is checked in check_inode_extra_space(). */ + if (EXT4_XTIME_FUTURE(ctx, sb, inode->i_ctime, ctx->time_fudge)) + e2fsck_mark_inode_badder(ctx, &pctx, + PR_1_INODE_BAD_TIME); + else if (!precreated_object(inode) && + EXT4_XTIME_ANCIENT(ctx, sb, inode->i_ctime, + ctx->time_fudge)) + e2fsck_mark_inode_badder(ctx, &pctx, + PR_1_INODE_BAD_TIME); + + /* no restart if clearing bad inode before block processing */ + if (e2fsck_fix_bad_inode(ctx, &pctx)) { + e2fsck_clear_inode(ctx, ino, inode, 0, "pass1"); + goto next_unlock; + } + if (!(inode->i_flags & EXT4_EXTENTS_FL) && !(inode->i_flags & EXT4_INLINE_DATA_FL)) { if (inode->i_block[EXT2_IND_BLOCK]) @@ -2535,6 +2618,7 @@ void e2fsck_pass1_run(e2fsck_t ctx) goto endit; } } + next_unlock: e2fsck_pass1_check_unlock(ctx); } process_inodes(ctx, block_buf, inodes_to_process, @@ -2892,6 +2976,7 @@ static errcode_t e2fsck_pass1_thread_prepare(e2fsck_t global_ctx, e2fsck_t *thre thread_context->block_dup_map = NULL; thread_context->casefolded_dirs = NULL; thread_context->expand_eisize_map = NULL; + thread_context->inode_badness = NULL; retval = e2fsck_allocate_block_bitmap(global_ctx->fs, _("in-use block map"), EXT2FS_BMAP64_RBTREE, @@ -3011,6 +3096,11 @@ static errcode_t e2fsck_pass1_merge_icounts(e2fsck_t global_ctx, e2fsck_t thread return ret; ret = e2fsck_pass1_merge_icount(&global_ctx->inode_link_info, &thread_ctx->inode_link_info); + if (ret) + return ret; + + ret = e2fsck_pass1_merge_icount(&global_ctx->inode_badness, + &thread_ctx->inode_badness); return ret; } @@ -3286,11 +3376,6 @@ static errcode_t e2fsck_pass1_merge_context(e2fsck_t global_ctx, return retval; retval = e2fsck_pass1_merge_bitmap(global_fs, - &thread_ctx->inode_bad_map, - &global_ctx->inode_bad_map); - if (retval) - return retval; - retval = e2fsck_pass1_merge_bitmap(global_fs, &thread_ctx->inode_dir_map, &global_ctx->inode_dir_map); if (retval) @@ -3755,27 +3840,43 @@ static EXT2_QSORT_TYPE process_inode_cmp(const void *a, const void *b) } /* - * Mark an inode as being bad in some what + * Mark an inode as being bad and increment its badness counter. */ -static void mark_inode_bad(e2fsck_t ctx, ino_t ino) +void e2fsck_mark_inode_bad_loc(e2fsck_t ctx, struct problem_context *pctx, + __u32 code, int badness, const char *func, + const int line) { - struct problem_context pctx; + __u16 badness_before, badness_after; - if (!ctx->inode_bad_map) { - clear_problem_context(&pctx); + if (!ctx->inode_badness_threshold) /* badness is disabled */ + return; - pctx.errcode = e2fsck_allocate_inode_bitmap(ctx->fs, - _("bad inode map"), EXT2FS_BMAP64_RBTREE, - "inode_bad_map", &ctx->inode_bad_map); - if (pctx.errcode) { - pctx.num = 3; - fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx); - /* Should never get here */ + if (!ctx->inode_badness) { + errcode_t retval; + + retval = ext2fs_create_icount2(ctx->fs, 0, 0, NULL, + &ctx->inode_badness); + if (retval) { + pctx->errcode = retval; + fix_problem(ctx, PR_1_ALLOCATE_ICOUNT, pctx); ctx->flags |= E2F_FLAG_ABORT; return; } } - ext2fs_mark_inode_bitmap2(ctx->inode_bad_map, ino); + ext2fs_icount_fetch(ctx->inode_badness, pctx->ino, &badness_before); + if (badness + badness_before > BADNESS_MAX) + badness_after = BADNESS_MAX; + else if (badness < 0 && badness_before < -badness) + badness_after = 0; + else + badness_after = badness_before + badness; + ext2fs_icount_store(ctx->inode_badness, pctx->ino, badness_after); + + if (ctx->options & E2F_OPT_DEBUG) + log_out(ctx, + "%s:%d: increase inode %lu badness %u to %u for %x\n", + func, line, (unsigned long)pctx->ino, badness_before, + badness_after, code); } static void add_casefolded_dir(e2fsck_t ctx, ino_t ino) @@ -3982,7 +4083,8 @@ static int check_ext_attr(e2fsck_t ctx, struct problem_context *pctx, if (!ext2fs_has_feature_xattr(fs->super) || (blk < fs->super->s_first_data_block) || (blk >= ext2fs_blocks_count(fs->super))) { - mark_inode_bad(ctx, ino); + /* Fixed in pass2, e2fsck_process_bad_inode(). */ + e2fsck_mark_inode_bad(ctx, pctx, PR_2_FILE_ACL_ZERO); return 0; } @@ -4263,8 +4365,10 @@ static int handle_htree(e2fsck_t ctx, struct problem_context *pctx, } retval = io_channel_read_blk64(fs->io, blk, 1, block_buf); - if (retval && fix_problem(ctx, PR_1_HTREE_BADROOT, pctx)) - return 1; + if (retval) { + if (fix_problem(ctx, PR_1_HTREE_BADROOT, pctx)) + return 1; + } /* XXX should check that beginning matches a directory */ root = (struct ext2_dx_root_info *) (block_buf + 24); @@ -4346,8 +4450,8 @@ void e2fsck_clear_inode(e2fsck_t ctx, ext2_ino_t ino, ext2fs_unmark_inode_bitmap2(ctx->inode_used_map, ino); if (ctx->inode_reg_map) ext2fs_unmark_inode_bitmap2(ctx->inode_reg_map, ino); - if (ctx->inode_bad_map) - ext2fs_unmark_inode_bitmap2(ctx->inode_bad_map, ino); + if (ctx->inode_badness) + ext2fs_icount_store(ctx->inode_badness, ino, 0); /* * If the inode was partially accounted for before processing @@ -4520,7 +4624,9 @@ static void scan_extent_node(e2fsck_t ctx, struct problem_context *pctx, #endif if (try_repairs && problem) { report_problem: - if (fix_problem(ctx, problem, pctx)) { + /* Record badness only if extent is within inode */ + if (fix_problem_bad(ctx, problem, pctx, + info.curr_level == 0)) { if (ctx->invalid_bitmaps) { /* * If fsck knows the bitmaps are bad, @@ -4589,9 +4695,9 @@ report_problem: extent.e_pblk)) { next_try_repairs = 0; pctx->blk = blk; - fix_problem(ctx, - PR_1_CRITICAL_METADATA_COLLISION, - pctx); + fix_problem_bad(ctx, + PR_1_CRITICAL_METADATA_COLLISION, + pctx, 2); if ((ctx->options & E2F_OPT_NO) == 0) ctx->flags |= E2F_FLAG_RESTART_LATER; } @@ -5068,6 +5174,10 @@ static void check_blocks(e2fsck_t ctx, struct problem_context *pctx, if (!pb.num_blocks && pb.is_dir && !(inode->i_flags & EXT4_INLINE_DATA_FL)) { + /* + * The mode might be in-correct. Increasing the badness by + * small amount won't hurt much. + */ if (fix_problem(ctx, PR_1_ZERO_LENGTH_DIR, pctx)) { e2fsck_clear_inode(ctx, ino, inode, 0, "check_blocks"); ctx->fs_directory_count--; @@ -5200,7 +5310,11 @@ static void check_blocks(e2fsck_t ctx, struct problem_context *pctx, e2fsck_rehash_dir_later(ctx, ino); out: - if (dirty_inode) + /* need restart if clearing bad inode after block processing */ + if (e2fsck_fix_bad_inode(ctx, pctx)) + e2fsck_clear_inode(ctx, ino, inode, E2F_FLAG_RESTART, + "check_blocks_bad"); + else if (dirty_inode) e2fsck_write_inode(ctx, ino, inode, "check_blocks"); } @@ -5352,7 +5466,7 @@ static int process_block(ext2_filsys fs, blk < ctx->fs->super->s_blocks_count && ext2fs_test_block_bitmap2(ctx->block_metadata_map, blk)) { pctx->blk = blk; - fix_problem(ctx, PR_1_CRITICAL_METADATA_COLLISION, pctx); + fix_problem_bad(ctx, PR_1_CRITICAL_METADATA_COLLISION, pctx, 2); if ((ctx->options & E2F_OPT_NO) == 0) ctx->flags |= E2F_FLAG_RESTART_LATER; } diff --git a/e2fsck/pass1b.c b/e2fsck/pass1b.c index b0a585f..92c7185 100644 --- a/e2fsck/pass1b.c +++ b/e2fsck/pass1b.c @@ -78,7 +78,7 @@ struct dup_cluster { */ struct dup_inode { ext2_ino_t dir; - int num_dupblocks; + unsigned int num_dupblocks; struct ext2_inode_large inode; struct cluster_el *cluster_list; }; @@ -237,6 +237,8 @@ void e2fsck_pass1_dupblocks(e2fsck_t ctx, char *block_buf) init_resource_track(&rtrack, ctx->fs->io); pass1b(ctx, block_buf); print_resource_track(ctx, "Pass 1b", &rtrack, ctx->fs->io); + if (ctx->flags & E2F_FLAG_RESTART) + goto out; init_resource_track(&rtrack, ctx->fs->io); pass1c(ctx, block_buf); @@ -245,6 +247,8 @@ void e2fsck_pass1_dupblocks(e2fsck_t ctx, char *block_buf) init_resource_track(&rtrack, ctx->fs->io); pass1d(ctx, block_buf); print_resource_track(ctx, "Pass 1d", &rtrack, ctx->fs->io); + if (ctx->flags & E2F_FLAG_RESTART) + goto out; if (ext2fs_has_feature_shared_blocks(ctx->fs->super) && (ctx->options & E2F_OPT_UNSHARE_BLOCKS)) { @@ -264,6 +268,7 @@ void e2fsck_pass1_dupblocks(e2fsck_t ctx, char *block_buf) } } +out: /* * Time to free all of the accumulated data structures that we * don't need anymore. @@ -341,6 +346,14 @@ static void pass1b(e2fsck_t ctx, char *block_buf) pb.last_blk = 0; pb.pctx->blk = pb.pctx->blk2 = 0; + if (e2fsck_fix_bad_inode(ctx, &pctx)) { + struct dup_inode dp = { .inode = inode }; + + /* no restart if cleared before block processing */ + delete_file(ctx, ino, &dp, block_buf); + continue; + } + if (ext2fs_inode_has_valid_blocks2(fs, EXT2_INODE(&inode)) || (ino == EXT2_BAD_INO)) pctx.errcode = ext2fs_block_iterate3(fs, ino, @@ -358,7 +371,7 @@ static void pass1b(e2fsck_t ctx, char *block_buf) if (ino != EXT2_BAD_INO) { op = pctx.blk == pctx.blk2 ? PR_1B_DUP_BLOCK : PR_1B_DUP_RANGE; - fix_problem(ctx, op, pb.pctx); + fix_problem_notbad(ctx, op, pb.pctx); } end_problem_latch(ctx, PR_LATCH_DBLOCK); if (ino >= EXT2_FIRST_INODE(fs->super) || @@ -367,6 +380,12 @@ static void pass1b(e2fsck_t ctx, char *block_buf) } if (pctx.errcode) fix_problem(ctx, PR_1B_BLOCK_ITERATE, &pctx); + + if (e2fsck_fix_bad_inode(ctx, &pctx)) { + e2fsck_clear_inode(ctx, ino, EXT2_INODE(&inode), + E2F_FLAG_RESTART, "pass1b"); + continue; + } } ext2fs_close_inode_scan(scan); e2fsck_use_inode_shortcuts(ctx, 0); @@ -401,7 +420,8 @@ static int process_pass1b_block(ext2_filsys fs EXT2FS_ATTR((unused)), op = p->pctx->blk == p->pctx->blk2 ? PR_1B_DUP_BLOCK : PR_1B_DUP_RANGE; - fix_problem(ctx, op, p->pctx); + /* add badness once per indirect block */ + fix_problem_bad(ctx, op, p->pctx, blockcnt < 0); } p->pctx->blk = *block_nr; } @@ -595,18 +615,24 @@ static void pass1d(e2fsck_t ctx, char *block_buf) pctx.ino = shared[i]; pctx.dir = t->dir; fix_problem(ctx, PR_1D_DUP_FILE_LIST, &pctx); + if (e2fsck_fix_bad_inode(ctx, &pctx)) { + e2fsck_clear_inode(ctx, pctx.ino, pctx.inode, + E2F_FLAG_RESTART, "pass1d"); + return; + } } /* * Even if the file shares blocks with itself, we still need to * clone the blocks. */ + pctx.ino = ino; if (file_ok && (meta_data ? shared_len+1 : shared_len) != 0) { - fix_problem(ctx, PR_1D_DUP_BLOCKS_DEALT, &pctx); + fix_problem_notbad(ctx, PR_1D_DUP_BLOCKS_DEALT, &pctx); continue; } if (ctx->shared != E2F_SHARED_DELETE && ((ctx->options & E2F_OPT_UNSHARE_BLOCKS) || - fix_problem(ctx, PR_1D_CLONE_QUESTION, &pctx))) { + fix_problem_notbad(ctx, PR_1D_CLONE_QUESTION, &pctx))) { pctx.errcode = clone_file(ctx, ino, p, block_buf); if (pctx.errcode) { fix_problem(ctx, PR_1D_CLONE_ERROR, &pctx); @@ -721,8 +747,6 @@ static void delete_file(e2fsck_t ctx, ext2_ino_t ino, delete_file_block, &pb); if (pctx.errcode) fix_problem(ctx, PR_1B_BLOCK_ITERATE, &pctx); - if (ctx->inode_bad_map) - ext2fs_unmark_inode_bitmap2(ctx->inode_bad_map, ino); if (ctx->inode_reg_map) ext2fs_unmark_inode_bitmap2(ctx->inode_reg_map, ino); ext2fs_unmark_inode_bitmap2(ctx->inode_dir_map, ino); diff --git a/e2fsck/pass2.c b/e2fsck/pass2.c index b86fe03..0714d7a 100644 --- a/e2fsck/pass2.c +++ b/e2fsck/pass2.c @@ -33,16 +33,16 @@ * Pass 2 relies on the following information from previous passes: * - The directory information collected in pass 1. * - The inode_used_map bitmap - * - The inode_bad_map bitmap + * - The inode_badness bitmap * - The inode_dir_map bitmap * - The encrypted_file_info * - The inode_casefold_map bitmap * * Pass 2 frees the following data structures - * - The inode_bad_map bitmap * - The inode_reg_map bitmap * - The encrypted_file_info * - The inode_casefold_map bitmap + * - The inode_badness bitmap */ #define _GNU_SOURCE 1 /* get strnlen() */ @@ -282,10 +282,6 @@ void e2fsck_pass2(e2fsck_t ctx) ext2fs_free_mem(&buf); ext2fs_free_dblist(fs->dblist); - if (ctx->inode_bad_map) { - ext2fs_free_inode_bitmap(ctx->inode_bad_map); - ctx->inode_bad_map = 0; - } if (ctx->inode_reg_map) { ext2fs_free_inode_bitmap(ctx->inode_reg_map); ctx->inode_reg_map = 0; @@ -299,6 +295,10 @@ void e2fsck_pass2(e2fsck_t ctx) ext2fs_u32_list_free(ctx->casefolded_dirs); ctx->casefolded_dirs = 0; } + if (ctx->inode_badness) { + ext2fs_free_icount(ctx->inode_badness); + ctx->inode_badness = 0; + } clear_problem_context(&pctx); if (ctx->large_files) { @@ -596,6 +596,7 @@ static _INLINE_ int check_filetype(e2fsck_t ctx, { int filetype = ext2fs_dirent_file_type(dirent); int should_be = EXT2_FT_UNKNOWN; + __u16 badness = 0; struct ext2_inode inode; if (!ext2fs_has_feature_filetype(ctx->fs->super)) { @@ -606,16 +607,16 @@ static _INLINE_ int check_filetype(e2fsck_t ctx, return 1; } + if (ctx->inode_badness) + ext2fs_icount_fetch(ctx->inode_badness, dirent->inode, + &badness); + if (ext2fs_test_inode_bitmap2(ctx->inode_dir_map, dirent->inode)) { should_be = EXT2_FT_DIR; } else if (ext2fs_test_inode_bitmap2(ctx->inode_reg_map, dirent->inode)) { should_be = EXT2_FT_REG_FILE; - } else if (ctx->inode_bad_map && - ext2fs_test_inode_bitmap2(ctx->inode_bad_map, - dirent->inode)) - should_be = 0; - else { + } else { e2fsck_read_inode(ctx, dirent->inode, &inode, "check_filetype"); should_be = ext2_file_type(inode.i_mode); @@ -1501,26 +1502,6 @@ skip_checksum: } } - /* - * If the inode was marked as having bad fields in - * pass1, process it and offer to fix/clear it. - * (We wait until now so that we can display the - * pathname to the user.) - */ - if (ctx->inode_bad_map && - ext2fs_test_inode_bitmap2(ctx->inode_bad_map, - dirent->inode)) { - if (e2fsck_process_bad_inode(ctx, ino, - dirent->inode, - buf + fs->blocksize)) { - dirent->inode = 0; - dir_modified++; - goto next; - } - if (ctx->flags & E2F_FLAG_SIGNAL_MASK) - return DIRENT_ABORT; - } - group = ext2fs_group_of_ino(fs, dirent->inode); first_unused_inode = group * fs->super->s_inodes_per_group + 1 + fs->super->s_inodes_per_group - @@ -1563,6 +1544,25 @@ skip_checksum: } } + /* + * If the inode was marked as having bad fields in + * pass1, process it and offer to fix/clear it. + * (We wait until now so that we can display the + * pathname to the user.) + */ + if (!(ctx->flags & E2F_FLAG_RESTART_LATER) && + ctx->inode_badness && + ext2fs_icount_is_set(ctx->inode_badness, dirent->inode)) { + if (e2fsck_process_bad_inode(ctx, ino, dirent->inode, + buf + fs->blocksize)) { + dirent->inode = 0; + dir_modified++; + goto next; + } + if (ctx->flags & E2F_FLAG_SIGNAL_MASK) + return DIRENT_ABORT; + } + /* * Offer to clear unused inodes; if we are going to be * restarting the scan due to bg_itable_unused being @@ -1577,15 +1577,19 @@ skip_checksum: problem = PR_2_UNUSED_INODE; if (problem) { - if (fix_problem(ctx, problem, &cd->pctx)) { + int next = 0; + + if (fix_problem_notbad(ctx, problem, &cd->pctx)) { dirent->inode = 0; dir_modified++; - goto next; + next = 1; } else { ext2fs_unmark_valid(fs); if (problem == PR_2_BAD_INO) - goto next; + next = 1; } + if (next) + goto next; } if (check_filetype(ctx, dirent, ino, &cd->pctx)) @@ -1850,8 +1854,17 @@ static void deallocate_inode(e2fsck_t ctx, ext2_ino_t ino, char* block_buf) struct problem_context pctx; __u32 count; struct del_block del_block; + int extent_fs = 0; e2fsck_read_inode(ctx, ino, &inode, "deallocate_inode"); + /* ext2fs_block_iterate2() depends on the extents flags */ + if (inode.i_flags & EXT4_EXTENTS_FL) + extent_fs = 1; + e2fsck_clear_inode(ctx, ino, &inode, 0, "deallocate_inode"); + if (extent_fs) { + inode.i_flags |= EXT4_EXTENTS_FL; + e2fsck_write_inode(ctx, ino, &inode, "deallocate_inode"); + } clear_problem_context(&pctx); pctx.ino = ino; @@ -1880,6 +1893,8 @@ static void deallocate_inode(e2fsck_t ctx, ext2_ino_t ino, char* block_buf) ext2fs_block_alloc_stats2(fs, ext2fs_file_acl_block(fs, &inode), -1); } + if (ctx->inode_badness) + ext2fs_icount_store(ctx->inode_badness, ino, 0); ext2fs_file_acl_block_set(fs, &inode, 0); } @@ -1939,8 +1954,14 @@ int e2fsck_process_bad_inode(e2fsck_t ctx, ext2_ino_t dir, unsigned char *frag, *fsize; struct problem_context pctx; problem_t problem = 0; + __u16 badness = 0; + unsigned int flags = ctx->fs->flags; + flags = ctx->fs->flags; + ctx->fs->flags |= EXT2_FLAG_IGNORE_CSUM_ERRORS; e2fsck_read_inode(ctx, ino, &inode, "process_bad_inode"); + ctx->fs->flags = (flags & EXT2_FLAG_IGNORE_CSUM_ERRORS) | + (ctx->fs->flags & ~EXT2_FLAG_IGNORE_CSUM_ERRORS); clear_problem_context(&pctx); pctx.ino = ino; @@ -2064,10 +2085,17 @@ int e2fsck_process_bad_inode(e2fsck_t ctx, ext2_ino_t dir, not_fixed++; } + if (e2fsck_fix_bad_inode(ctx, &pctx)) { + deallocate_inode(ctx, ino, 0); + if (ctx->flags & E2F_FLAG_SIGNAL_MASK) + return 0; + inode_modified = 0; + } else { + not_fixed++; + } + if (inode_modified) e2fsck_write_inode(ctx, ino, &inode, "process_bad_inode"); - if (!not_fixed && ctx->inode_bad_map) - ext2fs_unmark_inode_bitmap2(ctx->inode_bad_map, ino); return 0; } @@ -2087,7 +2115,7 @@ static int allocate_dir_block(e2fsck_t ctx, char *block; struct ext2_inode inode; - if (fix_problem(ctx, PR_2_DIRECTORY_HOLE, pctx) == 0) + if (fix_problem_notbad(ctx, PR_2_DIRECTORY_HOLE, pctx) == 0) return 1; /* diff --git a/e2fsck/pass3.c b/e2fsck/pass3.c index 16d243f..8f9c614 100644 --- a/e2fsck/pass3.c +++ b/e2fsck/pass3.c @@ -469,7 +469,7 @@ unlink: pctx.errcode = retval; fix_problem(ctx, PR_3_ERR_FIND_LPF, &pctx); } - if (!fix_problem(ctx, PR_3_NO_LF_DIR, 0)) + if (!fix_problem(ctx, PR_3_NO_LF_DIR, &pctx)) return 0; /* diff --git a/e2fsck/problem.c b/e2fsck/problem.c index 11d277a..83a3703 100644 --- a/e2fsck/problem.c +++ b/e2fsck/problem.c @@ -1318,6 +1318,11 @@ static struct e2fsck_problem problem_table[] = { "without deletion of an EA.\n"), PROMPT_FIX, 0 }, + /* invalid inode creation time */ + { PR_1_CRTIME_BAD, + N_("@i %i creation time (%t) invalid.\n"), + PROMPT_CLEAR, PR_PREEN_OK | PR_NO_OK }, + /* Failed to goto block group */ { PR_1_SCAN_GOTO, N_("failed to goto block group"), @@ -1375,6 +1380,11 @@ static struct e2fsck_problem problem_table[] = { " %b--%c", PROMPT_NONE, PR_LATCH_DBLOCK | PR_PREEN_NOHDR, 0, 0, 0 }, + /* Inode is badly corrupt (badness value = ) */ + { PR_1B_INODE_TOOBAD, + N_("@i %i is badly corrupt (badness value = %N). "), + PROMPT_CLEAR, PR_PREEN_OK }, + /* Pass 1C: Scan directories for inodes with multiply-claimed blocks. */ { PR_1C_PASS_HEADER, N_("Pass 1C: Scanning directories for @is with @m @bs\n"), @@ -1882,6 +1892,10 @@ static struct e2fsck_problem problem_table[] = { N_("Duplicate filename @E found. "), PROMPT_CLEAR, 0, 0, 0, 0 }, + /* Inode is badly corrupt (badness value = ) */ + { PR_2_INODE_TOOBAD, + N_("@i %i is badly corrupt (badness value = %N). "), + PROMPT_CLEAR, PR_PREEN_OK }, /* Pass 3 errors */ @@ -2470,7 +2484,8 @@ static void print_problem(FILE *f, problem_t code, int answer, int fixed, fputs("/>\n", f); } -int fix_problem(e2fsck_t ctx, problem_t code, struct problem_context *pctx) +int fix_problem_loc(e2fsck_t ctx, problem_t code, struct problem_context *pctx, + int badness, const char *func, const int line) { ext2_filsys fs = ctx->fs; struct e2fsck_problem *ptr; @@ -2481,6 +2496,10 @@ int fix_problem(e2fsck_t ctx, problem_t code, struct problem_context *pctx) int suppress = 0; int fixed = 0; + /* ino is always set in pass1, where we will hit most badness */ + if (pctx && pctx->ino != 0 && badness && code < PR_3_PASS_HEADER) + e2fsck_mark_inode_bad_loc(ctx, pctx, code, badness, func, line); + ptr = find_problem(code); if (!ptr) { printf(_("Unhandled error code (0x%x)!\n"), code); @@ -2528,7 +2547,8 @@ int fix_problem(e2fsck_t ctx, problem_t code, struct problem_context *pctx) if (ptr->flags & PR_LATCH_MASK && (ldesc = find_latch(ptr->flags & PR_LATCH_MASK)) != NULL) { if (ldesc->question && !(ldesc->flags & PRL_LATCHED)) { - ans = fix_problem(ctx, ldesc->question, pctx); + ans = fix_problem_loc(ctx, ldesc->question, pctx, + 0, func, line); if (ans == 1) ldesc->flags |= PRL_YES; if (ans == 0) @@ -2629,7 +2649,8 @@ int fix_problem(e2fsck_t ctx, problem_t code, struct problem_context *pctx) fatal_error(ctx, 0); if (ptr->flags & PR_AFTER_CODE) - answer = fix_problem(ctx, ptr->second_code, pctx); + answer = fix_problem_loc(ctx, ptr->second_code, pctx, + 0, func, line); if (answer && (ptr->prompt != PROMPT_NONE) && !(ptr->flags & PR_NOT_A_FIX)) { @@ -2680,6 +2701,13 @@ void preenhalt(e2fsck_t ctx) return; } +void e2fsck_mark_inode_bad_loc(e2fsck_t ctx, + struct problem_context *pctx, __u32 code, + int count, const char *func, const int line) +{ + return; +} + errcode_t profile_get_string(profile_t profile, const char *name, const char *subname, const char *subsubname, const char *def_val, diff --git a/e2fsck/problem.h b/e2fsck/problem.h index 11068bf..336f3fa 100644 --- a/e2fsck/problem.h +++ b/e2fsck/problem.h @@ -694,6 +694,9 @@ struct problem_context { /* Inode has illegal EA value inode */ #define PR_1_ATTR_VALUE_EA_INODE 0x010083 +/* Inode has bad timestamp */ +#define PR_1_INODE_BAD_TIME 0x010084 + /* Parent inode has invalid EA entry. EA inode does not have * EXT4_EA_INODE_FL flag. Delete EA entry? */ #define PR_1_ATTR_NO_EA_INODE_FL 0x010085 @@ -744,6 +747,9 @@ struct problem_context { */ #define PR_1_CLEAR_EXTRA_ISIZE 0x010093 +/* invalid inode creation time */ +#define PR_1_CRTIME_BAD 0x010094 + /* Failed to goto block group */ #define PR_1_SCAN_GOTO 0x0100A0 @@ -778,14 +784,17 @@ struct problem_context { /* Duplicate/bad block range in inode */ #define PR_1B_DUP_RANGE 0x011008 +/* Inode is badly corrupt (badness value = ) */ +#define PR_1B_INODE_TOOBAD 0x011009 + /* Pass 1C: Scan directories for inodes with dup blocks. */ #define PR_1C_PASS_HEADER 0x012000 -/* Pass 1D: Reconciling duplicate blocks */ +/* Pass 1D: Reconciling multiply-claimed blocks */ #define PR_1D_PASS_HEADER 0x013000 -/* File has duplicate blocks */ +/* File has multiply-claimed blocks */ #define PR_1D_DUP_FILE 0x013001 /* List of files sharing duplicate blocks */ @@ -1081,6 +1090,9 @@ struct problem_context { /* Non-unique filename found, but can't rename */ #define PR_2_NON_UNIQUE_FILE_NO_RENAME 0x020054 +/* Inode is badly corrupt (badness value = ) */ +#define PR_2_INODE_TOOBAD 0x020055 + /* * Pass 3 errors */ @@ -1340,7 +1352,14 @@ struct problem_context { /* * Function declarations */ -int fix_problem(e2fsck_t ctx, problem_t code, struct problem_context *pctx); +#define fix_problem(ctx, code, pctx) \ + fix_problem_bad(ctx, code, pctx, 1) +#define fix_problem_notbad(ctx, code, pctx) \ + fix_problem_bad(ctx, code, pctx, 0) +#define fix_problem_bad(ctx, code, pctx, badness) \ + fix_problem_loc(ctx, code, pctx, badness, __func__, __LINE__) +int fix_problem_loc(e2fsck_t ctx, problem_t code, struct problem_context *pctx, + int badness, const char *func, const int line); int end_problem_latch(e2fsck_t ctx, int mask); int set_latch_flags(int mask, int setflags, int clearflags); int get_latch_flags(int mask, int *value); diff --git a/e2fsck/super.c b/e2fsck/super.c index 123813b..c406b37 100644 --- a/e2fsck/super.c +++ b/e2fsck/super.c @@ -1040,8 +1040,8 @@ void check_super_block(e2fsck_t ctx) * write time is in the future. */ if (((ctx->options & E2F_OPT_FORCE) || fs->super->s_checkinterval) && - !broken_system_clock && !(ctx->flags & E2F_FLAG_TIME_INSANE) && - (fs->super->s_mtime > (__u32) ctx->now)) { + !broken_system_clock && + EXT4_XTIME_FUTURE(ctx, fs->super, fs->super->s_mtime, 0)) { pctx.num = fs->super->s_mtime; problem = PR_0_FUTURE_SB_LAST_MOUNT; if (fs->super->s_mtime <= (__u32) ctx->now + ctx->time_fudge) @@ -1052,8 +1052,8 @@ void check_super_block(e2fsck_t ctx) } } if (((ctx->options & E2F_OPT_FORCE) || fs->super->s_checkinterval) && - !broken_system_clock && !(ctx->flags & E2F_FLAG_TIME_INSANE) && - (fs->super->s_wtime > (__u32) ctx->now)) { + !broken_system_clock && + EXT4_XTIME_FUTURE(ctx, fs->super, fs->super->s_wtime, 0)) { pctx.num = fs->super->s_wtime; problem = PR_0_FUTURE_SB_LAST_WRITE; if (fs->super->s_wtime <= (__u32) ctx->now + ctx->time_fudge) diff --git a/e2fsck/unix.c b/e2fsck/unix.c index cb360ea..5f9dbcb 100644 --- a/e2fsck/unix.c +++ b/e2fsck/unix.c @@ -792,6 +792,22 @@ static void parse_extended_opts(e2fsck_t ctx, const char *opts) extended_usage++; continue; } + /* -E inode_badness_threshold= */ + } else if (strcmp(token, "inode_badness_threshold") == 0) { + unsigned int val; + + if (!arg) { + extended_usage++; + continue; + } + val = strtoul(arg, &p, 0); + if (*p != '\0' || (val < 3 && val != 0) || val > 200) { + fprintf(stderr, _("Invalid badness '%s'\n"), + arg); + extended_usage++; + continue; + } + ctx->inode_badness_threshold = val; } else if (strcmp(token, "journal_only") == 0) { if (arg) { extended_usage++; @@ -867,6 +883,7 @@ static void parse_extended_opts(e2fsck_t ctx, const char *opts) fputs(("\tshared=\n"), stderr); fputs(("\tclone=\n"), stderr); fputs(("\texpand_extra_isize\n"), stderr); + fputs(("\tinode_badness_threhold=(value)\n"), stderr); fputs("\toptimize_extents\n", stderr); fputs("\tno_optimize_extents\n", stderr); fputs("\tinode_count_fullmap\n", stderr); @@ -950,6 +967,7 @@ static errcode_t PRS(int argc, char *argv[], e2fsck_t *ret_ctx) phys_mem_kb = get_memory_size() / 1024; ctx->readahead_kb = ~0ULL; + ctx->inode_badness_threshold = BADNESS_THRESHOLD; #ifdef HAVE_PTHREAD while ((c = getopt(argc, argv, "pam:nyrcC:B:dE:fvtFVM:b:I:j:P:l:L:N:SsDkz:")) != EOF) diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h index b0c3847..714bed5 100644 --- a/lib/ext2fs/ext2fs.h +++ b/lib/ext2fs/ext2fs.h @@ -1546,6 +1546,7 @@ extern errcode_t ext2fs_calculate_summary_stats(ext2_filsys fs, int super_only); /* icount.c */ extern void ext2fs_free_icount(ext2_icount_t icount); +extern int ext2fs_icount_is_set(ext2_icount_t icount, ext2_ino_t ino); extern errcode_t ext2fs_create_icount_tdb(ext2_filsys fs, char *tdb_dir, int flags, ext2_icount_t *ret); extern errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags, diff --git a/lib/ext2fs/icount.c b/lib/ext2fs/icount.c index 48665c7..093f51b 100644 --- a/lib/ext2fs/icount.c +++ b/lib/ext2fs/icount.c @@ -137,8 +137,9 @@ static errcode_t alloc_icount(ext2_filsys fs, int flags, ext2_icount_t *ret) &icount->multiple); if (retval) goto errout; - } else + } else { icount->multiple = 0; + } *ret = icount; return 0; @@ -508,6 +509,23 @@ static errcode_t get_inode_count(ext2_icount_t icount, ext2_ino_t ino, return 0; } +int ext2fs_icount_is_set(ext2_icount_t icount, ext2_ino_t ino) +{ + __u16 result; + + if (ext2fs_test_inode_bitmap2(icount->single, ino)) + return 1; + else if (icount->multiple) { + if (ext2fs_test_inode_bitmap2(icount->multiple, ino)) + return 1; + return 0; + } + ext2fs_icount_fetch(icount, ino, &result); + if (result) + return 1; + return 0; +} + errcode_t ext2fs_icount_validate(ext2_icount_t icount, FILE *out) { errcode_t ret = 0; diff --git a/tests/f_ibadness/expect.1 b/tests/f_ibadness/expect.1 new file mode 100644 index 0000000..b0233fd --- /dev/null +++ b/tests/f_ibadness/expect.1 @@ -0,0 +1,60 @@ +Pass 1: Checking inodes, blocks, and sizes +e2fsck_pass1_run: increase inode 13 badness 0 to 1 for 10005 +Inode 13 is in use, but has dtime set. Fix? yes + +e2fsck_pass1_run: increase inode 13 badness 1 to 2 for 2000f +e2fsck_pass1_run: increase inode 13 badness 2 to 3 for 20044 +add_encrypted_file: increase inode 13 badness 3 to 4 for 1008a +Inode 13 has encrypt flag but no encryption extended attribute. +Clear flag? yes + +e2fsck_pass1_run: increase inode 13 badness 4 to 6 for 10084 +check_ext_attr: increase inode 13 badness 6 to 7 for 2000e +process_block: increase inode 13 badness 7 to 8 for 1000e +Inode 13 has illegal block(s). Clear? yes + +Illegal block #0 (4294967295) in inode 13. CLEARED. +process_block: increase inode 13 badness 8 to 9 for 1000e +Illegal block #1 (4294967295) in inode 13. CLEARED. +process_block: increase inode 13 badness 9 to 10 for 1000e +Illegal block #7 (12345678) in inode 13. CLEARED. +process_block: increase inode 13 badness 10 to 11 for 1000e +Illegal triple indirect block (1234567) in inode 13. CLEARED. +check_blocks: increase inode 13 badness 11 to 12 for 1000d +Inode 13, i_blocks is 3453453, should be 138. Fix? yes + +Pass 2: Checking directory structure +e2fsck_process_bad_inode: increase inode 13 badness 12 to 13 for 2000e +i_file_acl for inode 13 (/testfile) is 345, should be zero. +Clear? yes + +e2fsck_process_bad_inode: increase inode 13 badness 13 to 14 for 2000d +i_faddr for inode 13 (/testfile) is 34534, should be zero. +Clear? yes + +Inode 13 is badly corrupt (badness value = 14). Clear? yes + +Entry 'testfile' in / (2) has deleted/unused inode 13. Clear? yes + +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +Block bitmap differences: -(1368--1369) -1375 +Fix? yes + +Free blocks count wrong for group #0 (6822, counted=6825). +Fix? yes + +Free blocks count wrong (14690, counted=14693). +Fix? yes + +Free inodes count wrong for group #0 (2039, counted=2037). +Fix? yes + +Free inodes count wrong (4087, counted=4085). +Fix? yes + + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 11/4096 files (9.1% non-contiguous), 1691/16384 blocks +Exit status is 1 diff --git a/tests/f_ibadness/expect.2 b/tests/f_ibadness/expect.2 new file mode 100644 index 0000000..44d9c79 --- /dev/null +++ b/tests/f_ibadness/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 11/4096 files (0.0% non-contiguous), 1691/16384 blocks +Exit status is 0 diff --git a/tests/f_ibadness/image.gz b/tests/f_ibadness/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..4c9c22fe43637fd28afa934daa33b9925313bb1c GIT binary patch literal 41023 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 R|FyuqQx5nKo+kvS{sSItLW}?a literal 0 HcmV?d00001 diff --git a/tests/f_ibadness/name b/tests/f_ibadness/name new file mode 100644 index 0000000..bdaceb3 --- /dev/null +++ b/tests/f_ibadness/name @@ -0,0 +1 @@ +Inode with badness over threshold diff --git a/tests/f_ibadness/script b/tests/f_ibadness/script new file mode 100644 index 0000000..324a3e4 --- /dev/null +++ b/tests/f_ibadness/script @@ -0,0 +1,4 @@ +FSCK_OPT="-fyd" +SECOND_FSCK_OPT=-yf + +. $cmd_dir/run_e2fsck diff --git a/tests/f_ibadness_bad_extents/expect.1 b/tests/f_ibadness_bad_extents/expect.1 new file mode 100644 index 0000000..86d8884 --- /dev/null +++ b/tests/f_ibadness_bad_extents/expect.1 @@ -0,0 +1,74 @@ +Pass 1: Checking inodes, blocks, and sizes +e2fsck_pass1_run: increase inode 2 badness 0 to 1 for 1005c +e2fsck_pass1_run: increase inode 8 badness 0 to 1 for 1005c +e2fsck_pass1_run: increase inode 11 badness 0 to 1 for 1005c +e2fsck_pass1_run: increase inode 12 badness 0 to 1 for 1005c +Inode 12 missing EXTENT_FL, but is in extents format +Fix? yes + +e2fsck_pass1_run: increase inode 12 badness 1 to 2 for 10005 +Inode 12 is in use, but has dtime set. Fix? yes + +e2fsck_pass1_run: increase inode 12 badness 2 to 3 for 20044 +e2fsck_pass1_run: increase inode 12 badness 3 to 4 for 10084 +e2fsck_pass1_run: increase inode 12 badness 4 to 5 for 10084 +e2fsck_pass1_run: increase inode 12 badness 5 to 7 for 10084 +check_ext_attr: increase inode 12 badness 7 to 8 for 2000e +scan_extent_node: increase inode 12 badness 8 to 9 for 10058 +Inode 12 has an invalid extent + (logical block 0, invalid physical block 1231231222, len 492) +Clear? yes + +scan_extent_node: increase inode 12 badness 9 to 10 for 10058 +Inode 12 has an invalid extent + (logical block 556, invalid physical block 4294967295, len 45) +Clear? yes + +scan_extent_node: increase inode 12 badness 10 to 11 for 10058 +Inode 12 has an invalid extent + (logical block 666, invalid physical block 4294967295, len 5) +Clear? yes + +scan_extent_node: increase inode 12 badness 11 to 12 for 10058 +Inode 12 has an invalid extent + (logical block 700, invalid physical block 4294967295, len 45) +Clear? yes + +check_blocks: increase inode 12 badness 12 to 13 for 1000d +Inode 12, i_blocks is 984, should be 0. Fix? yes + +Inode 12 is badly corrupt (badness value = 13). Clear? yes + +Restarting e2fsck from the beginning... +Pass 1: Checking inodes, blocks, and sizes +e2fsck_pass1_run: increase inode 2 badness 0 to 1 for 1005c +e2fsck_pass1_run: increase inode 8 badness 0 to 1 for 1005c +e2fsck_pass1_run: increase inode 11 badness 0 to 1 for 1005c +Pass 2: Checking directory structure +Entry 'testfile' in / (2) has deleted/unused inode 12. Clear? yes + +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +Block bitmap differences: -(6145--6636) +Fix? yes + +Free blocks count wrong for group #0 (6525, counted=7017). +Fix? yes + +Free blocks count wrong (14584, counted=15076). +Fix? yes + +Inode bitmap differences: -12 +Fix? yes + +Free inodes count wrong for group #0 (1012, counted=1013). +Fix? yes + +Free inodes count wrong (2036, counted=2037). +Fix? yes + + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 11/2048 files (0.0% non-contiguous), 1308/16384 blocks +Exit status is 1 diff --git a/tests/f_ibadness_bad_extents/expect.2 b/tests/f_ibadness_bad_extents/expect.2 new file mode 100644 index 0000000..7560785 --- /dev/null +++ b/tests/f_ibadness_bad_extents/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 11/2048 files (0.0% non-contiguous), 1308/16384 blocks +Exit status is 0 diff --git a/tests/f_ibadness_bad_extents/image.gz b/tests/f_ibadness_bad_extents/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..65d1b46b592359f9849a89168a39647e29bafce2 GIT binary patch literal 91025 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 literal 0 HcmV?d00001 diff --git a/tests/f_ibadness_bad_extents/name b/tests/f_ibadness_bad_extents/name new file mode 100644 index 0000000..58bd208 --- /dev/null +++ b/tests/f_ibadness_bad_extents/name @@ -0,0 +1 @@ +All in inode extents corrupt diff --git a/tests/f_ibadness_bad_extents/script b/tests/f_ibadness_bad_extents/script new file mode 100644 index 0000000..324a3e4 --- /dev/null +++ b/tests/f_ibadness_bad_extents/script @@ -0,0 +1,4 @@ +FSCK_OPT="-fyd" +SECOND_FSCK_OPT=-yf + +. $cmd_dir/run_e2fsck diff --git a/tests/f_ibadness_dup/expect.1 b/tests/f_ibadness_dup/expect.1 new file mode 100644 index 0000000..11369a1 --- /dev/null +++ b/tests/f_ibadness_dup/expect.1 @@ -0,0 +1,125 @@ +Pass 1: Checking inodes, blocks, and sizes +check_inode_extra_space: increase inode 20 badness 0 to 2 for 10094 +e2fsck_pass1_run: increase inode 20 badness 2 to 4 for 10084 +check_blocks: increase inode 20 badness 4 to 5 for 1000c +Inode 20, i_size is 58, should be 12288. Fix? yes + +check_blocks: increase inode 20 badness 5 to 6 for 1000d +Inode 20, i_blocks is 2, should be 24. Fix? yes + +check_blocks: increase inode 25 badness 0 to 1 for 1000c +Inode 25, i_size is 58, should be 2048. Fix? yes + +check_blocks: increase inode 25 badness 1 to 2 for 1000d +Inode 25, i_blocks is 2, should be 4. Fix? yes + +check_blocks: increase inode 26 badness 0 to 1 for 1000c +Inode 26, i_size is 58, should be 2048. Fix? yes + +check_blocks: increase inode 26 badness 1 to 2 for 1000d +Inode 26, i_blocks is 2, should be 4. Fix? yes + + +Running additional passes to resolve blocks claimed by more than one inode... +Pass 1B: Rescanning for multiply-claimed blocks +Multiply-claimed block(s) in inode 12: 27 +Multiply-claimed block(s) in inode 13: 28 +Multiply-claimed block(s) in inode 14: 29 +Multiply-claimed block(s) in inode 15: 30 +Multiply-claimed block(s) in inode 16: 31 +Multiply-claimed block(s) in inode 17: 32 +Multiply-claimed block(s) in inode 18: 33 +Multiply-claimed block(s) in inode 19: 34 +Multiply-claimed block(s) in inode 20: 27--34 36--38 +Multiply-claimed block(s) in inode 21: 36 +Multiply-claimed block(s) in inode 22: 37 +Multiply-claimed block(s) in inode 23: 38 +Multiply-claimed block(s) in inode 25: 30 +Multiply-claimed block(s) in inode 26: 31 +Pass 1C: Scanning directories for inodes with multiply-claimed blocks +Pass 1D: Reconciling multiply-claimed blocks +(There are 14 inodes containing multiply-claimed blocks.) + +pass1d: increase inode 12 badness 0 to 1 for 13001 +File /dupe1 (inode #12, mod time Tue Apr 10 21:00:00 2007) + has 1 multiply-claimed block(s), shared with 1 file(s): +pass1d: increase inode 20 badness 6 to 7 for 13002 + /dupe9 (inode #20, mod time Thu Jan 1 03:25:45 1970) +Clone multiply-claimed blocks? yes + +pass1d: increase inode 13 badness 0 to 1 for 13001 +File /dupe2 (inode #13, mod time Tue Apr 10 21:00:00 2007) + has 1 multiply-claimed block(s), shared with 1 file(s): +pass1d: increase inode 20 badness 7 to 8 for 13002 + /dupe9 (inode #20, mod time Thu Jan 1 03:25:45 1970) +Clone multiply-claimed blocks? yes + +pass1d: increase inode 14 badness 0 to 1 for 13001 +File /dupe3 (inode #14, mod time Tue Apr 10 21:00:00 2007) + has 1 multiply-claimed block(s), shared with 1 file(s): +pass1d: increase inode 20 badness 8 to 9 for 13002 + /dupe9 (inode #20, mod time Thu Jan 1 03:25:45 1970) +Clone multiply-claimed blocks? yes + +pass1d: increase inode 15 badness 0 to 1 for 13001 +File /dupe4 (inode #15, mod time Tue Apr 10 21:00:00 2007) + has 1 multiply-claimed block(s), shared with 2 file(s): +pass1d: increase inode 25 badness 2 to 3 for 13002 + /dupeE (inode #25, mod time Tue Apr 10 21:00:00 2007) +pass1d: increase inode 20 badness 9 to 10 for 13002 + /dupe9 (inode #20, mod time Thu Jan 1 03:25:45 1970) +Clone multiply-claimed blocks? yes + +pass1d: increase inode 16 badness 0 to 1 for 13001 +File /dupe5 (inode #16, mod time Tue Apr 10 21:00:00 2007) + has 1 multiply-claimed block(s), shared with 2 file(s): +pass1d: increase inode 26 badness 2 to 3 for 13002 + /dupeF (inode #26, mod time Tue Apr 10 21:00:00 2007) +pass1d: increase inode 20 badness 10 to 11 for 13002 + /dupe9 (inode #20, mod time Thu Jan 1 03:25:45 1970) +Clone multiply-claimed blocks? yes + +pass1d: increase inode 17 badness 0 to 1 for 13001 +File /dupe6 (inode #17, mod time Tue Apr 10 21:00:00 2007) + has 1 multiply-claimed block(s), shared with 1 file(s): +pass1d: increase inode 20 badness 11 to 12 for 13002 + /dupe9 (inode #20, mod time Thu Jan 1 03:25:45 1970) +Clone multiply-claimed blocks? yes + +pass1d: increase inode 18 badness 0 to 1 for 13001 +File /dupe7 (inode #18, mod time Tue Apr 10 21:00:00 2007) + has 1 multiply-claimed block(s), shared with 1 file(s): +pass1d: increase inode 20 badness 12 to 13 for 13002 + /dupe9 (inode #20, mod time Thu Jan 1 03:25:45 1970) +Inode 20 is badly corrupt (badness value = 13). Clear? yes + +Restarting e2fsck from the beginning... +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Entry 'dupe9' in / (2) has deleted/unused inode 20. Clear? yes + +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +Block bitmap differences: -(27--29) -32 -35 +Fix? yes + +Free blocks count wrong for group #0 (58, counted=57). +Fix? yes + +Free blocks count wrong (58, counted=57). +Fix? yes + +Inode bitmap differences: -20 +Fix? yes + +Free inodes count wrong for group #0 (6, counted=7). +Fix? yes + +Free inodes count wrong (6, counted=7). +Fix? yes + + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 25/32 files (8.0% non-contiguous), 43/100 blocks +Exit status is 1 diff --git a/tests/f_ibadness_dup/expect.2 b/tests/f_ibadness_dup/expect.2 new file mode 100644 index 0000000..ba31c13 --- /dev/null +++ b/tests/f_ibadness_dup/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 25/32 files (8.0% non-contiguous), 43/100 blocks +Exit status is 0 diff --git a/tests/f_ibadness_dup/name b/tests/f_ibadness_dup/name new file mode 100644 index 0000000..9615701 --- /dev/null +++ b/tests/f_ibadness_dup/name @@ -0,0 +1,2 @@ +bad inode with dup blocks over many other inodes + diff --git a/tests/f_ibadness_dup/script b/tests/f_ibadness_dup/script new file mode 100644 index 0000000..65b94a4 --- /dev/null +++ b/tests/f_ibadness_dup/script @@ -0,0 +1,76 @@ +FSCK_OPT="-fyd" # to debug inode badness +if ! test -x $DEBUGFS_EXE; then + echo "$test_name: $test_description: skipped (no debugfs)" + return 0 +fi + +SKIP_GUNZIP="true" +TEST_DATA="$test_name.tmp" + +echo "/ Murphy Magic. The SeCrEt of the UnIvErSe is 43, NOT 42" > $TEST_DATA + +touch $TMPFILE +$MKE2FS -N 32 -F -o Linux -b 1024 $TMPFILE 100 > /dev/null 2>&1 +$DEBUGFS -w $TMPFILE << EOF > /tmp/log 2>&1 +set_current_time 20070410210000 +set_super_value lastcheck 0 +set_super_value hash_seed null +set_super_value mkfs_time 20070110210000 +write $TEST_DATA dupe1 +write $TEST_DATA dupe2 +write $TEST_DATA dupe3 +write $TEST_DATA dupe4 +write $TEST_DATA dupe5 +write $TEST_DATA dupe6 +write $TEST_DATA dupe7 +write $TEST_DATA dupe8 +write $TEST_DATA dupe9 +write $TEST_DATA dupeA +write $TEST_DATA dupeB +write $TEST_DATA dupeC +write $TEST_DATA dupeD +write $TEST_DATA dupeE +write $TEST_DATA dupeF +stat dupe1 +stat dupe9 +stat dupeF +set_inode_field dupe9 mtime 12345 +set_inode_field dupe9 ctime 12345 +set_inode_field dupe9 crtime 12345 +set_inode_field dupe9 block[0] 27 +set_inode_field dupe9 block[1] 28 +set_inode_field dupe9 block[2] 29 +set_inode_field dupe9 block[3] 30 +set_inode_field dupe9 block[4] 31 +set_inode_field dupe9 block[5] 32 +set_inode_field dupe9 block[6] 33 +set_inode_field dupe9 block[7] 34 +set_inode_field dupe9 block[8] 35 +set_inode_field dupe9 block[9] 36 +set_inode_field dupe9 block[10] 37 +set_inode_field dupe9 block[11] 38 +set_inode_field dupeE block[1] 30 +set_inode_field dupeF block[1] 31 +q +EOF + +E2FSCK_TIME=200704102100 +export E2FSCK_TIME + +#cp $TMPFILE /tmp/image.sav +#$DEBUGFS -c -f /dev/stdin > /tmp/log 2>&1 <<- EOF +# stat dupe1 +# stat dupe2 +# stat dupe3 +# stat dupe4 +# stat dupe5 +# stat dupe6 +# stat dupe7 +# stat dupe8 +# stat dupe9 +#EOF +. $cmd_dir/run_e2fsck + +rm -f $TEST_DATA + +unset E2FSCK_TIME TEST_DATA diff --git a/tests/f_ind_inode_collision/expect.1 b/tests/f_ind_inode_collision/expect.1 index 63c128b..c8555cb 100644 --- a/tests/f_ind_inode_collision/expect.1 +++ b/tests/f_ind_inode_collision/expect.1 @@ -47,78 +47,7 @@ Illegal block number passed to ext2fs_test_block_bitmap #65536 for multiply clai Illegal block number passed to ext2fs_test_block_bitmap #16777215 for multiply claimed block map 28 Error while iterating over blocks in inode 12 (pass1b): Illegal indirect block found -Pass 1C: Scanning directories for inodes with multiply-claimed blocks -Pass 1D: Reconciling multiply-claimed blocks -(There are 3 inodes containing multiply-claimed blocks.) - -File / (inode #2, mod time Sat Jan 17 21:16:16 2015) - has 1 multiply-claimed block(s), shared with 1 file(s): - /a (inode #12, mod time Sat Jan 17 21:16:37 2015) -Clone multiply-claimed blocks? yes - -File /lost+found (inode #11, mod time Sat Jan 17 21:16:16 2015) - has 4 multiply-claimed block(s), shared with 1 file(s): - /a (inode #12, mod time Sat Jan 17 21:16:37 2015) -Clone multiply-claimed blocks? yes - -File /a (inode #12, mod time Sat Jan 17 21:16:37 2015) - has 17 multiply-claimed block(s), shared with 4 file(s): - - /lost+found (inode #11, mod time Sat Jan 17 21:16:16 2015) - (inode #7, mod time Sat Jan 17 21:16:16 2015) - / (inode #2, mod time Sat Jan 17 21:16:16 2015) -Clone multiply-claimed blocks? yes - -Illegal block number passed to ext2fs_test_block_bitmap #1421529376 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529376 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529376 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #16877 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #4096 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529376 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529376 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529376 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #196608 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529376 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #33152 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #4243456 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529376 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529376 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529376 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #65536 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529376 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #16832 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #16384 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529376 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529376 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529376 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #131072 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529376 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #33206 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #25227264 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529397 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529397 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529397 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #65536 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #1421529397 for multiply claimed block map -Illegal block number passed to ext2fs_test_block_bitmap #16777215 for multiply claimed block map -Pass 2: Checking directory structure -Restarting e2fsck from the beginning... -Pass 1: Checking inodes, blocks, and sizes -Inode 12 has illegal block(s). Clear? yes - -Illegal block #1038 (1421529376) in inode 12. CLEARED. -Illegal block #1039 (1421529376) in inode 12. CLEARED. -Illegal block #1040 (1421529376) in inode 12. CLEARED. -Illegal block #1100 (16877) in inode 12. CLEARED. -Illegal block #1101 (4096) in inode 12. CLEARED. -Illegal block #1102 (1421529376) in inode 12. CLEARED. -Illegal block #1103 (1421529376) in inode 12. CLEARED. -Illegal block #1104 (1421529376) in inode 12. CLEARED. -Illegal block #1106 (196608) in inode 12. CLEARED. -Illegal block #1136 (1421529376) in inode 12. CLEARED. -Illegal block #1420 (33152) in inode 12. CLEARED. -Too many illegal blocks in inode 12. -Clear inode? yes +Inode 12 is badly corrupt (badness value = 13). Clear? yes Restarting e2fsck from the beginning... Pass 1: Checking inodes, blocks, and sizes @@ -128,9 +57,6 @@ Entry 'a' in / (2) has deleted/unused inode 12. Clear? yes Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information -Block bitmap differences: -(3--7) -(15--17) -(19--24) -Fix? yes - Inode bitmap differences: -12 Fix? yes @@ -142,5 +68,5 @@ Fix? yes test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** -test_filesys: 11/128 files (9.1% non-contiguous), 18/512 blocks +test_filesys: 11/128 files (0.0% non-contiguous), 18/512 blocks Exit status is 1 diff --git a/tests/f_ind_inode_collision/expect.2 b/tests/f_ind_inode_collision/expect.2 index d0a6dac..411e656 100644 --- a/tests/f_ind_inode_collision/expect.2 +++ b/tests/f_ind_inode_collision/expect.2 @@ -3,5 +3,5 @@ Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information -test_filesys: 11/128 files (9.1% non-contiguous), 18/512 blocks +test_filesys: 11/128 files (0.0% non-contiguous), 18/512 blocks Exit status is 0 diff --git a/tests/f_messy_inode/expect.1 b/tests/f_messy_inode/expect.1 index 708f1da..67cca25 100644 --- a/tests/f_messy_inode/expect.1 +++ b/tests/f_messy_inode/expect.1 @@ -20,19 +20,23 @@ Pass 2: Checking directory structure i_file_acl for inode 14 (/MAKEDEV) is 4294901760, should be zero. Clear? yes +Inode 14 is badly corrupt (badness value = 13). Clear? yes + +Entry 'MAKEDEV' in / (2) has deleted/unused inode 14. Clear? yes + Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information Block bitmap differences: -(43--49) Fix? yes -Free blocks count wrong for group #0 (68, counted=75). +Free blocks count wrong for group #0 (70, counted=77). Fix? yes -Free blocks count wrong (68, counted=75). +Free blocks count wrong (70, counted=77). Fix? yes test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** -test_filesys: 29/32 files (3.4% non-contiguous), 25/100 blocks +test_filesys: 28/32 files (3.6% non-contiguous), 23/100 blocks Exit status is 1 diff --git a/tests/f_messy_inode/expect.2 b/tests/f_messy_inode/expect.2 index 1fffb02..fb4e83a 100644 --- a/tests/f_messy_inode/expect.2 +++ b/tests/f_messy_inode/expect.2 @@ -3,5 +3,5 @@ Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information -test_filesys: 29/32 files (0.0% non-contiguous), 25/100 blocks +test_filesys: 28/32 files (0.0% non-contiguous), 23/100 blocks Exit status is 0 diff --git a/tests/f_messy_inode/script b/tests/f_messy_inode/script new file mode 100644 index 0000000..3277356 --- /dev/null +++ b/tests/f_messy_inode/script @@ -0,0 +1,5 @@ +FSCK_OPT="-fy" +OUT1=$test_name.1.log +AFTER_CMD="sed -i -e 's/:[0-9]\{4\}:/::/' $OUT1" + +. $cmd_dir/run_e2fsck diff --git a/tests/filter.sed b/tests/filter.sed index 5fd68f3..0115213 100644 --- a/tests/filter.sed +++ b/tests/filter.sed @@ -39,3 +39,4 @@ s/mmp_update_date: .*/mmp_update_date: test date/ s/mmp_update_time: .*/mmp_update_time: test_time/ s/MMP last updated by '.*' on .*/MMP last updated by 'test_node' on test date/ s/MMP update by '.*' at .*/MMP last updated by 'test_node' on test date/ +s/:[0-9]*: \(increase inode [0-9]* badness\)/: \1/ -- 1.8.3.1