From: Dave Chinner <david@fromorbit.com>
To: Brian Foster <bfoster@redhat.com>
Cc: xfs@oss.sgi.com
Subject: Re: [PATCH 1/5] xfs: DIO requires an ioend for writes
Date: Sat, 11 Apr 2015 08:24:25 +1000 [thread overview]
Message-ID: <20150410222425.GM13731@dastard> (raw)
In-Reply-To: <20150410202137.GA2846@laptop.bfoster>
On Fri, Apr 10, 2015 at 04:21:37PM -0400, Brian Foster wrote:
> On Fri, Apr 10, 2015 at 11:37:56PM +1000, Dave Chinner wrote:
> > From: Dave Chinner <dchinner@redhat.com>
> >
> > Right now unwritten extent conversion information is passed by
> > making the end IO private data non-null, which does not enable us to
> > pass any information from submission context to completion context,
> > which we need to use the standard IO completion paths.
> >
> > Allocate an ioend in block allocation for direct IO and attach it to
> > the mapping buffer used during direct IO block allocation. Factor
> > the mapping code to make it obvious that this is happening only for
> > direct IO writes, and and place the mapping info and IO type
> > directly into the ioend for use in completion context.
> >
> > The completion is changed to check the ioend type to determine if
> > unwritten extent completion is necessary or not.
> >
> > Signed-off-by: Dave Chinner <dchinner@redhat.com>
> > ---
> > fs/xfs/xfs_aops.c | 79 ++++++++++++++++++++++++++++++++++++++++++-------------
> > 1 file changed, 61 insertions(+), 18 deletions(-)
> >
> > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
> > index 3a9b7a1..d95a42b 100644
> > --- a/fs/xfs/xfs_aops.c
> > +++ b/fs/xfs/xfs_aops.c
> > @@ -1233,6 +1233,57 @@ xfs_vm_releasepage(
> > return try_to_free_buffers(page);
> > }
> >
> > +static void
> > +xfs_get_blocks_map_buffer(
> > + struct inode *inode,
> > + struct buffer_head *bh_result,
> > + int create,
> > + int direct,
> > + struct xfs_bmbt_irec *imap,
> > + xfs_off_t offset,
> > + ssize_t size)
> > +{
> > + struct xfs_ioend *ioend;
> > + int type;
> > +
> > + if (!create) {
> > + /*
> > + * Unwritten extents do not report a disk address for
> > + * the read case (treat as if we're reading into a hole).
> > + */
> > + if (!ISUNWRITTEN(imap))
> > + xfs_map_buffer(inode, bh_result, imap, offset);
> > + return;
> > + }
>
> This logic was kind of ugly to begin with, but I think the refactoring
> exposes it further. There's rather twisty logic here just for a case
Yup, I isolated it first to make it easy to change, not necessarily
easier to read ;)
....
> So if we pull some of the bits from xfs_get_blocks_map_buffer() back up,
> I end up with something like the the following here. Compile tested
> only, but illustrates the point:
>
> /*
> * Map the buffer as long as we have physical blocks and this isn't a
> * read of an unwritten extent. Treat reads into unwritten extents as
> * holes and thus do not return a mapping.
> */
> if (imap.br_startblock != HOLESTARTBLOCK &&
> imap.br_startblock != DELAYSTARTBLOCK &&
> (create || !ISUNWRITTEN(&imap))) {
> xfs_map_buffer(inode, bh_result, &imap, offset);
> /* unwritten implies create due to check above */
> if (ISUNWRITTEN(&imap))
> set_buffer_unwritten(bh_result);
> /* direct writes have a special mapping */
> if (create && direct) {
> error = xfs_map_direct(inode, bh_result, &imap, offset);
> if (error)
> return error;
> }
> }
>
> I renamed the helper to xfs_map_direct(), killed everything therein up
> through the !direct check and killed both the create and direct params.
> Thoughts?
Yeah, that looks neater; I'll split and rework it in a similar
manner to this. Thanks!
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2015-04-10 22:24 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-10 13:37 [PATCH 0/5] xfs: fix direct IO completion issues Dave Chinner
2015-04-10 13:37 ` [PATCH 1/5] xfs: DIO requires an ioend for writes Dave Chinner
2015-04-10 20:21 ` Brian Foster
2015-04-10 22:24 ` Dave Chinner [this message]
2015-04-10 13:37 ` [PATCH 2/5] xfs: direct IO needs to use append ioends Dave Chinner
2015-04-10 20:21 ` Brian Foster
2015-04-10 22:30 ` Dave Chinner
2015-04-11 21:12 ` Brian Foster
2015-04-11 21:15 ` Brian Foster
2015-04-12 23:31 ` Dave Chinner
2015-04-13 11:20 ` Brian Foster
2015-04-10 13:37 ` [PATCH 3/5] xfs: DIO write completion size updates race Dave Chinner
2015-04-10 20:22 ` Brian Foster
2015-04-10 13:37 ` [PATCH 4/5] xfs: direct IO EOF zeroing needs to drain AIO Dave Chinner
2015-04-10 20:22 ` Brian Foster
2015-04-10 13:38 ` [PATCH 5/5] xfs: using generic_file_direct_write() is unnecessary Dave Chinner
2015-04-10 20:22 ` Brian Foster
2015-04-12 15:09 ` [PATCH 0/5] xfs: fix direct IO completion issues Christoph Hellwig
2015-04-12 23:22 ` Dave Chinner
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=20150410222425.GM13731@dastard \
--to=david@fromorbit.com \
--cc=bfoster@redhat.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