All of lore.kernel.org
 help / color / mirror / Atom feed
From: Filipe Manana <fdmanana@gmail.com>
To: robbieko <robbieko@synology.com>
Cc: linux-btrfs <linux-btrfs@vger.kernel.org>
Subject: Re: [PATCH] Btrfs: fix data bytes_may_use underflow with fallocate due to failed quota reserve
Date: Mon, 25 Mar 2019 11:14:26 +0000	[thread overview]
Message-ID: <CAL3q7H7ootLePYme21_yg4bGUVZ+_LgK8-UyRNUWkb05Y=KT+g@mail.gmail.com> (raw)
In-Reply-To: <1547435747-20013-1-git-send-email-robbieko@synology.com>

On Mon, Jan 14, 2019 at 3:26 AM robbieko <robbieko@synology.com> wrote:
>
> From: Robbie Ko <robbieko@synology.com>
>
> When doing fallocate, we first add the range to the reserve_list
> and then reserve the qutoa.

qutoa -> quota

> If quota reservation fails, we'll release all reserved parts of
> reserve_list.
> However, cur_offset doen't update to indicate that this range is

"doen't update" -> is not updated to indicate ...

> already been inserted into the list.
> Therefore, the same range is freed twice.
> One at list_for_each_entry loop, and the other at the end of the

One -> once
and the other at -> and once at

> function.
> This will result in WARN_ON on bytes_may_use when we free the
> remaining space.
>
> Fixes: ("btrfs: update btrfs_space_info's bytes_may_use timely")

Missing commit id.

> Signed-off-by: Robbie Ko <robbieko@synology.com>
> ---
>  fs/btrfs/file.c | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
> index d38dc8c..43c6c8a 100644
> --- a/fs/btrfs/file.c
> +++ b/fs/btrfs/file.c
> @@ -3132,6 +3132,7 @@ static long btrfs_fallocate(struct file *file, int mode,
>                         ret = btrfs_qgroup_reserve_data(inode, &data_reserved,
>                                         cur_offset, last_byte - cur_offset);
>                         if (ret < 0) {
> +                               cur_offset = last_byte;

This will fix the problem if there's only one range, or we happen to
be very lucky and cur_offset
matches exactly the middle of the entire range passed to fallocate()
(in case the range covers
a sparse region of the file, a region with holes and extents).

At the end, under the 'out' label we have a call to:

   btrfs_free_reserved_data_space(inode, data_reserved, alloc_start,
alloc_end - cur_offset);

That doesn't fell right - the start offset, third argument, should be
cur_offset. Everything from
alloc_start to cur_offset was freed by the list_for_each_entry_safe_loop.





>                                 free_extent_map(em);
>                                 break;
>                         }
> --
> 1.9.1
>


-- 
Filipe David Manana,

“Whether you think you can, or you think you can't — you're right.”

  parent reply	other threads:[~2019-03-25 11:14 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-14  3:15 [PATCH] Btrfs: fix data bytes_may_use underflow with fallocate due to failed quota reserve robbieko
2019-03-25 10:21 ` robbieko
2019-03-25 11:14 ` Filipe Manana [this message]
2019-03-26  3:50   ` robbieko

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='CAL3q7H7ootLePYme21_yg4bGUVZ+_LgK8-UyRNUWkb05Y=KT+g@mail.gmail.com' \
    --to=fdmanana@gmail.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=robbieko@synology.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 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.