Robbie Ko 39ad317315 Btrfs: fix data bytes_may_use underflow with fallocate due to failed quota reserve
When doing fallocate, we first add the range to the reserve_list and
then reserve the quota.  If quota reservation fails, we'll release all
reserved parts of reserve_list.

However, cur_offset is not updated to indicate that this range is
already been inserted into the list.  Therefore, the same range is freed
twice.  Once at list_for_each_entry loop, and once at the end of the
function.  This will result in WARN_ON on bytes_may_use when we free the
remaining space.

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);

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.

Fixes: 18513091af94 ("btrfs: update btrfs_space_info's bytes_may_use timely")
Reviewed-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Robbie Ko <robbieko@synology.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2019-04-29 19:02:39 +02:00
..
2019-03-17 09:10:56 -07:00
2019-04-23 21:37:54 +02:00
2019-03-09 10:54:24 -08:00
\n
2019-03-07 09:01:33 -08:00
2019-03-15 13:42:53 -07:00
2018-11-30 14:56:14 -08:00
2018-08-17 16:20:28 -07:00
2018-09-29 22:47:48 -04:00
2018-10-29 14:29:58 -07:00
2019-03-07 18:32:01 -08:00
2019-03-08 14:48:40 -08:00
2019-03-18 10:44:48 -06:00
2019-01-30 17:44:07 -05:00
2019-04-26 11:09:55 -07:00
2019-02-07 16:38:35 +01:00