From: Jan Kara <jack@suse.cz>
To: Christoph Hellwig <hch@infradead.org>
Cc: Jan Kara <jack@suse.cz>, LKML <linux-kernel@vger.kernel.org>,
xfs@oss.sgi.com, Joel Becker <joel.becker@oracle.com>,
ocfs2-devel@oss.oracle.com
Subject: Re: [PATCH 03/17] vfs: Remove syncing from generic_file_direct_write() and generic_file_buffered_write()
Date: Thu, 20 Aug 2009 15:31:35 +0200 [thread overview]
Message-ID: <20090820133135.GF16486@duck.novell.com> (raw)
In-Reply-To: <20090819161853.GC6150@infradead.org>
On Wed 19-08-09 12:18:53, Christoph Hellwig wrote:
> On Wed, Aug 19, 2009 at 06:04:30PM +0200, Jan Kara wrote:
> > generic_file_direct_write() and generic_file_buffered_write() called
> > generic_osync_inode() if it was called on O_SYNC file or IS_SYNC inode. But
> > this is superfluous since generic_file_aio_write() does the syncing as well.
> > Also XFS and OCFS2 which call these functions directly handle syncing
> > themselves. So let's have a single place where syncing happens:
> > generic_file_aio_write().
>
> Yeah, this is something that never made any sense to me.
>
> > @@ -2187,20 +2187,7 @@ generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov,
> > }
> > *ppos = end;
> > }
> > -
> > - /*
> > - * Sync the fs metadata but not the minor inode changes and
> > - * of course not the data as we did direct DMA for the IO.
> > - * i_mutex is held, which protects generic_osync_inode() from
> > - * livelocking. AIO O_DIRECT ops attempt to sync metadata here.
> > - */
> > out:
> > - if ((written >= 0 || written == -EIOCBQUEUED) &&
> > - ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
> > - int err = generic_osync_inode(inode, mapping, OSYNC_METADATA);
> > - if (err < 0)
> > - written = err;
> > - }
> > return written;
>
> Here we check (written >= 0 || written == -EIOCBQUEUED), but
> generic_file_aio_write only cares about positive return values. We
> defintively do have a change here for partial AIO requests.
Ah, that's a good point.
> The question is if the previous behaviour made in sense. If do have an
> O_SYNC aio+dio request we would have to flush out the metadata after the
> request has completed and not here.
Yes, that would be a correct behavior but I see no good way of doing
that. Flushing on EIOCBQUEUED mostly works for simple filesystems like
ext[23] where we don't do anything from end_io callback. The only risk
is if we crash after the transaction commits but before the direct IO is
done (we could expose stale data) but I'm not sure that is an issue with
real HW.
Anyway, the question is what we should do about it. For now, I'd call
generic_write_sync() even in case EIOCBQUEUED is returned to preserve old
behavior (EIOCBQUEUED does not seem to be returned from buffered write path
so we really just preserve the old behavior).
> > @@ -2343,16 +2328,6 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov,
> > if (likely(status >= 0)) {
> > written += status;
> > *ppos = pos + status;
> > -
> > - /*
> > - * For now, when the user asks for O_SYNC, we'll actually give
> > - * O_DSYNC
> > - */
> > - if (unlikely((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
> > - if (!a_ops->writepage || !is_sync_kiocb(iocb))
> > - status = generic_osync_inode(inode, mapping,
> > - OSYNC_METADATA|OSYNC_DATA);
> > - }
> > }
>
> No problem with -EIOCBQUEUED here, but we change from doing
> generic_osync_inode with OSYNC_DATA which does a full writeout of the
> data to sync_page_range which only does the range writeout here. That
> should be fine (as we only need to sync that range), but should probably
> be documented in the patch description.
Yes, will do.
Honza
--
Jan Kara <jack@suse.cz>
SUSE Labs, CR
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2009-08-20 13:30 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1250697884-22288-1-git-send-email-jack@suse.cz>
2009-08-19 16:04 ` [PATCH 03/17] vfs: Remove syncing from generic_file_direct_write() and generic_file_buffered_write() Jan Kara
2009-08-19 16:18 ` Christoph Hellwig
2009-08-20 13:31 ` Jan Kara [this message]
2009-08-19 16:04 ` [PATCH 07/17] vfs: Introduce new helpers for syncing after writing to O_SYNC file or IS_SYNC inode Jan Kara
2009-08-19 16:26 ` Christoph Hellwig
2009-08-20 12:15 ` Jan Kara
2009-08-20 16:27 ` Christoph Hellwig
2009-08-21 15:23 ` Jan Kara
2009-08-21 15:32 ` Christoph Hellwig
2009-08-21 15:48 ` Jan Kara
2009-08-26 18:22 ` Christoph Hellwig
2009-08-27 0:04 ` Christoph Hellwig
2009-08-19 16:04 ` [PATCH 14/17] xfs: Use new syncing helper Jan Kara
2009-08-19 16:33 ` Christoph Hellwig
2009-08-20 12:22 ` Jan Kara
[not found] <1250874001-15483-1-git-send-email-jack@suse.cz>
2009-08-21 16:59 ` [PATCH 03/17] vfs: Remove syncing from generic_file_direct_write() and generic_file_buffered_write() Jan Kara
[not found] <1250875447-15622-1-git-send-email-jack@suse.cz>
2009-08-21 17:23 ` Jan Kara
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=20090820133135.GF16486@duck.novell.com \
--to=jack@suse.cz \
--cc=hch@infradead.org \
--cc=joel.becker@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=ocfs2-devel@oss.oracle.com \
--cc=xfs@oss.sgi.com \
/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