On 07/17/2014 03:39 PM, Mark Fasheh wrote: > 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 <mfas...@suse.de> > Reviewed-by: Josef Bacik <jba...@fb.com> > diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c > index 813537f..1aa4325 100644 > --- a/fs/btrfs/extent-tree.c > +++ b/fs/btrfs/extent-tree.c > @@ -8078,6 +8331,14 @@ int btrfs_drop_snapshot(struct btrfs_root *root, > } > root_dropped = true; > out_end_trans: > + ret = btrfs_delayed_qgroup_accounting(trans, root->fs_info); ^^^^^^^^^^^
CONFIG_DEBUG_PAGEALLOC noticed that root is already free at this point. I switched it to tree_root instead ;) -chris -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html