btrfs: qgroup: account shared subtrees during snapshot delete
authorMark Fasheh <mfasheh@suse.de>
Thu, 17 Jul 2014 19:39:01 +0000 (12:39 -0700)
committerChris Mason <clm@fb.com>
Fri, 15 Aug 2014 14:43:14 +0000 (07:43 -0700)
commit1152651a081720ef6a8c76bb7da676e8c900ac30
treea7d5b02f161a7c4f9cdab947a68569475a93146c
parent6f7ff6d7832c6be13e8c95598884dbc40ad69fb7
btrfs: qgroup: account shared subtrees during snapshot delete

During its tree walk, btrfs_drop_snapshot() will skip any shared
subtrees it encounters. This is incorrect when we have qgroups
turned on as those subtrees need to have their contents
accounted. In particular, the case we're concerned with is when
removing our snapshot root leaves the subtree with only one root
reference.

In those cases we need to find the last remaining root and add
each extent in the subtree to the corresponding qgroup exclusive
counts.

This patch implements the shared subtree walk and a new qgroup
operation, BTRFS_QGROUP_OPER_SUB_SUBTREE. When an operation of
this type is encountered during qgroup accounting, we search for
any root references to that extent and in the case that we find
only one reference left, we go ahead and do the math on it's
exclusive counts.

Signed-off-by: Mark Fasheh <mfasheh@suse.de>
Reviewed-by: Josef Bacik <jbacik@fb.com>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/extent-tree.c
fs/btrfs/qgroup.c
fs/btrfs/qgroup.h