From: Liu Bo <bo.li.liu@oracle.com>
To: Filipe Manana <fdmanana@gmail.com>
Cc: "linux-btrfs@vger.kernel.org" <linux-btrfs@vger.kernel.org>,
David Sterba <dsterba@suse.cz>,
Anand.Jain.anand.jain@oracle.com
Subject: Re: [PATCH] Btrfs: adjust outstanding_extents counter properly when dio write is split
Date: Thu, 12 Jan 2017 14:24:27 -0800 [thread overview]
Message-ID: <20170112222427.GD24433@localhost.localdomain> (raw)
In-Reply-To: <CAL3q7H5LxEARAm0Gg5eKCNAtKKr-F-79c1PUE5ng4Xb3LFGD4w@mail.gmail.com>
On Fri, Jan 06, 2017 at 11:28:06AM +0000, Filipe Manana wrote:
> On Fri, Dec 23, 2016 at 1:13 AM, Liu Bo <bo.li.liu@oracle.com> wrote:
> > Currently how btrfs dio deals with split dio write is not good
> > enough if dio write is split into several segments due to the
> > lack of contiguous space, a large dio write like 'dd bs=1G count=1'
> > can end up with incorrect outstanding_extents counter and endio
> > would complain loudly with an assertion.
> >
> > This fixes the problem by compensating the outstanding_extents
> > counter in inode if a large dio write gets split.
> >
> > Reported-by: Anand Jain <anand.jain@oracle.com>
> > Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
>
> Bo, can you please create a test case for fstests?
It took me some time to recall all the details, anyway, I've sent out a
fstests case for it[1].
[1]: https://patchwork.kernel.org/patch/9514277/
Thanks,
-liubo
>
> Thanks
>
> > ---
> > fs/btrfs/inode.c | 11 +++++++++--
> > 1 file changed, 9 insertions(+), 2 deletions(-)
> >
> > diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> > index a4c8796..4175987 100644
> > --- a/fs/btrfs/inode.c
> > +++ b/fs/btrfs/inode.c
> > @@ -7641,11 +7641,18 @@ static void adjust_dio_outstanding_extents(struct inode *inode,
> > * within our reservation, otherwise we need to adjust our inode
> > * counter appropriately.
> > */
> > - if (dio_data->outstanding_extents) {
> > + if (dio_data->outstanding_extents >= num_extents) {
> > dio_data->outstanding_extents -= num_extents;
> > } else {
> > + /*
> > + * If dio write length has been split due to no large enough
> > + * contiguous space, we need to compensate our inode counter
> > + * appropriately.
> > + */
> > + u64 num_needed = num_extents - dio_data->outstanding_extents;
> > +
> > spin_lock(&BTRFS_I(inode)->lock);
> > - BTRFS_I(inode)->outstanding_extents += num_extents;
> > + BTRFS_I(inode)->outstanding_extents += num_needed;
> > spin_unlock(&BTRFS_I(inode)->lock);
> > }
> > }
> > --
> > 2.5.5
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>
>
> --
> Filipe David Manana,
>
> "People will forget what you said,
> people will forget what you did,
> but people will never forget how you made them feel."
prev parent reply other threads:[~2017-01-12 22:17 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-23 1:13 [PATCH] Btrfs: adjust outstanding_extents counter properly when dio write is split Liu Bo
2016-12-23 3:18 ` Anand Jain
2017-01-06 11:28 ` Filipe Manana
2017-01-12 22:24 ` Liu Bo [this message]
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=20170112222427.GD24433@localhost.localdomain \
--to=bo.li.liu@oracle.com \
--cc=Anand.Jain.anand.jain@oracle.com \
--cc=dsterba@suse.cz \
--cc=fdmanana@gmail.com \
--cc=linux-btrfs@vger.kernel.org \
/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.