lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Mon, 18 Sep 2023 17:43:26 -0600
From:   Andreas Dilger <adilger@...ger.ca>
To:     Alexey Lyashkov <alexey.lyashkov@...il.com>
Cc:     Ext4 Developers List <linux-ext4@...r.kernel.org>,
        Theodore Ts'o <tytso@....edu>,
        Artem Blagodarenko <artem.blagodarenko@...il.com>
Subject: Re: [PATCH 3/5] kill a ctx->journal_io

On Aug 4, 2022, at 3:56 AM, Alexey Lyashkov <alexey.lyashkov@...il.com> 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@...ger.ca>


> ---
> 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






Download attachment "signature.asc" of type "application/pgp-signature" (874 bytes)

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ