linux/fs/btrfs
Qu Wenruo 429d6275d5 btrfs: qgroup: Fix wrong qgroup reservation update for relationship modification
When modifying qgroup relationship, for qgroup which only owns exclusive
extents, we will go through quick update path.

In this path, we will add/subtract exclusive and reference number for
parent qgroup, since the source (child) qgroup only has exclusive
extents, destination (parent) qgroup will also own or lose those extents
exclusively.

The same should be the same for reservation, since later reservation
adding/releasing will also affect parent qgroup, without the reservation
carried from child, parent will underflow reservation or have dead
reservation which will never be freed.

However original code doesn't do the same thing for reservation.
It handles qgroup reservation quite differently:

It removes qgroup reservation, as it's allocating space from the
reserved qgroup for relationship adding.
But does nothing for qgroup reservation if we're removing a qgroup
relationship.

According to the original code, it looks just like because we're adding
qgroup->rfer, the code assumes we're writing new data, so it's follows
the normal write routine, by reducing qgroup->reserved and adding
qgroup->rfer/excl.

This old behavior is wrong, and should be fixed to follow the same
excl/rfer behavior.

Just fix it by using the correct behavior described above.

Fixes: 31193213f1 ("Btrfs: qgroup: Introduce a may_use to account space_info->bytes_may_use.")
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2018-03-31 01:41:13 +02:00
..
tests Btrfs: extent map selftest: add missing void parameter to btrfs_test_extent_map 2018-03-26 15:09:29 +02:00
acl.c btrfs: drop underscores from exported xattr functions 2018-03-26 15:09:41 +02:00
async-thread.c Btrfs: fix confusing worker helper info in stacktrace 2017-10-30 12:27:57 +01:00
async-thread.h btrfs: constify tracepoint arguments 2017-08-16 14:19:53 +02:00
backref.c btrfs: Remove unused op_key var from add_delayed_refs 2018-03-31 01:26:57 +02:00
backref.h btrfs: add more __cold annotations 2018-03-26 15:09:39 +02:00
btrfs_inode.h btrfs: open code trivial helper btrfs_page_exists_in_range 2018-03-31 01:26:50 +02:00
check-integrity.c btrfs: Remove custom crc32c init code 2018-03-26 15:09:39 +02:00
check-integrity.h btrfs: take an fs_info directly when the root is not used otherwise 2016-12-06 16:06:59 +01:00
compression.c btrfs: add more __cold annotations 2018-03-26 15:09:39 +02:00
compression.h btrfs: add more __cold annotations 2018-03-26 15:09:39 +02:00
ctree.c btrfs: kill tree_mod_log_set_root_pointer helper 2018-03-31 01:26:55 +02:00
ctree.h btrfs: ctree.h: Fix wrong comment position about csum size 2018-03-31 01:41:12 +02:00
dedupe.h btrfs: expand cow_file_range() to support in-band dedup and subpage-blocksize 2016-07-26 13:52:25 +02:00
delayed-inode.c btrfs: add more __cold annotations 2018-03-26 15:09:39 +02:00
delayed-inode.h btrfs: add more __cold annotations 2018-03-26 15:09:39 +02:00
delayed-ref.c btrfs: add more __cold annotations 2018-03-26 15:09:39 +02:00
delayed-ref.h btrfs: add more __cold annotations 2018-03-26 15:09:39 +02:00
dev-replace.c btrfs: log, when replace, is canceled by the user 2018-03-26 15:09:34 +02:00
dev-replace.h btrfs: btrfs_dev_replace_cancel() can return int 2018-03-26 15:09:30 +02:00
dir-item.c btrfs: Remove custom crc32c init code 2018-03-26 15:09:39 +02:00
disk-io.c btrfs: defer adding raid type kobject until after chunk relocation 2018-03-31 01:41:12 +02:00
disk-io.h btrfs: separate types for submit_bio_start and submit_bio_done 2018-03-31 01:26:55 +02:00
export.c btrfs: Cleanup existing name_len checks 2018-01-22 16:08:12 +01:00
export.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
extent_io.c btrfs: document more parameters of submit_extent_page 2018-03-31 01:26:53 +02:00
extent_io.h btrfs: remove unused parameters from extent_submit_bio_done_t 2018-03-31 01:26:55 +02:00
extent_map.c btrfs: add more __cold annotations 2018-03-26 15:09:39 +02:00
extent_map.h btrfs: add more __cold annotations 2018-03-26 15:09:39 +02:00
extent-tree.c btrfs: defer adding raid type kobject until after chunk relocation 2018-03-31 01:41:12 +02:00
file-item.c Merge branch 'for-4.13-part1' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux 2017-07-05 16:41:23 -07:00
file.c btrfs: Remove userspace transaction ioctls 2018-03-31 01:26:51 +02:00
free-space-cache.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next 2018-01-31 14:31:10 -08:00
free-space-cache.h btrfs: free-space-cache, clean up unnecessary root arguments 2017-02-17 12:03:56 +01:00
free-space-tree.c btrfs: use reada direction enum instead of constant value in load_free_space_tree 2018-03-26 15:09:37 +02:00
free-space-tree.h btrfs: expose internal free space tree routine only if sanity tests are enabled 2017-08-18 16:36:29 +02:00
inode-item.c btrfs: Remove custom crc32c init code 2018-03-26 15:09:39 +02:00
inode-map.c Btrfs: rework outstanding_extents 2017-11-01 20:45:35 +01:00
inode-map.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
inode.c Btrfs: delete dead code in btrfs_orphan_add() 2018-03-31 01:41:12 +02:00
ioctl.c btrfs: Handle error from btrfs_uuid_tree_rem call in _btrfs_ioctl_set_received_subvol 2018-03-31 01:26:56 +02:00
Kconfig btrfs: Remove custom crc32c init code 2018-03-26 15:09:39 +02:00
locking.c btrfs: Relax memory barrier in btrfs_tree_unlock 2018-03-31 01:26:51 +02:00
locking.h
lzo.c btrfs: Remove unused tot_len var from lzo_decompress 2018-03-31 01:26:57 +02:00
Makefile btrfs: Remove custom crc32c init code 2018-03-26 15:09:39 +02:00
math.h
ordered-data.c btrfs: add more __cold annotations 2018-03-26 15:09:39 +02:00
ordered-data.h btrfs: add more __cold annotations 2018-03-26 15:09:39 +02:00
orphan.c
print-tree.c Btrfs: add one more sanity check for shared ref type 2017-08-21 17:47:43 +02:00
print-tree.h btrfs: get fs_info from eb in btrfs_print_tree, remove argument 2017-08-16 16:12:03 +02:00
props.c btrfs: drop underscores from exported xattr functions 2018-03-26 15:09:41 +02:00
props.h
qgroup.c btrfs: qgroup: Fix wrong qgroup reservation update for relationship modification 2018-03-31 01:41:13 +02:00
qgroup.h btrfs: qgroup: Skeleton to support separate qgroup reservation type 2018-03-31 01:41:13 +02:00
raid56.c Btrfs: replace: cache rbio when rebuild data on missing device 2018-03-31 01:41:12 +02:00
raid56.h btrfs: take an fs_info directly when the root is not used otherwise 2016-12-06 16:06:59 +01:00
rcu-string.h
reada.c btrfs: remove unused member err from reada_extent 2017-06-19 18:25:59 +02:00
ref-verify.c btrfs: ref-verify: Remove unused parameter from walk_up_tree() to kill warning 2018-01-22 16:08:13 +01:00
ref-verify.h Btrfs: add a extent ref verify tool 2017-10-30 12:28:00 +01:00
relocation.c btrfs: Handle btrfs_set_extent_delalloc failure in relocate_file_extent_cluster 2018-03-01 16:16:12 +01:00
root-tree.c btrfs: Cleanup existing name_len checks 2018-01-22 16:08:12 +01:00
scrub.c btrfs: Remove unused length var from scrub_handle_errored_block 2018-03-31 01:26:57 +02:00
send.c Btrfs: send: fix typo in TLV_PUT 2018-03-26 15:09:42 +02:00
send.h btrfs: fix send ioctl on 32bit with 64bit kernel 2017-10-30 12:27:59 +01:00
struct-funcs.c btrfs: struct-funcs, constify readers 2017-08-16 14:19:53 +02:00
super.c btrfs: sort and group mount option definitions 2018-03-31 01:26:52 +02:00
sysfs.c btrfs: defer adding raid type kobject until after chunk relocation 2018-03-31 01:41:12 +02:00
sysfs.h Merge branch 'for-4.15' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux 2017-11-14 13:35:29 -08:00
transaction.c btrfs: Drop fs_info parameter from btrfs_finish_extent_commit 2018-03-31 01:41:11 +02:00
transaction.h btrfs: Remove code referencing unused TRANS_USERSPACE 2018-03-31 01:26:51 +02:00
tree-checker.c btrfs: add more __cold annotations 2018-03-26 15:09:39 +02:00
tree-checker.h btrfs: tree-checker: Replace root parameter with fs_info 2018-03-26 15:09:38 +02:00
tree-defrag.c btrfs: add define for oldest generation 2018-03-31 01:26:50 +02:00
tree-log.c btrfs: Remove root argument from btrfs_log_dentry_safe 2018-03-26 15:09:42 +02:00
tree-log.h btrfs: Remove root argument from btrfs_log_dentry_safe 2018-03-26 15:09:42 +02:00
ulist.c btrfs: ulist: rename ulist_fini to ulist_release 2017-02-17 12:03:50 +01:00
ulist.h btrfs: ulist: rename ulist_fini to ulist_release 2017-02-17 12:03:50 +01:00
uuid-tree.c btrfs: add define for oldest generation 2018-03-31 01:26:50 +02:00
volumes.c btrfs: defer adding raid type kobject until after chunk relocation 2018-03-31 01:41:12 +02:00
volumes.h btrfs: rename btrfs_close_extra_device to btrfs_free_extra_devids 2018-03-26 15:09:42 +02:00
xattr.c btrfs: adjust return type of btrfs_getxattr 2018-03-26 15:09:41 +02:00
xattr.h btrfs: move btrfs_listxattr prototype to xattr.h 2018-03-26 15:09:41 +02:00
zlib.c btrfs: allow to set compression level for zlib 2017-11-01 20:45:29 +01:00
zstd.c btrfs: move some zstd work data from stack to workspace 2018-01-22 16:08:14 +01:00