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]
Message-ID: <20150420090720.GB3117@quack.suse.cz>
Date:	Mon, 20 Apr 2015 11:07:20 +0200
From:	Jan Kara <jack@...e.cz>
To:	Andreas Dilger <adilger@...ger.ca>
Cc:	Jan Kara <jack@...e.cz>, linux-ext4@...r.kernel.org
Subject: Re: [PATCH 1/3] ext4: Support for checksumming from journal triggers

On Fri 17-04-15 13:00:32, Andreas Dilger wrote:
> On Apr 16, 2015, at 9:42 AM, Jan Kara <jack@...e.cz> wrote:
> > 
> > JBD2 layer support triggers which are called when journaling layer moves
> > buffer to a certain state. We can use the frozen trigger, which gets
> > called when buffer data is frozen and about to be written out to the
> > journal, to compute block checksums for some buffer types (similarly as
> > does ocfs2). This avoids unnecessary repeated recomputation of the
> > checksum (at the cost of larger window where memory corruption won't be
> > caught by checksumming) and is even necessary when there are
> > unsynchronized updaters of the checksummed data.
> > 
> > So add argument to ext4_journal_get_write_access() and
> > ext4_journal_get_create_access() which describes buffer type so that
> > triggers can be set accordingly. This patch is mostly only a change of
> > prototype of the above mentioned functions and a few small helpers. Real
> > checksumming will come later.
> > 
> > Signed-off-by: Jan Kara <jack@...e.cz>
> > ---
> > fs/ext4/ext4.h      | 26 ++++++++++++++++++--
> > fs/ext4/ext4_jbd2.c | 50 +++++++++++++++++++++++++------------
> > fs/ext4/ext4_jbd2.h | 18 +++++++++-----
> > fs/ext4/extents.c   | 10 +++++---
> > fs/ext4/file.c      |  3 ++-
> > fs/ext4/ialloc.c    | 15 +++++------
> > fs/ext4/indirect.c  | 16 ++++++++----
> > fs/ext4/inline.c    | 19 ++++++++------
> > fs/ext4/inode.c     | 71 +++++++++++++++++++++++++++++++----------------------
> > fs/ext4/mballoc.c   | 12 ++++-----
> > fs/ext4/namei.c     | 39 +++++++++++++++++------------
> > fs/ext4/resize.c    | 32 ++++++++++++++----------
> > fs/ext4/super.c     | 16 +++++++++++-
> > fs/ext4/xattr.c     | 15 +++++++----
> > 14 files changed, 223 insertions(+), 119 deletions(-)
> > 
> > diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
> > index f63c3d5805c4..abed83485915 100644
> > --- a/fs/ext4/ext4.h
> > +++ b/fs/ext4/ext4.h
> > @@ -1186,6 +1186,24 @@ struct ext4_super_block {
> > /* Number of quota types we support */
> > #define EXT4_MAXQUOTAS 2
> > 
> > +/* Types of ext4 journal triggers */
> > +enum ext4_journal_trigger_type {
> > +	TR_NONE
> > +};
> 
> Probably good if this has an EXT4_ prefix to avoid name clashes?
  OK.

> > +
> > +#define EXT4_JOURNAL_TRIGGER_COUNT TR_NONE
> 
> This should just be added after TR_NONE so that it is always correct:
> 
> enum ext4_journal_trigger_type {
> 	EXT4_JTR_NONE,
> 	EXT4_JTR_MAX,
> };
  So my idea was that EXT4_JTR_NONE would always be the last one (it has to
be so that indexing properly works - but that deserves a comment I agree) and
thus EXT4_JOURNAL_TRIGGER_COUNT is always correct.

> and the s_journal_triggers[] array would use EXT4_JTR_MAX - 1?
> 
> > +struct ext4_journal_trigger {
> > +	struct jbd2_buffer_trigger_type tr_triggers;
> > +	struct super_block *sb;
> > +};
> > +
> > +static inline struct ext4_journal_trigger *EXT4_TRIGGER(
> > +				struct jbd2_buffer_trigger_type *trigger)
> > +{
> > +	return container_of(trigger, struct ext4_journal_trigger, tr_triggers);
> > +}
> > +
> > /*
> >  * fourth extended-fs super-block data in memory
> >  */
> > @@ -1347,6 +1365,9 @@ struct ext4_sb_info {
> > 	struct mb_cache *s_mb_cache;
> > 	spinlock_t s_es_lock ____cacheline_aligned_in_smp;
> > 
> > +	/* Journal triggers for checksum computation */
> > +	struct ext4_journal_trigger s_journal_triggers[EXT4_JOURNAL_TRIGGER_COUNT];
> > +
> > 	/* Ratelimit ext4 messages. */
> > 	struct ratelimit_state s_err_ratelimit_state;
> > 	struct ratelimit_state s_warning_ratelimit_state;
> > @@ -2108,13 +2129,14 @@ int ext4_get_block(struct inode *inode, sector_t iblock,
> > int ext4_da_get_block_prep(struct inode *inode, sector_t iblock,
> > 			   struct buffer_head *bh, int create);
> > int ext4_walk_page_buffers(handle_t *handle,
> > +		 	   struct inode *inode,
> > 			   struct buffer_head *head,
> > 			   unsigned from,
> > 			   unsigned to,
> > 			   int *partial,
> > -			   int (*fn)(handle_t *handle,
> > +			   int (*fn)(handle_t *handle, struct inode *inode,
> > 				     struct buffer_head *bh));
> > -int do_journal_get_write_access(handle_t *handle,
> > +int do_journal_get_write_access(handle_t *handle, struct inode *inode,
> > 				struct buffer_head *bh);
> > #define FALL_BACK_TO_NONDELALLOC 1
> > #define CONVERT_INLINE_DATA	 2
> > diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c
> > index 3445035c7e01..f5ac40942f5a 100644
> > --- a/fs/ext4/ext4_jbd2.c
> > +++ b/fs/ext4/ext4_jbd2.c
> > @@ -148,19 +148,28 @@ static void ext4_journal_abort_handle(const char *caller, unsigned int line,
> > }
> > 
> > int __ext4_journal_get_write_access(const char *where, unsigned int line,
> > -				    handle_t *handle, struct buffer_head *bh)
> > +				    handle_t *handle, struct super_block *sb,
> > +				    struct buffer_head *bh,
> > +				    enum ext4_journal_trigger_type trigger_type)
> > {
> > -	int err = 0;
> > +	int err;
> > 
> > 	might_sleep();
> > 
> > -	if (ext4_handle_valid(handle)) {
> > -		err = jbd2_journal_get_write_access(handle, bh);
> > -		if (err)
> > -			ext4_journal_abort_handle(where, line, __func__, bh,
> > -						  handle, err);
> > +	if (!ext4_handle_valid(handle))
> > +		return 0;
> > +
> > +	err = jbd2_journal_get_write_access(handle, bh);
> > +	if (err) {
> > +		ext4_journal_abort_handle(where, line, __func__, bh, handle,
> > +					  err);
> > +		return err;
> > 	}
> > -	return err;
> > +	if (trigger_type == TR_NONE || !ext4_has_metadata_csum(sb))
> > +		return 0;
> 
> Should this add a check for trigger_type >= EXT4_JTR_MAX?  WARN_ON?
  OK, I'll add that. Thanks for review.

								Honza
-- 
Jan Kara <jack@...e.cz>
SUSE Labs, CR
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ