public inbox for linux-ext4@vger.kernel.org
 help / color / mirror / Atom feed
From: Alexey Lyahkov <alexey.lyashkov@gmail.com>
To: Lukas Czerner <lczerner@redhat.com>
Cc: linux-ext4 <linux-ext4@vger.kernel.org>,
	Theodore Ts'o <tytso@mit.edu>, Andreas Dilger <adilger@dilger.ca>,
	Artem Blagodarenko <artem.blagodarenko@gmail.com>
Subject: Re: [PATCH] e2fsprogs: avoid code duplication
Date: Wed, 3 Aug 2022 20:00:50 +0300	[thread overview]
Message-ID: <39DA7EBB-8155-4557-83EC-BB6BFBBDB72E@gmail.com> (raw)
In-Reply-To: <20220803163927.ugc7qdxfsehsks3b@fedora>

Hi Lukas,

It don’t have any improvement. It have changes a prototype in the e2fsck to use a generic types,
instead of home coded as similar as debugfs does. Removing ctx->journal needs for same reason.
(as generic code have work with ext2fs
 
I started this work to make debugfs work fine with journal dump and modifications.
Originally, I found tag v3 isn’t work well with journal dump (large block numbers truncated),
checksums isn’t checked well with dump, … etc.
Loading journal have a lack init for structures related to the fast commit.
 

> On 3 Aug 2022, at 19:39, Lukas Czerner <lczerner@redhat.com> wrote:
> 
> Hi Alexey,
> 
> I assume this change is based on the maint branch?
> 
> On Wed, Aug 03, 2022 at 10:54:07AM +0300, Alexey Lyashkov wrote:
>> debugfs and e2fsck have a so much code duplication in journal handing.
>> debugfs have lack a many journal features handing also.
>> Let's start code merging to avoid code duplication and lack features.
>> 
>> userspace buffer head emulation moved into library.
> 
> I can see that this is a little bit more involved than just moving the
> code, can you describe a little bit more what has to be done in order to
> move and deduplicate the code? I have not done a proper review but I can
> already see that the function prototypes are changing as well as some
> structures. I think it would be nice to get some idea from the commit
> description what to expect from this change.
> 
> I've done some limited testing on this and I see no regression.
> 
>> 
>> Signed-off-by: Alexey Lyashkov <alexey.lyashkov@gmail.com>
>> ---
>> debugfs/Makefile.in               |  14 +-
>> debugfs/debugfs.c                 |   2 +-
>> debugfs/journal.c                 | 251 ---------------------------
>> debugfs/journal.h                 |   2 +-
>> debugfs/logdump.c                 |   2 +-
>> e2fsck/Makefile.in                |   8 +-
>> e2fsck/e2fsck.c                   |   5 -
>> e2fsck/e2fsck.h                   |   1 -
>> e2fsck/journal.c                  | 278 ++----------------------------
>> e2fsck/logfile.c                  |   2 +-
>> e2fsck/recovery.c                 |   2 +-
>> e2fsck/revoke.c                   |   2 +-
>> e2fsck/unix.c                     |   4 +-
>> e2fsck/util.c                     |   2 +-
>> lib/ext2fs/Android.bp             |   1 +
>> lib/ext2fs/Makefile.in            |  23 +--
>> lib/ext2fs/jfs_user.c             | 255 +++++++++++++++++++++++++++
>> {e2fsck => lib/ext2fs}/jfs_user.h |  55 +++---
> 
> Can we perhaps take the opportunity to rename jfs_user to journal? I
> know it was historically this way, but it can we a bit confusing these
> days, especially when we actually have jfs file system.

I do it originally but… it conflicts with journal.c from e2fsck.
And this code handle just kernel API emulation now.


> 
> More below...
>> 
>> -
>> -}
>> -
>> /*
>>  * This function makes sure that the superblock fields regarding the
>>  * journal are consistent.
>> @@ -1525,7 +1285,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;
>> 	}
>> 
>> @@ -1552,7 +1312,7 @@ no_has_journal:
>> 			sb->s_journal_dev = 0;
>> 			memset(sb->s_journal_uuid, 0,
>> 			       sizeof(sb->s_journal_uuid));
>> -			e2fsck_clear_recover(ctx, force_fsck);
>> +			ext2fs_clear_recover(ctx->fs, force_fsck);
> 
> This is the kind of function prototype change I'd like to be mentioned
> in the description. Just to make it easier for reviewer today and for
> the future.
> 
I may put a wrappers who just call ext2fs_* functions if it will be help with review.
It will have just ctx->fs call inside.
>> 
>> 
>> /* Command line options */
>> @@ -66,7 +66,7 @@ static int replace_bad_blocks;
>> static int keep_bad_blocks;
>> static char *bad_blocks_file;
>> 
>> -e2fsck_t e2fsck_global_ctx;	/* Try your very best not to use this! */
>> +struct e2fsck_struct *e2fsck_global_ctx;	/* Try your very best not to use this! */
> 
> Why is this necessary? I am just curious.
> 
Using a pointer to structure make a full structure definition unnecessary.
So I can do

extern struct data *ptr;
some_call(ptr); 

Without teach source about struct data itself.
It’s a specially for the jfs_user.h and J_ASSERT() implementation.

>> diff --git a/e2fsck/jfs_user.h b/lib/ext2fs/jfs_user.h
>> similarity index 89%
>> rename from e2fsck/jfs_user.h
>> rename to lib/ext2fs/jfs_user.h
>> index 4ad2005a..ed75c4a5 100644
>> --- a/e2fsck/jfs_user.h
>> +++ b/lib/ext2fs/jfs_user.h
>> @@ -11,7 +11,6 @@
>> #ifndef _JFS_USER_H
>> #define _JFS_USER_H
>> 
>> -#ifdef DEBUGFS
>> #include <stdio.h>
>> #include <stdlib.h>
>> #if EXT2_FLAT_INCLUDES
>> @@ -23,13 +22,8 @@
>> #include "ext2fs/ext2fs.h"
>> #include "blkid/blkid.h"
>> #endif
>> -#else
>> -/*
>> - * Pull in the definition of the e2fsck context structure
>> - */
>> -#include "config.h"
>> -#include "e2fsck.h"
>> -#endif
>> +
>> +struct e2fsck_struct;
>> 
>> #if __STDC_VERSION__ < 199901L
>> # if __GNUC__ >= 2 || _MSC_VER >= 1300
>> @@ -40,11 +34,8 @@
>> #endif
>> 
>> struct buffer_head {
>> -#ifdef DEBUGFS
>> 	ext2_filsys	b_fs;
>> -#else
>> -	e2fsck_t	b_ctx;
>> -#endif
>> +	struct e2fsck_struct *b_ctx;
> 
> Do we need to have both k_ctx and k_fs? Can we use union instead, or is
> not worth it?
> 
I think better to have both, in some cases e2fsck looks to the own context attached to these structures.
I’m not a very understand this part - and probably it will be removed in future.

> 
>> 
>> # This nastiness is needed because of jfs_user.h hackery; when we finally
>> # clean up this mess, we should be able to drop it
>> -JOURNAL_CFLAGS = -I$(srcdir)/../e2fsck $(ALL_CFLAGS) -DDEBUGFS
>> -DEPEND_CFLAGS = -I$(top_srcdir)/e2fsck
>> +JOURNAL_CFLAGS = $(ALL_CFLAGS) -DDEBUGFS
>> +DEPEND_CFLAGS = 
>                  ^
> You have a trailing whitespace here.

Thanks! Will fix it. It looks comment can removed also.

Alex

> 
> Thanks!
> -Lukas
> 
>> 
>> .
>> -- 
>> 2.31.1
>> 
> 


  reply	other threads:[~2022-08-03 17:00 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-03  7:54 [PATCH] e2fsprogs: avoid code duplication Alexey Lyashkov
2022-08-03 16:39 ` Lukas Czerner
2022-08-03 17:00   ` Alexey Lyahkov [this message]
2022-08-03 19:58 ` Theodore Ts'o
2022-08-03 21:52   ` Alexey Lyahkov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=39DA7EBB-8155-4557-83EC-BB6BFBBDB72E@gmail.com \
    --to=alexey.lyashkov@gmail.com \
    --cc=adilger@dilger.ca \
    --cc=artem.blagodarenko@gmail.com \
    --cc=lczerner@redhat.com \
    --cc=linux-ext4@vger.kernel.org \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox