Lines Matching full:ctx
188 static void e2fsck_clear_recover(e2fsck_t ctx, int error)
190 ctx->fs->super->s_feature_incompat &= ~EXT3_FEATURE_INCOMPAT_RECOVER;
194 ctx->fs->super->s_state &= ~EXT2_VALID_FS;
195 ext2fs_mark_super_dirty(ctx->fs);
226 static errcode_t e2fsck_get_journal(e2fsck_t ctx, journal_t **ret_journal)
229 struct ext2_super_block *sb = ctx->fs->super;
245 journal = e2fsck_allocate_memory(ctx, sizeof(journal_t), "journal");
250 dev_fs = e2fsck_allocate_memory(ctx, 2*sizeof(struct kdev_s), "kdev");
257 dev_fs->k_ctx = dev_journal->k_ctx = ctx;
264 journal->j_blocksize = ctx->fs->blocksize;
271 j_inode = e2fsck_allocate_memory(ctx, sizeof(*j_inode),
278 j_inode->i_ctx = ctx;
281 if ((retval = ext2fs_read_inode(ctx->fs,
294 e2fsck_use_inode_shortcuts(ctx, 1);
295 ctx->stashed_ino = j_inode->i_ino;
296 ctx->stashed_inode = &j_inode->i_ext2;
310 retval = ext2fs_block_iterate2(ctx->fs, j_inode->i_ino,
313 if ((pb.last_block+1) * ctx->fs->blocksize <
318 if (tried_backup_jnl && !(ctx->options & E2F_OPT_READONLY)) {
319 retval = ext2fs_write_inode(ctx->fs, sb->s_journal_inum,
328 retval = ext2fs_inode_io_intern2(ctx->fs, sb->s_journal_inum,
337 ctx->journal_io = ctx->fs->io;
343 if (!ctx->journal_name) {
347 ctx->journal_name = blkid_get_devname(ctx->blkid,
349 if (!ctx->journal_name)
350 ctx->journal_name = blkid_devno_to_devname(sb->s_journal_dev);
352 journal_name = ctx->journal_name;
355 fix_problem(ctx, PR_0_CANT_FIND_JOURNAL, &pctx);
373 &ctx->journal_io);
377 io_channel_set_blksize(ctx->journal_io, ctx->fs->blocksize);
380 if (ctx->fs->blocksize == 1024)
382 bh = getblk(dev_journal, start, ctx->fs->blocksize);
401 fix_problem(ctx, PR_0_EXT_JOURNAL_BAD_SUPER, &pctx);
406 if (memcmp(jsuper.s_uuid, ctx->fs->super->s_journal_uuid,
408 fix_problem(ctx, PR_0_JOURNAL_BAD_UUID, &pctx);
431 e2fsck_use_inode_shortcuts(ctx, 0);
435 e2fsck_use_inode_shortcuts(ctx, 0);
445 static errcode_t e2fsck_journal_fix_bad_inode(e2fsck_t ctx,
448 struct ext2_super_block *sb = ctx->fs->super;
449 int recover = ctx->fs->super->s_feature_incompat &
451 int has_journal = ctx->fs->super->s_feature_compat &
457 if (fix_problem(ctx, PR_0_JOURNAL_BAD_INODE, pctx)) {
463 ctx->flags |= E2F_FLAG_JOURNAL_INODE;
464 ctx->fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
465 e2fsck_clear_recover(ctx, 1);
470 if (fix_problem(ctx, PR_0_JOURNAL_RECOVER_SET, pctx)) {
471 e2fsck_clear_recover(ctx, 1);
482 e2fsck_t ctx = journal->j_dev->k_ctx;
487 if (!fix_problem(ctx, PR_0_CLEAR_V2_JOURNAL, &pctx))
491 ctx->fs->blocksize-V1_SB_SIZE);
498 e2fsck_t ctx = journal->j_dev->k_ctx;
507 com_err(ctx->device_name, jbh->b_err,
515 return e2fsck_journal_fix_bad_inode(ctx, &pctx);
530 uuid_is_null(ctx->fs->super->s_journal_uuid))
533 fix_problem(ctx, PR_0_JOURNAL_UNSUPP_MULTIFS, &pctx);
564 com_err(ctx->program_name, EXT2_ET_CORRUPT_SUPERBLOCK,
566 ctx->device_name);
573 com_err(ctx->program_name, EXT2_ET_CORRUPT_SUPERBLOCK,
575 ctx->device_name);
588 static void e2fsck_journal_reset_super(e2fsck_t ctx, journal_superblock_t *jsb,
612 memset (p, 0, ctx->fs->blocksize-sizeof(journal_header_t));
614 jsb->s_blocksize = htonl(ctx->fs->blocksize);
632 static errcode_t e2fsck_journal_fix_corrupt_super(e2fsck_t ctx,
636 struct ext2_super_block *sb = ctx->fs->super;
637 int recover = ctx->fs->super->s_feature_incompat &
641 if (fix_problem(ctx, PR_0_JOURNAL_BAD_SUPER, pctx)) {
642 e2fsck_journal_reset_super(ctx, journal->j_superblock,
645 e2fsck_clear_recover(ctx, recover);
649 } else if (e2fsck_journal_fix_bad_inode(ctx, pctx))
655 static void e2fsck_journal_release(e2fsck_t ctx, journal_t *journal,
662 else if (!(ctx->options & E2F_OPT_READONLY)) {
671 if (ctx->journal_io) {
672 if (ctx->fs && ctx->fs->io != ctx->journal_io)
673 io_channel_close(ctx->journal_io);
674 ctx->journal_io = 0;
690 int e2fsck_check_ext3_journal(e2fsck_t ctx)
692 struct ext2_super_block *sb = ctx->fs->super;
694 int recover = ctx->fs->super->s_feature_incompat &
710 retval = e2fsck_get_journal(ctx, &journal);
716 return e2fsck_journal_fix_bad_inode(ctx, &pctx);
724 (!fix_problem(ctx, PR_0_JOURNAL_UNSUPP_INCOMPAT,
727 (!fix_problem(ctx, PR_0_JOURNAL_UNSUPP_ROCOMPAT,
730 (!fix_problem(ctx, PR_0_JOURNAL_UNSUPP_VERSION, &pctx))))
731 retval = e2fsck_journal_fix_corrupt_super(ctx, journal,
733 e2fsck_journal_release(ctx, journal, 0, 1);
746 if (fix_problem(ctx, PR_0_JOURNAL_HAS_JOURNAL, &pctx)) {
748 !fix_problem(ctx, PR_0_JOURNAL_RECOVER_SET, &pctx))
761 e2fsck_clear_recover(ctx, force_fsck);
762 } else if (!(ctx->options & E2F_OPT_READONLY)) {
764 ctx->fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
765 ext2fs_mark_super_dirty(ctx->fs);
773 fix_problem(ctx, PR_0_JOURNAL_RECOVERY_CLEAR, &pctx);
774 if (ctx->superblock)
778 if (fix_problem(ctx, problem, &pctx)) {
779 ctx->options |= E2F_OPT_FORCE;
782 ext2fs_mark_super_dirty(ctx->fs);
783 } else if (fix_problem(ctx,
787 ext2fs_mark_super_dirty(ctx->fs);
809 ctx->fs->super->s_state |= EXT2_ERROR_FS;
810 ext2fs_mark_super_dirty(ctx->fs);
815 e2fsck_journal_release(ctx, journal, reset, 0);
819 static errcode_t recover_ext3_journal(e2fsck_t ctx)
828 retval = e2fsck_get_journal(ctx, &journal);
846 fix_problem(ctx, PR_0_JNL_TXN_CORRUPT, &pctx);
854 e2fsck_journal_release(ctx, journal, 1, 0);
858 int e2fsck_run_ext3_journal(e2fsck_t ctx)
860 io_manager io_ptr = ctx->fs->io->manager;
861 int blocksize = ctx->fs->blocksize;
866 printf(_("%s: recovering journal\n"), ctx->device_name);
867 if (ctx->options & E2F_OPT_READONLY) {
869 ctx->device_name);
873 if (ctx->fs->flags & EXT2_FLAG_DIRTY)
874 ext2fs_flush(ctx->fs); /* Force out any modifications */
876 recover_retval = recover_ext3_journal(ctx);
882 if (ctx->fs->super->s_kbytes_written &&
883 ctx->fs->io->manager->get_stats)
884 ctx->fs->io->manager->get_stats(ctx->fs->io, &stats);
887 ext2fs_free(ctx->fs);
888 retval = ext2fs_open(ctx->filesystem_name, EXT2_FLAG_RW,
889 ctx->superblock, blocksize, io_ptr,
890 &ctx->fs);
892 com_err(ctx->program_name, retval,
894 ctx->device_name);
895 fatal_error(ctx, 0);
897 ctx->fs->priv_data = ctx;
898 ctx->fs->now = ctx->now;
899 ctx->fs->flags |= EXT2_FLAG_MASTER_SB_ONLY;
900 ctx->fs->super->s_kbytes_written += kbytes_written;
903 e2fsck_clear_recover(ctx, recover_retval);
909 retval = e2fsck_check_ext3_journal(ctx);
920 void e2fsck_move_ext3_journal(e2fsck_t ctx)
922 struct ext2_super_block *sb = ctx->fs->super;
925 ext2_filsys fs = ctx->fs;
937 if ((ctx->options & E2F_OPT_READONLY) ||
954 if (fix_problem(ctx, PR_0_BACKUP_JNL, &pctx)) {
980 retval = ext2fs_check_if_mounted(ctx->filesystem_name, &mount_flags);
1003 if (!fix_problem(ctx, PR_0_MOVE_JOURNAL, &pctx))
1019 inode.i_dtime = ctx->now;
1033 fix_problem(ctx, PR_0_ERR_MOVE_JOURNAL, &pctx);
1043 int e2fsck_fix_ext3_journal_hint(e2fsck_t ctx)
1045 struct ext2_super_block *sb = ctx->fs->super;
1055 journal_name = blkid_get_devname(ctx->blkid, "UUID", uuid);
1065 if (fix_problem(ctx, PR_0_EXTERNAL_JOURNAL_HINT, &pctx)) {
1067 ext2fs_mark_super_dirty(ctx->fs);