On May 30, 2018, at 6:51 AM, Jan Kara <jack@xxxxxxx> wrote: > > Add a flag to ext2fs_open() which allows to open a filesystem even if > superblock is somewhat inconsistent. Use this flag from e2fsck as a last > resort to try to fix the superblok. > > Currently, the flag does nothing. We'll relax checks in ext2fs_open() > once e2fsck is able to handle corresponding corruption gracefully. > > Signed-off-by: Jan Kara <jack@xxxxxxx> I'd think this patch would go at the end once ext2fs_open() checks for this flag and handles it, but either way... Reviewed-by: Andreas Dilger <adilger@xxxxxxxxx> > --- > e2fsck/unix.c | 22 +++++++++++++++++++++- > lib/ext2fs/ext2fs.h | 1 + > 2 files changed, 22 insertions(+), 1 deletion(-) > > diff --git a/e2fsck/unix.c b/e2fsck/unix.c > index cbe5ec5034cb..55e21ea0aeac 100644 > --- a/e2fsck/unix.c > +++ b/e2fsck/unix.c > @@ -1364,7 +1364,7 @@ int main (int argc, char *argv[]) > const char *lib_ver_date; > int my_ver, lib_ver; > e2fsck_t ctx; > - blk64_t orig_superblock; > + blk64_t orig_superblock = ~(blk64_t)0; > struct problem_context pctx; > int flags, run_result, was_changed; > int journal_size; > @@ -1571,6 +1571,26 @@ failure: > "check of the device.\n")); > #endif > else { > + /* > + * Let's try once more will less consistency checking > + * so that we are able to recover from more errors > + * (e.g. some tool messing up some value in the sb). > + */ > + if (!(flags & EXT2_FLAG_IGNORE_SB_ERRORS)) { > + if (fs) > + ext2fs_close_free(&fs); > + log_out(ctx, _("%s: Trying to load superblock " > + "despite errors...\n"), > + ctx->program_name); > + flags |= EXT2_FLAG_IGNORE_SB_ERRORS; > + /* > + * If we tried backup sb, revert to the > + * original one now. > + */ > + if (orig_superblock != ~(blk64_t)0) > + ctx->superblock = orig_superblock; > + goto restart; > + } > fix_problem(ctx, PR_0_SB_CORRUPT, &pctx); > if (retval == EXT2_ET_BAD_MAGIC) > check_plausibility(ctx->filesystem_name, > diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h > index 6774e32c91c2..250fd174cd48 100644 > --- a/lib/ext2fs/ext2fs.h > +++ b/lib/ext2fs/ext2fs.h > @@ -195,6 +195,7 @@ typedef struct ext2_file *ext2_file_t; > #define EXT2_FLAG_DIRECT_IO 0x80000 > #define EXT2_FLAG_SKIP_MMP 0x100000 > #define EXT2_FLAG_IGNORE_CSUM_ERRORS 0x200000 > +#define EXT2_FLAG_IGNORE_SB_ERRORS 0x400000 > > /* > * Special flag in the ext2 inode i_flag field that means that this is > -- > 2.13.6 > Cheers, Andreas
Attachment:
signature.asc
Description: Message signed with OpenPGP