On Aug 4, 2022, at 3:56 AM, Alexey Lyashkov <alexey.lyashkov@xxxxxxxxx> wrote: > > replace a e2fsck own code, with generic one to use > an fs->journal_io. Missing Signed-off-by: line, but otherwise looks fine. Reviewed-by: Andreas Dilger <adilger@xxxxxxxxx> > --- > debugfs/journal.c | 34 --------------------------- > e2fsck/e2fsck.c | 6 +---- > e2fsck/e2fsck.h | 1 - > e2fsck/journal.c | 53 +++++++----------------------------------- > lib/support/jfs_user.c | 39 +++++++++++++++++++++++++++++++ > lib/support/jfs_user.h | 2 ++ > 6 files changed, 50 insertions(+), 85 deletions(-) > > diff --git a/debugfs/journal.c b/debugfs/journal.c > index dac17800..202312fe 100644 > --- a/debugfs/journal.c > +++ b/debugfs/journal.c > @@ -590,40 +590,6 @@ static errcode_t ext2fs_journal_load(journal_t *journal) > return 0; > } > > -static void ext2fs_journal_release(ext2_filsys fs, journal_t *journal, > - int reset, int drop) > -{ > - journal_superblock_t *jsb; > - > - if (drop) > - mark_buffer_clean(journal->j_sb_buffer); > - else if (fs->flags & EXT2_FLAG_RW) { > - jsb = journal->j_superblock; > - jsb->s_sequence = htonl(journal->j_tail_sequence); > - if (reset) > - jsb->s_start = 0; /* this marks the journal as empty */ > - ext2fs_journal_sb_csum_set(journal, jsb); > - mark_buffer_dirty(journal->j_sb_buffer); > - } > - brelse(journal->j_sb_buffer); > - > - if (fs && fs->journal_io) { > - if (fs->io != fs->journal_io) > - io_channel_close(fs->journal_io); > - fs->journal_io = NULL; > - free(fs->journal_name); > - fs->journal_name = NULL; > - } > - > -#ifndef USE_INODE_IO > - if (journal->j_inode) > - ext2fs_free_mem(&journal->j_inode); > -#endif > - if (journal->j_fs_dev) > - ext2fs_free_mem(&journal->j_fs_dev); > - ext2fs_free_mem(&journal); > -} > - > /* > * This function makes sure that the superblock fields regarding the > * journal are consistent. > diff --git a/e2fsck/e2fsck.c b/e2fsck/e2fsck.c > index 1e295e3e..421ef4a9 100644 > --- a/e2fsck/e2fsck.c > +++ b/e2fsck/e2fsck.c > @@ -83,11 +83,7 @@ errcode_t e2fsck_reset_context(e2fsck_t ctx) > ext2fs_free_icount(ctx->inode_link_info); > ctx->inode_link_info = 0; > } > - if (ctx->journal_io) { > - if (ctx->fs && ctx->fs->io != ctx->journal_io) > - io_channel_close(ctx->journal_io); > - ctx->journal_io = 0; > - } > + > if (ctx->fs && ctx->fs->dblist) { > ext2fs_free_dblist(ctx->fs->dblist); > ctx->fs->dblist = 0; > diff --git a/e2fsck/e2fsck.h b/e2fsck/e2fsck.h > index 2db216f5..33334781 100644 > --- a/e2fsck/e2fsck.h > +++ b/e2fsck/e2fsck.h > @@ -380,7 +380,6 @@ struct e2fsck_struct { > /* > * ext3 journal support > */ > - io_channel journal_io; > char *journal_name; > > /* > diff --git a/e2fsck/journal.c b/e2fsck/journal.c > index 46a9bcb7..682d82a4 100644 > --- a/e2fsck/journal.c > +++ b/e2fsck/journal.c > @@ -86,7 +86,7 @@ struct buffer_head *getblk(kdev_t kdev, unsigned long long blocknr, > if (kdev->k_dev == K_DEV_FS) > bh->b_io = kdev->k_ctx->fs->io; > else > - bh->b_io = kdev->k_ctx->journal_io; > + bh->b_io = kdev->k_ctx->fs->journal_io; > bh->b_size = blocksize; > bh->b_blocknr = blocknr; > > @@ -100,7 +100,7 @@ int sync_blockdev(kdev_t kdev) > if (kdev->k_dev == K_DEV_FS) > io = kdev->k_ctx->fs->io; > else > - io = kdev->k_ctx->journal_io; > + io = kdev->k_ctx->fs->journal_io; > > return io_channel_flush(io) ? -EIO : 0; > } > @@ -156,11 +156,6 @@ void mark_buffer_dirty(struct buffer_head *bh) > bh->b_dirty = 1; > } > > -static void mark_buffer_clean(struct buffer_head * bh) > -{ > - bh->b_dirty = 0; > -} > - > void brelse(struct buffer_head *bh) > { > if (bh->b_dirty) > @@ -1011,7 +1006,7 @@ static errcode_t e2fsck_get_journal(e2fsck_t ctx, journal_t **ret_journal) > io_ptr = inode_io_manager; > #else > journal->j_inode = j_inode; > - ctx->journal_io = ctx->fs->io; > + ctx->fs->journal_io = ctx->fs->io; > if ((ret = jbd2_journal_bmap(journal, 0, &start)) != 0) { > retval = (errcode_t) (-1 * ret); > goto errout; > @@ -1058,12 +1053,12 @@ static errcode_t e2fsck_get_journal(e2fsck_t ctx, journal_t **ret_journal) > > > retval = io_ptr->open(journal_name, flags, > - &ctx->journal_io); > + &ctx->fs->journal_io); > } > if (retval) > goto errout; > > - io_channel_set_blksize(ctx->journal_io, ctx->fs->blocksize); > + io_channel_set_blksize(ctx->fs->journal_io, ctx->fs->blocksize); > > if (ext_journal) { > blk64_t maxlen; > @@ -1397,38 +1392,6 @@ static errcode_t e2fsck_journal_fix_corrupt_super(e2fsck_t ctx, > return 0; > } > > -static void e2fsck_journal_release(e2fsck_t ctx, journal_t *journal, > - int reset, int drop) > -{ > - journal_superblock_t *jsb; > - > - if (drop) > - mark_buffer_clean(journal->j_sb_buffer); > - else if (!(ctx->options & E2F_OPT_READONLY)) { > - jsb = journal->j_superblock; > - jsb->s_sequence = htonl(journal->j_tail_sequence); > - if (reset) > - jsb->s_start = 0; /* this marks the journal as empty */ > - ext2fs_journal_sb_csum_set(journal, jsb); > - mark_buffer_dirty(journal->j_sb_buffer); > - } > - brelse(journal->j_sb_buffer); > - > - if (ctx->journal_io) { > - if (ctx->fs && ctx->fs->io != ctx->journal_io) > - io_channel_close(ctx->journal_io); > - ctx->journal_io = 0; > - } > - > -#ifndef USE_INODE_IO > - if (journal->j_inode) > - ext2fs_free_mem(&journal->j_inode); > -#endif > - if (journal->j_fs_dev) > - ext2fs_free_mem(&journal->j_fs_dev); > - ext2fs_free_mem(&journal); > -} > - > /* > * This function makes sure that the superblock fields regarding the > * journal are consistent. > @@ -1475,7 +1438,7 @@ errcode_t e2fsck_check_ext3_journal(e2fsck_t ctx) > (!fix_problem(ctx, PR_0_JOURNAL_UNSUPP_VERSION, &pctx)))) > retval = e2fsck_journal_fix_corrupt_super(ctx, journal, > &pctx); > - e2fsck_journal_release(ctx, journal, 0, 1); > + ext2fs_journal_release(ctx->fs, journal, 0, 1); > return retval; > } > > @@ -1556,7 +1519,7 @@ no_has_journal: > mark_buffer_dirty(journal->j_sb_buffer); > } > > - e2fsck_journal_release(ctx, journal, reset, 0); > + ext2fs_journal_release(ctx->fs, journal, reset, 0); > return retval; > } > > @@ -1605,7 +1568,7 @@ errout: > jbd2_journal_destroy_revoke(journal); > jbd2_journal_destroy_revoke_record_cache(); > jbd2_journal_destroy_revoke_table_cache(); > - e2fsck_journal_release(ctx, journal, 1, 0); > + ext2fs_journal_release(ctx->fs, journal, 1, 0); > return retval; > } > > diff --git a/lib/support/jfs_user.c b/lib/support/jfs_user.c > index 4ff1b5c1..d8a2f842 100644 > --- a/lib/support/jfs_user.c > +++ b/lib/support/jfs_user.c > @@ -60,3 +60,42 @@ errcode_t ext2fs_journal_sb_csum_set(journal_t *j, > return 0; > } > > + > +static void mark_buffer_clean(struct buffer_head * bh) > +{ > + bh->b_dirty = 0; > +} > + > +void ext2fs_journal_release(ext2_filsys fs, journal_t *journal, > + int reset, int drop) > +{ > + journal_superblock_t *jsb; > + > + if (drop) > + mark_buffer_clean(journal->j_sb_buffer); > + else if (fs->flags & EXT2_FLAG_RW) { > + jsb = journal->j_superblock; > + jsb->s_sequence = htonl(journal->j_tail_sequence); > + if (reset) > + jsb->s_start = 0; /* this marks the journal as empty */ > + ext2fs_journal_sb_csum_set(journal, jsb); > + mark_buffer_dirty(journal->j_sb_buffer); > + } > + brelse(journal->j_sb_buffer); > + > + if (fs && fs->journal_io) { > + if (fs->io != fs->journal_io) > + io_channel_close(fs->journal_io); > + fs->journal_io = NULL; > + free(fs->journal_name); > + fs->journal_name = NULL; > + } > + > +#ifndef USE_INODE_IO > + if (journal->j_inode) > + ext2fs_free_mem(&journal->j_inode); > +#endif > + if (journal->j_fs_dev) > + ext2fs_free_mem(&journal->j_fs_dev); > + ext2fs_free_mem(&journal); > +} > diff --git a/lib/support/jfs_user.h b/lib/support/jfs_user.h > index 8bdbf85b..b9c2fa54 100644 > --- a/lib/support/jfs_user.h > +++ b/lib/support/jfs_user.h > @@ -217,6 +217,8 @@ int ext2fs_journal_verify_csum_type(journal_t *j, journal_superblock_t *jsb); > __u32 ext2fs_journal_sb_csum(journal_superblock_t *jsb); > int ext2fs_journal_sb_csum_verify(journal_t *j, journal_superblock_t *jsb); > errcode_t ext2fs_journal_sb_csum_set(journal_t *j, journal_superblock_t *jsb); > +void ext2fs_journal_release(ext2_filsys fs, journal_t *journal, int reset, > + int drop); > > /* > * Kernel compatibility functions are defined in journal.c > -- > 2.31.1 > Cheers, Andreas
Attachment:
signature.asc
Description: Message signed with OpenPGP