Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 442244c9 authored by Qu Wenruo's avatar Qu Wenruo Committed by Chris Mason
Browse files

btrfs: qgroup: Switch self test to extent-oriented qgroup mechanism.



Since the self test transaction don't have delayed_ref_roots, so use
find_all_roots() and export btrfs_qgroup_account_extent() to simulate it

Signed-off-by: default avatarQu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: default avatarChris Mason <clm@fb.com>
parent 0ed4792a
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -2455,7 +2455,7 @@ static int btrfs_qgroup_account(struct btrfs_trans_handle *trans,
	return ret;
	return ret;
}
}


static int
int
btrfs_qgroup_account_extent(struct btrfs_trans_handle *trans,
btrfs_qgroup_account_extent(struct btrfs_trans_handle *trans,
			    struct btrfs_fs_info *fs_info,
			    struct btrfs_fs_info *fs_info,
			    u64 bytenr, u64 num_bytes,
			    u64 bytenr, u64 num_bytes,
+5 −0
Original line number Original line Diff line number Diff line
@@ -103,6 +103,11 @@ int btrfs_qgroup_prepare_account_extents(struct btrfs_trans_handle *trans,
struct btrfs_qgroup_extent_record
struct btrfs_qgroup_extent_record
*btrfs_qgroup_insert_dirty_extent(struct btrfs_delayed_ref_root *delayed_refs,
*btrfs_qgroup_insert_dirty_extent(struct btrfs_delayed_ref_root *delayed_refs,
				  struct btrfs_qgroup_extent_record *record);
				  struct btrfs_qgroup_extent_record *record);
int
btrfs_qgroup_account_extent(struct btrfs_trans_handle *trans,
			    struct btrfs_fs_info *fs_info,
			    u64 bytenr, u64 num_bytes,
			    struct ulist *old_roots, struct ulist *new_roots);
int btrfs_qgroup_account_extents(struct btrfs_trans_handle *trans,
int btrfs_qgroup_account_extents(struct btrfs_trans_handle *trans,
				 struct btrfs_fs_info *fs_info);
				 struct btrfs_fs_info *fs_info);
int btrfs_delayed_qgroup_accounting(struct btrfs_trans_handle *trans,
int btrfs_delayed_qgroup_accounting(struct btrfs_trans_handle *trans,
+83 −26
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@
#include "../transaction.h"
#include "../transaction.h"
#include "../disk-io.h"
#include "../disk-io.h"
#include "../qgroup.h"
#include "../qgroup.h"
#include "../backref.h"


static void init_dummy_trans(struct btrfs_trans_handle *trans)
static void init_dummy_trans(struct btrfs_trans_handle *trans)
{
{
@@ -227,6 +228,8 @@ static int test_no_shared_qgroup(struct btrfs_root *root)
{
{
	struct btrfs_trans_handle trans;
	struct btrfs_trans_handle trans;
	struct btrfs_fs_info *fs_info = root->fs_info;
	struct btrfs_fs_info *fs_info = root->fs_info;
	struct ulist *old_roots = NULL;
	struct ulist *new_roots = NULL;
	int ret;
	int ret;


	init_dummy_trans(&trans);
	init_dummy_trans(&trans);
@@ -238,10 +241,15 @@ static int test_no_shared_qgroup(struct btrfs_root *root)
		return ret;
		return ret;
	}
	}


	ret = btrfs_qgroup_record_ref(&trans, fs_info, 5, 4096, 4096,
	/*
				      BTRFS_QGROUP_OPER_ADD_EXCL, 0);
	 * Since the test trans doesn't havee the complicated delayed refs,
	 * we can only call btrfs_qgroup_account_extent() directly to test
	 * quota.
	 */
	ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &old_roots);
	if (ret) {
	if (ret) {
		test_msg("Couldn't add space to a qgroup %d\n", ret);
		ulist_free(old_roots);
		test_msg("Couldn't find old roots: %d\n", ret);
		return ret;
		return ret;
	}
	}


@@ -249,9 +257,18 @@ static int test_no_shared_qgroup(struct btrfs_root *root)
	if (ret)
	if (ret)
		return ret;
		return ret;


	ret = btrfs_delayed_qgroup_accounting(&trans, fs_info);
	ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &new_roots);
	if (ret) {
		ulist_free(old_roots);
		ulist_free(new_roots);
		test_msg("Couldn't find old roots: %d\n", ret);
		return ret;
	}

	ret = btrfs_qgroup_account_extent(&trans, fs_info, 4096, 4096,
					  old_roots, new_roots);
	if (ret) {
	if (ret) {
		test_msg("Delayed qgroup accounting failed %d\n", ret);
		test_msg("Couldn't account space for a qgroup %d\n", ret);
		return ret;
		return ret;
	}
	}


@@ -259,21 +276,32 @@ static int test_no_shared_qgroup(struct btrfs_root *root)
		test_msg("Qgroup counts didn't match expected values\n");
		test_msg("Qgroup counts didn't match expected values\n");
		return -EINVAL;
		return -EINVAL;
	}
	}
	old_roots = NULL;
	new_roots = NULL;

	ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &old_roots);
	if (ret) {
		ulist_free(old_roots);
		test_msg("Couldn't find old roots: %d\n", ret);
		return ret;
	}


	ret = remove_extent_item(root, 4096, 4096);
	ret = remove_extent_item(root, 4096, 4096);
	if (ret)
	if (ret)
		return -EINVAL;
		return -EINVAL;


	ret = btrfs_qgroup_record_ref(&trans, fs_info, 5, 4096, 4096,
	ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &new_roots);
				      BTRFS_QGROUP_OPER_SUB_EXCL, 0);
	if (ret) {
	if (ret) {
		test_msg("Couldn't remove space from the qgroup %d\n", ret);
		ulist_free(old_roots);
		return -EINVAL;
		ulist_free(new_roots);
		test_msg("Couldn't find old roots: %d\n", ret);
		return ret;
	}
	}


	ret = btrfs_delayed_qgroup_accounting(&trans, fs_info);
	ret = btrfs_qgroup_account_extent(&trans, fs_info, 4096, 4096,
					  old_roots, new_roots);
	if (ret) {
	if (ret) {
		test_msg("Qgroup accounting failed %d\n", ret);
		test_msg("Couldn't account space for a qgroup %d\n", ret);
		return -EINVAL;
		return -EINVAL;
	}
	}


@@ -294,6 +322,8 @@ static int test_multiple_refs(struct btrfs_root *root)
{
{
	struct btrfs_trans_handle trans;
	struct btrfs_trans_handle trans;
	struct btrfs_fs_info *fs_info = root->fs_info;
	struct btrfs_fs_info *fs_info = root->fs_info;
	struct ulist *old_roots = NULL;
	struct ulist *new_roots = NULL;
	int ret;
	int ret;


	init_dummy_trans(&trans);
	init_dummy_trans(&trans);
@@ -307,20 +337,29 @@ static int test_multiple_refs(struct btrfs_root *root)
		return ret;
		return ret;
	}
	}


	ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &old_roots);
	if (ret) {
		ulist_free(old_roots);
		test_msg("Couldn't find old roots: %d\n", ret);
		return ret;
	}

	ret = insert_normal_tree_ref(root, 4096, 4096, 0, 5);
	ret = insert_normal_tree_ref(root, 4096, 4096, 0, 5);
	if (ret)
	if (ret)
		return ret;
		return ret;


	ret = btrfs_qgroup_record_ref(&trans, fs_info, 5, 4096, 4096,
	ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &new_roots);
				      BTRFS_QGROUP_OPER_ADD_EXCL, 0);
	if (ret) {
	if (ret) {
		test_msg("Couldn't add space to a qgroup %d\n", ret);
		ulist_free(old_roots);
		ulist_free(new_roots);
		test_msg("Couldn't find old roots: %d\n", ret);
		return ret;
		return ret;
	}
	}


	ret = btrfs_delayed_qgroup_accounting(&trans, fs_info);
	ret = btrfs_qgroup_account_extent(&trans, fs_info, 4096, 4096,
					  old_roots, new_roots);
	if (ret) {
	if (ret) {
		test_msg("Delayed qgroup accounting failed %d\n", ret);
		test_msg("Couldn't account space for a qgroup %d\n", ret);
		return ret;
		return ret;
	}
	}


@@ -329,20 +368,29 @@ static int test_multiple_refs(struct btrfs_root *root)
		return -EINVAL;
		return -EINVAL;
	}
	}


	ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &old_roots);
	if (ret) {
		ulist_free(old_roots);
		test_msg("Couldn't find old roots: %d\n", ret);
		return ret;
	}

	ret = add_tree_ref(root, 4096, 4096, 0, 256);
	ret = add_tree_ref(root, 4096, 4096, 0, 256);
	if (ret)
	if (ret)
		return ret;
		return ret;


	ret = btrfs_qgroup_record_ref(&trans, fs_info, 256, 4096, 4096,
	ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &new_roots);
				      BTRFS_QGROUP_OPER_ADD_SHARED, 0);
	if (ret) {
	if (ret) {
		test_msg("Qgroup record ref failed %d\n", ret);
		ulist_free(old_roots);
		ulist_free(new_roots);
		test_msg("Couldn't find old roots: %d\n", ret);
		return ret;
		return ret;
	}
	}


	ret = btrfs_delayed_qgroup_accounting(&trans, fs_info);
	ret = btrfs_qgroup_account_extent(&trans, fs_info, 4096, 4096,
					  old_roots, new_roots);
	if (ret) {
	if (ret) {
		test_msg("Qgroup accounting failed %d\n", ret);
		test_msg("Couldn't account space for a qgroup %d\n", ret);
		return ret;
		return ret;
	}
	}


@@ -356,20 +404,29 @@ static int test_multiple_refs(struct btrfs_root *root)
		return -EINVAL;
		return -EINVAL;
	}
	}


	ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &old_roots);
	if (ret) {
		ulist_free(old_roots);
		test_msg("Couldn't find old roots: %d\n", ret);
		return ret;
	}

	ret = remove_extent_ref(root, 4096, 4096, 0, 256);
	ret = remove_extent_ref(root, 4096, 4096, 0, 256);
	if (ret)
	if (ret)
		return ret;
		return ret;


	ret = btrfs_qgroup_record_ref(&trans, fs_info, 256, 4096, 4096,
	ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &new_roots);
				      BTRFS_QGROUP_OPER_SUB_SHARED, 0);
	if (ret) {
	if (ret) {
		test_msg("Qgroup record ref failed %d\n", ret);
		ulist_free(old_roots);
		ulist_free(new_roots);
		test_msg("Couldn't find old roots: %d\n", ret);
		return ret;
		return ret;
	}
	}


	ret = btrfs_delayed_qgroup_accounting(&trans, fs_info);
	ret = btrfs_qgroup_account_extent(&trans, fs_info, 4096, 4096,
					  old_roots, new_roots);
	if (ret) {
	if (ret) {
		test_msg("Qgroup accounting failed %d\n", ret);
		test_msg("Couldn't account space for a qgroup %d\n", ret);
		return ret;
		return ret;
	}
	}