All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kara <jack@suse.cz>
To: Christoph Hellwig <hch@infradead.org>
Cc: tj@kernel.org, chris.mason@oracle.com, swhiteho@redhat.com,
	konishi.ryusuke@lab.ntt.co.jp, tytso@mit.edu, jack@suse.cz,
	hirofumi@mail.parknet.co.jp, mfasheh@suse.com,
	joel.becker@oracle.com, hughd@google.com,
	linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH 06/15] reiserfs: replace barriers with explicit flush / FUA usage
Date: Wed, 18 Aug 2010 15:16:27 +0200	[thread overview]
Message-ID: <20100818131627.GB4680@quack.suse.cz> (raw)
In-Reply-To: <20100818093500.807689586@bombadil.infradead.org>

On Wed 18-08-10 05:29:14, Christoph Hellwig wrote:
> Switch to the WRITE_FLUSH_FUA flag for log writes and remove the EOPNOTSUPP
> detection for barriers.  Note that reiserfs had a fairly different code
> path for barriers before as it wa the only filesystem actually making use
> of them.  The new code always uses the old non-barrier codepath and just
> sets the WRITE_FLUSH_FUA explicitly for the journal commits.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
  This one looks good to me as well.
Acked-by: Jan Kara <jack@suse.cz>

								Honza

> Index: linux-2.6/fs/reiserfs/journal.c
> ===================================================================
> --- linux-2.6.orig/fs/reiserfs/journal.c	2010-08-17 16:26:42.837261928 +0200
> +++ linux-2.6/fs/reiserfs/journal.c	2010-08-17 16:35:34.565255365 +0200
> @@ -138,13 +138,6 @@ static int reiserfs_clean_and_file_buffe
>  	return 0;
>  }
>  
> -static void disable_barrier(struct super_block *s)
> -{
> -	REISERFS_SB(s)->s_mount_opt &= ~(1 << REISERFS_BARRIER_FLUSH);
> -	printk("reiserfs: disabling flush barriers on %s\n",
> -	       reiserfs_bdevname(s));
> -}
> -
>  static struct reiserfs_bitmap_node *allocate_bitmap_node(struct super_block
>  							 *sb)
>  {
> @@ -677,30 +670,6 @@ static void submit_ordered_buffer(struct
>  	submit_bh(WRITE, bh);
>  }
>  
> -static int submit_barrier_buffer(struct buffer_head *bh)
> -{
> -	get_bh(bh);
> -	bh->b_end_io = reiserfs_end_ordered_io;
> -	clear_buffer_dirty(bh);
> -	if (!buffer_uptodate(bh))
> -		BUG();
> -	return submit_bh(WRITE_BARRIER, bh);
> -}
> -
> -static void check_barrier_completion(struct super_block *s,
> -				     struct buffer_head *bh)
> -{
> -	if (buffer_eopnotsupp(bh)) {
> -		clear_buffer_eopnotsupp(bh);
> -		disable_barrier(s);
> -		set_buffer_uptodate(bh);
> -		set_buffer_dirty(bh);
> -		reiserfs_write_unlock(s);
> -		sync_dirty_buffer(bh);
> -		reiserfs_write_lock(s);
> -	}
> -}
> -
>  #define CHUNK_SIZE 32
>  struct buffer_chunk {
>  	struct buffer_head *bh[CHUNK_SIZE];
> @@ -1010,7 +979,6 @@ static int flush_commit_list(struct supe
>  	struct buffer_head *tbh = NULL;
>  	unsigned int trans_id = jl->j_trans_id;
>  	struct reiserfs_journal *journal = SB_JOURNAL(s);
> -	int barrier = 0;
>  	int retval = 0;
>  	int write_len;
>  
> @@ -1095,24 +1063,6 @@ static int flush_commit_list(struct supe
>  	}
>  	atomic_dec(&journal->j_async_throttle);
>  
> -	/* We're skipping the commit if there's an error */
> -	if (retval || reiserfs_is_journal_aborted(journal))
> -		barrier = 0;
> -
> -	/* wait on everything written so far before writing the commit
> -	 * if we are in barrier mode, send the commit down now
> -	 */
> -	barrier = reiserfs_barrier_flush(s);
> -	if (barrier) {
> -		int ret;
> -		lock_buffer(jl->j_commit_bh);
> -		ret = submit_barrier_buffer(jl->j_commit_bh);
> -		if (ret == -EOPNOTSUPP) {
> -			set_buffer_uptodate(jl->j_commit_bh);
> -			disable_barrier(s);
> -			barrier = 0;
> -		}
> -	}
>  	for (i = 0; i < (jl->j_len + 1); i++) {
>  		bn = SB_ONDISK_JOURNAL_1st_BLOCK(s) +
>  		    (jl->j_start + i) % SB_ONDISK_JOURNAL_SIZE(s);
> @@ -1144,27 +1094,22 @@ static int flush_commit_list(struct supe
>  
>  	BUG_ON(atomic_read(&(jl->j_commit_left)) != 1);
>  
> -	if (!barrier) {
> -		/* If there was a write error in the journal - we can't commit
> -		 * this transaction - it will be invalid and, if successful,
> -		 * will just end up propagating the write error out to
> -		 * the file system. */
> -		if (likely(!retval && !reiserfs_is_journal_aborted (journal))) {
> -			if (buffer_dirty(jl->j_commit_bh))
> -				BUG();
> -			mark_buffer_dirty(jl->j_commit_bh) ;
> -			reiserfs_write_unlock(s);
> -			sync_dirty_buffer(jl->j_commit_bh) ;
> -			reiserfs_write_lock(s);
> -		}
> -	} else {
> +	/* If there was a write error in the journal - we can't commit
> +	 * this transaction - it will be invalid and, if successful,
> +	 * will just end up propagating the write error out to
> +	 * the file system. */
> +	if (likely(!retval && !reiserfs_is_journal_aborted (journal))) {
> +		if (buffer_dirty(jl->j_commit_bh))
> +			BUG();
> +		mark_buffer_dirty(jl->j_commit_bh) ;
>  		reiserfs_write_unlock(s);
> -		wait_on_buffer(jl->j_commit_bh);
> +		if (reiserfs_barrier_flush(s))
> +			__sync_dirty_buffer(jl->j_commit_bh, WRITE_FLUSH_FUA);
> +		else
> +			sync_dirty_buffer(jl->j_commit_bh);
>  		reiserfs_write_lock(s);
>  	}
>  
> -	check_barrier_completion(s, jl->j_commit_bh);
> -
>  	/* If there was a write error in the journal - we can't commit this
>  	 * transaction - it will be invalid and, if successful, will just end
>  	 * up propagating the write error out to the filesystem. */
> @@ -1320,26 +1265,15 @@ static int _update_journal_header_block(
>  		jh->j_first_unflushed_offset = cpu_to_le32(offset);
>  		jh->j_mount_id = cpu_to_le32(journal->j_mount_id);
>  
> -		if (reiserfs_barrier_flush(sb)) {
> -			int ret;
> -			lock_buffer(journal->j_header_bh);
> -			ret = submit_barrier_buffer(journal->j_header_bh);
> -			if (ret == -EOPNOTSUPP) {
> -				set_buffer_uptodate(journal->j_header_bh);
> -				disable_barrier(sb);
> -				goto sync;
> -			}
> -			reiserfs_write_unlock(sb);
> -			wait_on_buffer(journal->j_header_bh);
> -			reiserfs_write_lock(sb);
> -			check_barrier_completion(sb, journal->j_header_bh);
> -		} else {
> -		      sync:
> -			set_buffer_dirty(journal->j_header_bh);
> -			reiserfs_write_unlock(sb);
> +		set_buffer_dirty(journal->j_header_bh);
> +		reiserfs_write_unlock(sb);
> +
> +		if (reiserfs_barrier_flush(sb))
> +			__sync_dirty_buffer(journal->j_header_bh, WRITE_FLUSH_FUA);
> +		else
>  			sync_dirty_buffer(journal->j_header_bh);
> -			reiserfs_write_lock(sb);
> -		}
> +
> +		reiserfs_write_lock(sb);
>  		if (!buffer_uptodate(journal->j_header_bh)) {
>  			reiserfs_warning(sb, "journal-837",
>  					 "IO error during journal replay");
> 
-- 
Jan Kara <jack@suse.cz>
SUSE Labs, CR

  reply	other threads:[~2010-08-18 13:17 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-18  9:29 [PATCH 00/15] replace barriers with explicit flush / FUA usage Christoph Hellwig
2010-08-18  9:29 ` [PATCH 01/15] kill BH_Ordered flag Christoph Hellwig
2010-08-18  9:29 ` [PATCH 02/15] pass gfp_mask and flags to sb_issue_discard Christoph Hellwig
2010-08-20  1:23   ` Mike Snitzer
2010-08-18  9:29 ` [PATCH 03/15] xfs: replace barriers with explicit flush / FUA usage Christoph Hellwig
2010-08-18 23:47   ` Dave Chinner
2010-08-18  9:29 ` [PATCH 04/15] btrfs: " Christoph Hellwig
2010-08-18 12:06   ` Chris Mason
2010-08-18  9:29 ` [PATCH 05/15] gfs2: " Christoph Hellwig
2010-08-18 10:08   ` Steven Whitehouse
2010-08-18 13:37   ` Bob Peterson
2010-08-18  9:29 ` [PATCH 06/15] reiserfs: " Christoph Hellwig
2010-08-18 13:16   ` Jan Kara [this message]
2010-08-18 13:21     ` Chris Mason
2010-08-18  9:29 ` [PATCH 07/15] nilfs2: " Christoph Hellwig
2010-08-18 13:31   ` Ryusuke Konishi
2010-08-18 13:41     ` Christoph Hellwig
2010-08-18  9:29 ` [PATCH 08/15] jbd: " Christoph Hellwig
2010-08-18 13:07   ` Jan Kara
2010-08-18  9:29 ` [PATCH 09/15] jbd2: " Christoph Hellwig
2010-08-18 14:03   ` Jan Kara
2010-08-18 14:09     ` Christoph Hellwig
2010-08-18  9:29 ` [PATCH 10/15] ext4: do not send discards as barriers Christoph Hellwig
2010-08-18 13:28   ` Jan Kara
2010-08-18  9:29 ` [PATCH 11/15] fat: " Christoph Hellwig
2010-08-18  9:29 ` [PATCH 12/15] swap: " Christoph Hellwig
2010-08-19  3:47   ` Hugh Dickins
2010-08-19  4:08     ` Nigel Cunningham
2010-08-19  9:02     ` Christoph Hellwig
2010-08-19 11:35       ` Chris Mason
2010-08-22 12:20     ` Nigel Cunningham
2010-08-18  9:29 ` [PATCH 13/15] remove the WRITE_BARRIER flag Christoph Hellwig
2010-08-18  9:29 ` [PATCH 14/15] remove the BLKDEV_IFL_BARRIER flag Christoph Hellwig
2010-08-20  1:26   ` Mike Snitzer
2010-08-18  9:29 ` [PATCH 15/15] remove the BH_Eopnotsupp flag Christoph Hellwig
2010-08-18 10:35 ` [PATCH 00/15] replace barriers with explicit flush / FUA usage Joel Becker
2010-08-18 10:53   ` Christoph Hellwig
2010-08-20  6:50     ` Tao Ma
2010-08-18 15:11 ` Ted Ts'o
2010-08-18 16:46   ` Christoph Hellwig
2010-08-20  4:00 ` Tao Ma

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=20100818131627.GB4680@quack.suse.cz \
    --to=jack@suse.cz \
    --cc=chris.mason@oracle.com \
    --cc=hch@infradead.org \
    --cc=hirofumi@mail.parknet.co.jp \
    --cc=hughd@google.com \
    --cc=joel.becker@oracle.com \
    --cc=konishi.ryusuke@lab.ntt.co.jp \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=mfasheh@suse.com \
    --cc=swhiteho@redhat.com \
    --cc=tj@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.