mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Jan Kara <jack@suse.cz>
To: "Fernando Luis Vázquez Cao" <fernando@oss.ntt.co.jp>
Cc: Theodore Tso <tytso@MIT.EDU>, Jan Kara <jack@suse.cz>,
	Alan Cox <alan@lxorguk.ukuu.org.uk>, Pavel Machek <pavel@suse.cz>,
	kernel list <linux-kernel@vger.kernel.org>,
	Jens Axboe <jens.axboe@oracle.com>,
	sandeen@redhat.com
Subject: Re: ext2 + -osync: not as easy as it seems
Date: Fri, 16 Jan 2009 00:45:44 +0100	[thread overview]
Message-ID: <20090115234544.GA7579@duck.suse.cz> (raw)
In-Reply-To: <1232021211.14626.19.camel@sebastian.kern.oss.ntt.co.jp>

On Thu 15-01-09 21:06:51, Fernando Luis Vázquez Cao wrote:
> On Wed, 2009-01-14 at 11:59 -0500, Theodore Tso wrote: 
> > On Wed, Jan 14, 2009 at 03:37:56PM +0100, Jan Kara wrote:
> > > > Um, we have that already; the sync_inode() followed by
> > > > blkdev_issue_flush() is the path taken by fdatasync(), I do believe.
> > >
> > >   Maybe ext4-patch-queue changes that area but in Linus's tree I see:
> > > 
> > >   if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
> > >          goto out;
> > > 
> > >   So if we just overwrite some data, we send them to disk via fdatawrite()
> > > and then we quickly bail out from ext4_sync_file() without doing
> > > blkdev_issue_flush().
> > 
> > So you're thinking about fdatawrite() being called by some code path
> > other than ext4_sync_file() before we call fsync()?  Yeah, that could
> > happen....  I think that will only happen if the file is opened
> > O_SYNC, but that raises another issue, which is that we're not forcing
> > a flush for writes when the file is opened O_SYNC.
> 
> Hi Jan, Ted
> 
> Is something like the patch below what you had in mind?
> 
> --
> 
> From: Fernando Luis Vazquez Cao <fernando@oss.ntt.co.jp>
> Subject: ext3: call blkdev_issue_flush on fsync
> 
> To ensure that bits are truly on-disk after an fsync or fdatasync, we
> should call blkdev_issue_flush if barriers are supported.
> 
> Signed-off-by: Fernando Luis Vazquez Cao <fernando@oss.ntt.co.jp>
> ---
> 
> --- linux-2.6.29-rc1-orig/fs/ext4/fsync.c	2008-12-25 08:26:37.000000000 +0900
> +++ linux-2.6.29-rc1/fs/ext4/fsync.c	2009-01-15 21:03:19.000000000 +0900
> @@ -48,6 +48,7 @@ int ext4_sync_file(struct file *file, st
>  {
>  	struct inode *inode = dentry->d_inode;
>  	journal_t *journal = EXT4_SB(inode->i_sb)->s_journal;
> +	unsigned long i_state = inode->i_state;
>  	int ret = 0;
>  
>  	J_ASSERT(ext4_journal_current_handle() == NULL);
> @@ -79,22 +80,35 @@ int ext4_sync_file(struct file *file, st
>  		goto out;
>  	}
>  
> -	if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
> -		goto out;
> +	if (datasync && !(i_state & I_DIRTY_DATASYNC))
> +		goto flush_blkdev;
>  
>  	/*
>  	 * The VFS has written the file data.  If the inode is unaltered
>  	 * then we need not start a commit.
>  	 */
> -	if (inode->i_state & (I_DIRTY_SYNC|I_DIRTY_DATASYNC)) {
> +	if (i_state & (I_DIRTY_SYNC|I_DIRTY_DATASYNC)) {
>  		struct writeback_control wbc = {
>  			.sync_mode = WB_SYNC_ALL,
>  			.nr_to_write = 0, /* sys_fsync did this */
>  		};
>  		ret = sync_inode(inode, &wbc);
> -		if (journal && (journal->j_flags & JBD2_BARRIER))
> -			blkdev_issue_flush(inode->i_sb->s_bdev, NULL);
> +		/*
> +		 * When there are no blocks attached to the journal transaction
> +		 * some optimizations are possible, but if there were dirty
> +		 * pages sync_inode() should have ensured that all data gets
> +		 * actually written to disk. Thus, we can skip
> +		 * blkdev_issue_flush() below.
> +		 */
> +		if (!(i_state & I_DIRTY_PAGES))
> +			goto flush_blkdev;
  Uh. Here I don't get it. When we did sync_inode(), blkdev_issue_flush()
is needed only if the journal does not do barriers. So I'd expect here:
	if (!(journal->j_flags & JBD2_BARRIER))
		goto flush_blkdev;
	goto out;

>  	}
> +
> +	goto out;
  But here we might need to issue a flush if there are some data written. So
I'd have here:
	if (!(i_state & I_DIRTY_PAGES))
		goto out;

> +
> +flush_blkdev:
> +	if (journal && (journal->j_flags & JBD2_BARRIER))
> +		blkdev_issue_flush(inode->i_sb->s_bdev, NULL);
>  out:
>  	return ret;
>  }

										Honza
-- 
Jan Kara <jack@suse.cz>
SUSE Labs, CR

  reply	other threads:[~2009-01-15 23:46 UTC|newest]

Thread overview: 73+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-13 13:14 Pavel Machek
2009-01-13 13:45 ` Alan Cox
2009-01-13 14:03   ` Theodore Tso
2009-01-13 14:07     ` Jens Axboe
2009-01-13 14:26       ` [PATCH] block: Fix documentation for blkdev_issue_flush() Theodore Ts'o
2009-01-13 14:28         ` Jens Axboe
2009-01-13 14:30     ` ext2 + -osync: not as easy as it seems Jan Kara
2009-01-13 14:46       ` Theodore Tso
2009-01-14  3:37       ` Fernando Luis Vázquez Cao
2009-01-14 10:35         ` Jan Kara
2009-01-14 13:21           ` Theodore Tso
2009-01-14 14:05             ` Jan Kara
2009-01-14 14:08               ` Jens Axboe
2009-01-14 14:34                 ` Theodore Tso
2009-01-14 14:43                   ` Jens Axboe
2009-02-12 16:43                 ` Eric Sandeen
2009-02-16 12:09                   ` Jens Axboe
2009-01-14 14:12               ` Theodore Tso
2009-01-14 14:37                 ` Jan Kara
2009-01-14 16:59                   ` Theodore Tso
2009-01-15 12:06                     ` Fernando Luis Vázquez Cao
2009-01-15 23:45                       ` Jan Kara [this message]
2009-01-16 12:31                         ` Fernando Luis Vázquez Cao
2009-01-16 13:55                           ` ext3: call blkdev_issue_flush on fsync Fernando Luis Vázquez Cao
2009-01-16 16:30                             ` Jan Kara
2009-01-17  9:47                               ` Fernando Luis Vázquez Cao
2009-01-17 10:00                                 ` Fernando Luis Vázquez Cao
2009-01-19 12:03                                   ` Jan Kara
2009-01-28  9:45                                     ` Fernando Luis Vázquez Cao
2009-01-28  9:55                                       ` Jan Kara
2009-02-12 10:33                                         ` Fernando Luis Vázquez Cao
2009-02-12 10:35                                           ` vfs: Improve readability off mount flag definitins by using offsets Fernando Luis Vázquez Cao
2009-02-12 10:36                                           ` vfs: Add MS_FLUSHONFSYNC mount flag Fernando Luis Vázquez Cao
2009-02-12 17:13                                             ` Eric Sandeen
2009-02-12 17:29                                               ` Jeff Garzik
2009-02-14 15:36                                                 ` Christoph Hellwig
2009-02-15  7:23                                                   ` Fernando Luis Vázquez Cao
2009-02-15 22:54                                                     ` Theodore Tso
2009-02-16  4:29                                                       ` Eric Sandeen
2009-02-16  7:47                                                       ` Fernando Luis Vázquez Cao
2009-02-12 21:23                                               ` Jan Kara
2009-02-12 21:30                                                 ` Eric Sandeen
2009-02-13  1:47                                                   ` Fernando Luis Vázquez Cao
2009-02-13  6:07                                                     ` Eric Sandeen
2009-02-13  2:23                                                   ` Theodore Tso
2009-02-22 14:15                                                     ` Pavel Machek
2009-02-22 20:51                                                       ` Eric Sandeen
2009-02-22 23:19                                                       ` Theodore Tso
2009-02-22 23:42                                                         ` Jeff Garzik
2009-02-22 23:46                                                           ` Jeff Garzik
2009-02-23  1:23                                                             ` Theodore Tso
2009-02-13  1:14                                               ` Fernando Luis Vázquez Cao
2009-02-13  6:20                                                 ` Eric Sandeen
2009-02-13 10:36                                                   ` Fernando Luis Vázquez Cao
2009-02-13 12:20                                                   ` Dave Chinner
2009-02-13 16:29                                                     ` Fernando Luis Vazquez Cao
2009-02-14 11:24                                                       ` Dave Chinner
2009-02-14 13:03                                                         ` Fernando Luis Vázquez Cao
2009-02-14 13:19                                                           ` Fernando Luis Vázquez Cao
2009-02-15  2:48                                                           ` Dave Chinner
2009-02-15  7:11                                                             ` Fernando Luis Vázquez Cao
2009-02-12 10:37                                           ` util-linux: Add new mount options flushonfsync and noflushonfsync to mount Fernando Luis Vázquez Cao
2009-02-12 10:38                                           ` util-linux: Add explanation for new mount options flushonfsync and noflushonfsync to mount(8) man page Fernando Luis Vázquez Cao
2009-02-12 10:38                                           ` block: Add block_flush_device() Fernando Luis Vázquez Cao
2009-02-12 10:39                                           ` ext3: call blkdev_issue_flush on fsync Fernando Luis Vázquez Cao
2009-02-12 10:40                                           ` ext4: " Fernando Luis Vázquez Cao
2009-02-15 22:46                                             ` Theodore Tso
2009-02-16  7:09                                               ` Fernando Luis Vázquez Cao
2009-02-16  7:25                                                 ` [PATCH 1/3] block: Add block_flush_device() Fernando Luis Vázquez Cao
2009-02-16  7:29                                                 ` [2/3] ext3: call block_flush_device() on fsync Fernando Luis Vázquez Cao
2009-02-16  7:31                                                 ` [PATCH 3/3] ext4: " Fernando Luis Vázquez Cao
2009-01-16 13:59                           ` ext4: call blkdev_issue_flush " Fernando Luis Vázquez Cao
2009-01-13 14:42   ` ext2 + -osync: not as easy as it seems Pavel Machek

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=20090115234544.GA7579@duck.suse.cz \
    --to=jack@suse.cz \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=fernando@oss.ntt.co.jp \
    --cc=jens.axboe@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pavel@suse.cz \
    --cc=sandeen@redhat.com \
    --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

Powered by JetHome