diff options
author | Mark Fasheh <mfasheh@suse.de> | 2014-07-17 12:39:01 -0700 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2014-08-15 07:43:14 -0700 |
commit | 1152651a081720ef6a8c76bb7da676e8c900ac30 (patch) | |
tree | a7d5b02f161a7c4f9cdab947a68569475a93146c /fs/btrfs/qgroup.h | |
parent | 6f7ff6d7832c6be13e8c95598884dbc40ad69fb7 (diff) | |
download | op-kernel-dev-1152651a081720ef6a8c76bb7da676e8c900ac30.zip op-kernel-dev-1152651a081720ef6a8c76bb7da676e8c900ac30.tar.gz |
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>
Diffstat (limited to 'fs/btrfs/qgroup.h')
-rw-r--r-- | fs/btrfs/qgroup.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/btrfs/qgroup.h b/fs/btrfs/qgroup.h index 5952ff1..18cc68c 100644 --- a/fs/btrfs/qgroup.h +++ b/fs/btrfs/qgroup.h @@ -44,6 +44,7 @@ enum btrfs_qgroup_operation_type { BTRFS_QGROUP_OPER_ADD_SHARED, BTRFS_QGROUP_OPER_SUB_EXCL, BTRFS_QGROUP_OPER_SUB_SHARED, + BTRFS_QGROUP_OPER_SUB_SUBTREE, }; struct btrfs_qgroup_operation { |