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: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
parent
0ed4792af0
commit
442244c963
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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) {
|
if (ret) {
|
||||||
test_msg("Delayed qgroup accounting failed %d\n", 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) {
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user