2014-05-07 17:06:09 -04:00
/*
* Copyright ( C ) 2013 Facebook . All rights reserved .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public
* License v2 as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public
* License along with this program ; if not , write to the
* Free Software Foundation , Inc . , 59 Temple Place - Suite 330 ,
* Boston , MA 021110 - 1307 , USA .
*/
2016-06-01 19:18:25 +08:00
# include <linux/types.h>
2014-05-07 17:06:09 -04:00
# include "btrfs-tests.h"
# include "../ctree.h"
# include "../transaction.h"
# include "../disk-io.h"
# include "../qgroup.h"
2015-04-16 17:18:36 +08:00
# include "../backref.h"
2014-05-07 17:06:09 -04:00
static int insert_normal_tree_ref ( struct btrfs_root * root , u64 bytenr ,
u64 num_bytes , u64 parent , u64 root_objectid )
{
struct btrfs_trans_handle trans ;
struct btrfs_extent_item * item ;
struct btrfs_extent_inline_ref * iref ;
struct btrfs_tree_block_info * block_info ;
struct btrfs_path * path ;
struct extent_buffer * leaf ;
struct btrfs_key ins ;
u32 size = sizeof ( * item ) + sizeof ( * iref ) + sizeof ( * block_info ) ;
int ret ;
2015-09-29 20:50:36 -07:00
btrfs_init_dummy_trans ( & trans ) ;
2014-05-07 17:06:09 -04:00
ins . objectid = bytenr ;
ins . type = BTRFS_EXTENT_ITEM_KEY ;
ins . offset = num_bytes ;
path = btrfs_alloc_path ( ) ;
if ( ! path ) {
test_msg ( " Couldn't allocate path \n " ) ;
return - ENOMEM ;
}
path - > leave_spinning = 1 ;
ret = btrfs_insert_empty_item ( & trans , root , path , & ins , size ) ;
if ( ret ) {
test_msg ( " Couldn't insert ref %d \n " , ret ) ;
btrfs_free_path ( path ) ;
return ret ;
}
leaf = path - > nodes [ 0 ] ;
item = btrfs_item_ptr ( leaf , path - > slots [ 0 ] , struct btrfs_extent_item ) ;
btrfs_set_extent_refs ( leaf , item , 1 ) ;
btrfs_set_extent_generation ( leaf , item , 1 ) ;
btrfs_set_extent_flags ( leaf , item , BTRFS_EXTENT_FLAG_TREE_BLOCK ) ;
block_info = ( struct btrfs_tree_block_info * ) ( item + 1 ) ;
btrfs_set_tree_block_level ( leaf , block_info , 1 ) ;
iref = ( struct btrfs_extent_inline_ref * ) ( block_info + 1 ) ;
if ( parent > 0 ) {
btrfs_set_extent_inline_ref_type ( leaf , iref ,
BTRFS_SHARED_BLOCK_REF_KEY ) ;
btrfs_set_extent_inline_ref_offset ( leaf , iref , parent ) ;
} else {
btrfs_set_extent_inline_ref_type ( leaf , iref , BTRFS_TREE_BLOCK_REF_KEY ) ;
btrfs_set_extent_inline_ref_offset ( leaf , iref , root_objectid ) ;
}
btrfs_free_path ( path ) ;
return 0 ;
}
static int add_tree_ref ( struct btrfs_root * root , u64 bytenr , u64 num_bytes ,
u64 parent , u64 root_objectid )
{
struct btrfs_trans_handle trans ;
struct btrfs_extent_item * item ;
struct btrfs_path * path ;
struct btrfs_key key ;
u64 refs ;
int ret ;
2015-09-29 20:50:36 -07:00
btrfs_init_dummy_trans ( & trans ) ;
2014-05-07 17:06:09 -04:00
key . objectid = bytenr ;
key . type = BTRFS_EXTENT_ITEM_KEY ;
key . offset = num_bytes ;
path = btrfs_alloc_path ( ) ;
if ( ! path ) {
test_msg ( " Couldn't allocate path \n " ) ;
return - ENOMEM ;
}
path - > leave_spinning = 1 ;
ret = btrfs_search_slot ( & trans , root , & key , path , 0 , 1 ) ;
if ( ret ) {
test_msg ( " Couldn't find extent ref \n " ) ;
btrfs_free_path ( path ) ;
return ret ;
}
item = btrfs_item_ptr ( path - > nodes [ 0 ] , path - > slots [ 0 ] ,
struct btrfs_extent_item ) ;
refs = btrfs_extent_refs ( path - > nodes [ 0 ] , item ) ;
btrfs_set_extent_refs ( path - > nodes [ 0 ] , item , refs + 1 ) ;
btrfs_release_path ( path ) ;
key . objectid = bytenr ;
if ( parent ) {
key . type = BTRFS_SHARED_BLOCK_REF_KEY ;
key . offset = parent ;
} else {
key . type = BTRFS_TREE_BLOCK_REF_KEY ;
key . offset = root_objectid ;
}
ret = btrfs_insert_empty_item ( & trans , root , path , & key , 0 ) ;
if ( ret )
test_msg ( " Failed to insert backref \n " ) ;
btrfs_free_path ( path ) ;
return ret ;
}
static int remove_extent_item ( struct btrfs_root * root , u64 bytenr ,
u64 num_bytes )
{
struct btrfs_trans_handle trans ;
struct btrfs_key key ;
struct btrfs_path * path ;
int ret ;
2015-09-29 20:50:36 -07:00
btrfs_init_dummy_trans ( & trans ) ;
2014-05-07 17:06:09 -04:00
key . objectid = bytenr ;
key . type = BTRFS_EXTENT_ITEM_KEY ;
key . offset = num_bytes ;
path = btrfs_alloc_path ( ) ;
if ( ! path ) {
test_msg ( " Couldn't allocate path \n " ) ;
return - ENOMEM ;
}
path - > leave_spinning = 1 ;
ret = btrfs_search_slot ( & trans , root , & key , path , - 1 , 1 ) ;
if ( ret ) {
test_msg ( " Didn't find our key %d \n " , ret ) ;
btrfs_free_path ( path ) ;
return ret ;
}
btrfs_del_item ( & trans , root , path ) ;
btrfs_free_path ( path ) ;
return 0 ;
}
static int remove_extent_ref ( struct btrfs_root * root , u64 bytenr ,
u64 num_bytes , u64 parent , u64 root_objectid )
{
struct btrfs_trans_handle trans ;
struct btrfs_extent_item * item ;
struct btrfs_path * path ;
struct btrfs_key key ;
u64 refs ;
int ret ;
2015-09-29 20:50:36 -07:00
btrfs_init_dummy_trans ( & trans ) ;
2014-05-07 17:06:09 -04:00
key . objectid = bytenr ;
key . type = BTRFS_EXTENT_ITEM_KEY ;
key . offset = num_bytes ;
path = btrfs_alloc_path ( ) ;
if ( ! path ) {
test_msg ( " Couldn't allocate path \n " ) ;
return - ENOMEM ;
}
path - > leave_spinning = 1 ;
ret = btrfs_search_slot ( & trans , root , & key , path , 0 , 1 ) ;
if ( ret ) {
test_msg ( " Couldn't find extent ref \n " ) ;
btrfs_free_path ( path ) ;
return ret ;
}
item = btrfs_item_ptr ( path - > nodes [ 0 ] , path - > slots [ 0 ] ,
struct btrfs_extent_item ) ;
refs = btrfs_extent_refs ( path - > nodes [ 0 ] , item ) ;
btrfs_set_extent_refs ( path - > nodes [ 0 ] , item , refs - 1 ) ;
btrfs_release_path ( path ) ;
key . objectid = bytenr ;
if ( parent ) {
key . type = BTRFS_SHARED_BLOCK_REF_KEY ;
key . offset = parent ;
} else {
key . type = BTRFS_TREE_BLOCK_REF_KEY ;
key . offset = root_objectid ;
}
ret = btrfs_search_slot ( & trans , root , & key , path , - 1 , 1 ) ;
if ( ret ) {
test_msg ( " Couldn't find backref %d \n " , ret ) ;
btrfs_free_path ( path ) ;
return ret ;
}
btrfs_del_item ( & trans , root , path ) ;
btrfs_free_path ( path ) ;
return ret ;
}
2016-06-01 19:18:25 +08:00
static int test_no_shared_qgroup ( struct btrfs_root * root ,
u32 sectorsize , u32 nodesize )
2014-05-07 17:06:09 -04:00
{
struct btrfs_trans_handle trans ;
struct btrfs_fs_info * fs_info = root - > fs_info ;
2015-04-16 17:18:36 +08:00
struct ulist * old_roots = NULL ;
struct ulist * new_roots = NULL ;
2014-05-07 17:06:09 -04:00
int ret ;
2015-09-29 20:50:36 -07:00
btrfs_init_dummy_trans ( & trans ) ;
2014-05-07 17:06:09 -04:00
test_msg ( " Qgroup basic add \n " ) ;
2016-06-01 19:18:28 +08:00
ret = btrfs_create_qgroup ( NULL , fs_info , BTRFS_FS_TREE_OBJECTID ) ;
2014-05-07 17:06:09 -04:00
if ( ret ) {
test_msg ( " Couldn't create a qgroup %d \n " , ret ) ;
return ret ;
}
2015-04-16 17:18:36 +08:00
/*
2016-05-19 21:18:45 -04:00
* Since the test trans doesn ' t have the complicated delayed refs ,
2015-04-16 17:18:36 +08:00
* we can only call btrfs_qgroup_account_extent ( ) directly to test
* quota .
*/
2016-06-01 19:18:25 +08:00
ret = btrfs_find_all_roots ( & trans , fs_info , nodesize , 0 , & old_roots ) ;
2014-05-07 17:06:09 -04:00
if ( ret ) {
2015-04-16 17:18:36 +08:00
ulist_free ( old_roots ) ;
test_msg ( " Couldn't find old roots: %d \n " , ret ) ;
2014-05-07 17:06:09 -04:00
return ret ;
}
2016-06-01 19:18:28 +08:00
ret = insert_normal_tree_ref ( root , nodesize , nodesize , 0 ,
BTRFS_FS_TREE_OBJECTID ) ;
2014-05-07 17:06:09 -04:00
if ( ret )
return ret ;
2016-06-01 19:18:25 +08:00
ret = btrfs_find_all_roots ( & trans , fs_info , nodesize , 0 , & new_roots ) ;
2014-05-07 17:06:09 -04:00
if ( ret ) {
2015-04-16 17:18:36 +08:00
ulist_free ( old_roots ) ;
ulist_free ( new_roots ) ;
test_msg ( " Couldn't find old roots: %d \n " , ret ) ;
return ret ;
}
2016-06-01 19:18:25 +08:00
ret = btrfs_qgroup_account_extent ( & trans , fs_info , nodesize ,
nodesize , old_roots , new_roots ) ;
2015-04-16 17:18:36 +08:00
if ( ret ) {
test_msg ( " Couldn't account space for a qgroup %d \n " , ret ) ;
2014-05-07 17:06:09 -04:00
return ret ;
}
2016-06-01 19:18:28 +08:00
if ( btrfs_verify_qgroup_counts ( fs_info , BTRFS_FS_TREE_OBJECTID ,
nodesize , nodesize ) ) {
2014-05-07 17:06:09 -04:00
test_msg ( " Qgroup counts didn't match expected values \n " ) ;
return - EINVAL ;
}
2015-04-16 17:18:36 +08:00
old_roots = NULL ;
new_roots = NULL ;
2016-06-01 19:18:25 +08:00
ret = btrfs_find_all_roots ( & trans , fs_info , nodesize , 0 , & old_roots ) ;
2015-04-16 17:18:36 +08:00
if ( ret ) {
ulist_free ( old_roots ) ;
test_msg ( " Couldn't find old roots: %d \n " , ret ) ;
return ret ;
}
2014-05-07 17:06:09 -04:00
2016-06-01 19:18:25 +08:00
ret = remove_extent_item ( root , nodesize , nodesize ) ;
2014-05-07 17:06:09 -04:00
if ( ret )
return - EINVAL ;
2016-06-01 19:18:25 +08:00
ret = btrfs_find_all_roots ( & trans , fs_info , nodesize , 0 , & new_roots ) ;
2014-05-07 17:06:09 -04:00
if ( ret ) {
2015-04-16 17:18:36 +08:00
ulist_free ( old_roots ) ;
ulist_free ( new_roots ) ;
test_msg ( " Couldn't find old roots: %d \n " , ret ) ;
return ret ;
2014-05-07 17:06:09 -04:00
}
2016-06-01 19:18:25 +08:00
ret = btrfs_qgroup_account_extent ( & trans , fs_info , nodesize ,
nodesize , old_roots , new_roots ) ;
2014-05-07 17:06:09 -04:00
if ( ret ) {
2015-04-16 17:18:36 +08:00
test_msg ( " Couldn't account space for a qgroup %d \n " , ret ) ;
2014-05-07 17:06:09 -04:00
return - EINVAL ;
}
2016-06-01 19:18:28 +08:00
if ( btrfs_verify_qgroup_counts ( fs_info , BTRFS_FS_TREE_OBJECTID , 0 , 0 ) ) {
2014-05-07 17:06:09 -04:00
test_msg ( " Qgroup counts didn't match expected values \n " ) ;
return - EINVAL ;
}
return 0 ;
}
/*
* Add a ref for two different roots to make sure the shared value comes out
* right , also remove one of the roots and make sure the exclusive count is
* adjusted properly .
*/
2016-06-01 19:18:25 +08:00
static int test_multiple_refs ( struct btrfs_root * root ,
u32 sectorsize , u32 nodesize )
2014-05-07 17:06:09 -04:00
{
struct btrfs_trans_handle trans ;
struct btrfs_fs_info * fs_info = root - > fs_info ;
2015-04-16 17:18:36 +08:00
struct ulist * old_roots = NULL ;
struct ulist * new_roots = NULL ;
2014-05-07 17:06:09 -04:00
int ret ;
2015-09-29 20:50:36 -07:00
btrfs_init_dummy_trans ( & trans ) ;
2014-05-07 17:06:09 -04:00
test_msg ( " Qgroup multiple refs test \n " ) ;
2016-06-01 19:18:28 +08:00
/*
* We have BTRFS_FS_TREE_OBJECTID created already from the
* previous test .
*/
ret = btrfs_create_qgroup ( NULL , fs_info , BTRFS_FIRST_FREE_OBJECTID ) ;
2014-05-07 17:06:09 -04:00
if ( ret ) {
test_msg ( " Couldn't create a qgroup %d \n " , ret ) ;
return ret ;
}
2016-06-01 19:18:25 +08:00
ret = btrfs_find_all_roots ( & trans , fs_info , nodesize , 0 , & old_roots ) ;
2015-04-16 17:18:36 +08:00
if ( ret ) {
ulist_free ( old_roots ) ;
test_msg ( " Couldn't find old roots: %d \n " , ret ) ;
return ret ;
}
2016-06-01 19:18:28 +08:00
ret = insert_normal_tree_ref ( root , nodesize , nodesize , 0 ,
BTRFS_FS_TREE_OBJECTID ) ;
2014-05-07 17:06:09 -04:00
if ( ret )
return ret ;
2016-06-01 19:18:25 +08:00
ret = btrfs_find_all_roots ( & trans , fs_info , nodesize , 0 , & new_roots ) ;
2014-05-07 17:06:09 -04:00
if ( ret ) {
2015-04-16 17:18:36 +08:00
ulist_free ( old_roots ) ;
ulist_free ( new_roots ) ;
test_msg ( " Couldn't find old roots: %d \n " , ret ) ;
2014-05-07 17:06:09 -04:00
return ret ;
}
2016-06-01 19:18:25 +08:00
ret = btrfs_qgroup_account_extent ( & trans , fs_info , nodesize ,
nodesize , old_roots , new_roots ) ;
2014-05-07 17:06:09 -04:00
if ( ret ) {
2015-04-16 17:18:36 +08:00
test_msg ( " Couldn't account space for a qgroup %d \n " , ret ) ;
2014-05-07 17:06:09 -04:00
return ret ;
}
2016-06-01 19:18:28 +08:00
if ( btrfs_verify_qgroup_counts ( fs_info , BTRFS_FS_TREE_OBJECTID ,
2016-06-01 19:18:25 +08:00
nodesize , nodesize ) ) {
2014-05-07 17:06:09 -04:00
test_msg ( " Qgroup counts didn't match expected values \n " ) ;
return - EINVAL ;
}
2016-06-01 19:18:25 +08:00
ret = btrfs_find_all_roots ( & trans , fs_info , nodesize , 0 , & old_roots ) ;
2015-04-16 17:18:36 +08:00
if ( ret ) {
ulist_free ( old_roots ) ;
test_msg ( " Couldn't find old roots: %d \n " , ret ) ;
return ret ;
}
2016-06-01 19:18:28 +08:00
ret = add_tree_ref ( root , nodesize , nodesize , 0 ,
BTRFS_FIRST_FREE_OBJECTID ) ;
2014-05-07 17:06:09 -04:00
if ( ret )
return ret ;
2016-06-01 19:18:25 +08:00
ret = btrfs_find_all_roots ( & trans , fs_info , nodesize , 0 , & new_roots ) ;
2014-05-07 17:06:09 -04:00
if ( ret ) {
2015-04-16 17:18:36 +08:00
ulist_free ( old_roots ) ;
ulist_free ( new_roots ) ;
test_msg ( " Couldn't find old roots: %d \n " , ret ) ;
2014-05-07 17:06:09 -04:00
return ret ;
}
2016-06-01 19:18:25 +08:00
ret = btrfs_qgroup_account_extent ( & trans , fs_info , nodesize ,
nodesize , old_roots , new_roots ) ;
2014-05-07 17:06:09 -04:00
if ( ret ) {
2015-04-16 17:18:36 +08:00
test_msg ( " Couldn't account space for a qgroup %d \n " , ret ) ;
2014-05-07 17:06:09 -04:00
return ret ;
}
2016-06-01 19:18:28 +08:00
if ( btrfs_verify_qgroup_counts ( fs_info , BTRFS_FS_TREE_OBJECTID ,
nodesize , 0 ) ) {
2014-05-07 17:06:09 -04:00
test_msg ( " Qgroup counts didn't match expected values \n " ) ;
return - EINVAL ;
}
2016-06-01 19:18:28 +08:00
if ( btrfs_verify_qgroup_counts ( fs_info , BTRFS_FIRST_FREE_OBJECTID ,
nodesize , 0 ) ) {
2014-05-07 17:06:09 -04:00
test_msg ( " Qgroup counts didn't match expected values \n " ) ;
return - EINVAL ;
}
2016-06-01 19:18:25 +08:00
ret = btrfs_find_all_roots ( & trans , fs_info , nodesize , 0 , & old_roots ) ;
2015-04-16 17:18:36 +08:00
if ( ret ) {
ulist_free ( old_roots ) ;
test_msg ( " Couldn't find old roots: %d \n " , ret ) ;
return ret ;
}
2016-06-01 19:18:28 +08:00
ret = remove_extent_ref ( root , nodesize , nodesize , 0 ,
BTRFS_FIRST_FREE_OBJECTID ) ;
2014-05-07 17:06:09 -04:00
if ( ret )
return ret ;
2016-06-01 19:18:25 +08:00
ret = btrfs_find_all_roots ( & trans , fs_info , nodesize , 0 , & new_roots ) ;
2014-05-07 17:06:09 -04:00
if ( ret ) {
2015-04-16 17:18:36 +08:00
ulist_free ( old_roots ) ;
ulist_free ( new_roots ) ;
test_msg ( " Couldn't find old roots: %d \n " , ret ) ;
2014-05-07 17:06:09 -04:00
return ret ;
}
2016-06-01 19:18:25 +08:00
ret = btrfs_qgroup_account_extent ( & trans , fs_info , nodesize ,
nodesize , old_roots , new_roots ) ;
2014-05-07 17:06:09 -04:00
if ( ret ) {
2015-04-16 17:18:36 +08:00
test_msg ( " Couldn't account space for a qgroup %d \n " , ret ) ;
2014-05-07 17:06:09 -04:00
return ret ;
}
2016-06-01 19:18:28 +08:00
if ( btrfs_verify_qgroup_counts ( fs_info , BTRFS_FIRST_FREE_OBJECTID ,
0 , 0 ) ) {
2014-05-07 17:06:09 -04:00
test_msg ( " Qgroup counts didn't match expected values \n " ) ;
return - EINVAL ;
}
2016-06-01 19:18:28 +08:00
if ( btrfs_verify_qgroup_counts ( fs_info , BTRFS_FS_TREE_OBJECTID ,
nodesize , nodesize ) ) {
2014-05-07 17:06:09 -04:00
test_msg ( " Qgroup counts didn't match expected values \n " ) ;
return - EINVAL ;
}
return 0 ;
}
2016-06-01 19:18:25 +08:00
int btrfs_test_qgroups ( u32 sectorsize , u32 nodesize )
2014-05-07 17:06:09 -04:00
{
2016-06-20 14:14:09 -04:00
struct btrfs_fs_info * fs_info = NULL ;
2014-05-07 17:06:09 -04:00
struct btrfs_root * root ;
struct btrfs_root * tmp_root ;
int ret = 0 ;
2016-06-15 09:22:56 -04:00
fs_info = btrfs_alloc_dummy_fs_info ( nodesize , sectorsize ) ;
2016-06-20 14:14:09 -04:00
if ( ! fs_info ) {
test_msg ( " Couldn't allocate dummy fs info \n " ) ;
return - ENOMEM ;
2014-05-07 17:06:09 -04:00
}
2016-06-15 09:22:56 -04:00
root = btrfs_alloc_dummy_root ( fs_info ) ;
2016-06-20 14:14:09 -04:00
if ( IS_ERR ( root ) ) {
test_msg ( " Couldn't allocate root \n " ) ;
ret = PTR_ERR ( root ) ;
2014-05-07 17:06:09 -04:00
goto out ;
}
2016-06-20 14:14:09 -04:00
2014-06-15 03:20:26 +02:00
/* We are using this root as our extent root */
root - > fs_info - > extent_root = root ;
/*
* Some of the paths we test assume we have a filled out fs_info , so we
* just need to add the root in there so we don ' t panic .
*/
root - > fs_info - > tree_root = root ;
root - > fs_info - > quota_root = root ;
2016-09-02 15:40:02 -04:00
set_bit ( BTRFS_FS_QUOTA_ENABLED , & fs_info - > flags ) ;
2014-05-07 17:06:09 -04:00
/*
* Can ' t use bytenr 0 , some things freak out
* * cough * backref walking code * cough *
*/
2016-06-15 09:22:56 -04:00
root - > node = alloc_test_extent_buffer ( root - > fs_info , nodesize ) ;
2014-05-07 17:06:09 -04:00
if ( ! root - > node ) {
test_msg ( " Couldn't allocate dummy buffer \n " ) ;
ret = - ENOMEM ;
goto out ;
}
2014-06-12 02:47:37 +01:00
btrfs_set_header_level ( root - > node , 0 ) ;
btrfs_set_header_nritems ( root - > node , 0 ) ;
2016-06-01 19:18:25 +08:00
root - > alloc_bytenr + = 2 * nodesize ;
2014-05-07 17:06:09 -04:00
2016-06-15 09:22:56 -04:00
tmp_root = btrfs_alloc_dummy_root ( fs_info ) ;
2014-05-07 17:06:09 -04:00
if ( IS_ERR ( tmp_root ) ) {
test_msg ( " Couldn't allocate a fs root \n " ) ;
ret = PTR_ERR ( tmp_root ) ;
goto out ;
}
2016-06-01 19:18:28 +08:00
tmp_root - > root_key . objectid = BTRFS_FS_TREE_OBJECTID ;
2014-05-07 17:06:09 -04:00
root - > fs_info - > fs_root = tmp_root ;
ret = btrfs_insert_fs_root ( root - > fs_info , tmp_root ) ;
if ( ret ) {
test_msg ( " Couldn't insert fs root %d \n " , ret ) ;
goto out ;
}
2016-06-15 09:22:56 -04:00
tmp_root = btrfs_alloc_dummy_root ( fs_info ) ;
2014-05-07 17:06:09 -04:00
if ( IS_ERR ( tmp_root ) ) {
test_msg ( " Couldn't allocate a fs root \n " ) ;
ret = PTR_ERR ( tmp_root ) ;
goto out ;
}
2016-06-01 19:18:28 +08:00
tmp_root - > root_key . objectid = BTRFS_FIRST_FREE_OBJECTID ;
2014-05-07 17:06:09 -04:00
ret = btrfs_insert_fs_root ( root - > fs_info , tmp_root ) ;
if ( ret ) {
test_msg ( " Couldn't insert fs root %d \n " , ret ) ;
goto out ;
}
test_msg ( " Running qgroup tests \n " ) ;
2016-06-01 19:18:25 +08:00
ret = test_no_shared_qgroup ( root , sectorsize , nodesize ) ;
2014-05-07 17:06:09 -04:00
if ( ret )
goto out ;
2016-06-01 19:18:25 +08:00
ret = test_multiple_refs ( root , sectorsize , nodesize ) ;
2014-05-07 17:06:09 -04:00
out :
btrfs_free_dummy_root ( root ) ;
2016-06-20 14:14:09 -04:00
btrfs_free_dummy_fs_info ( fs_info ) ;
2014-05-07 17:06:09 -04:00
return ret ;
}