2008-07-24 20:17:14 +04:00
/*
* Copyright ( C ) 2008 Red Hat . 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 .
*/
# include "ctree.h"
# include "disk-io.h"
int btrfs_insert_orphan_item ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root , u64 offset )
{
struct btrfs_path * path ;
struct btrfs_key key ;
int ret = 0 ;
key . objectid = BTRFS_ORPHAN_OBJECTID ;
btrfs_set_key_type ( & key , BTRFS_ORPHAN_ITEM_KEY ) ;
key . offset = offset ;
path = btrfs_alloc_path ( ) ;
if ( ! path )
return - ENOMEM ;
ret = btrfs_insert_empty_item ( trans , root , path , & key , 0 ) ;
btrfs_free_path ( path ) ;
return ret ;
}
int btrfs_del_orphan_item ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root , u64 offset )
{
struct btrfs_path * path ;
struct btrfs_key key ;
int ret = 0 ;
key . objectid = BTRFS_ORPHAN_OBJECTID ;
btrfs_set_key_type ( & key , BTRFS_ORPHAN_ITEM_KEY ) ;
key . offset = offset ;
path = btrfs_alloc_path ( ) ;
if ( ! path )
return - ENOMEM ;
ret = btrfs_search_slot ( trans , root , & key , path , - 1 , 1 ) ;
2010-12-08 20:22:34 +03:00
if ( ret < 0 )
2008-07-24 20:17:14 +04:00
goto out ;
2010-12-08 20:22:34 +03:00
if ( ret ) {
ret = - ENOENT ;
goto out ;
}
2008-07-24 20:17:14 +04:00
ret = btrfs_del_item ( trans , root , path ) ;
out :
btrfs_free_path ( path ) ;
return ret ;
}
2009-09-21 23:56:00 +04:00
int btrfs_find_orphan_item ( struct btrfs_root * root , u64 offset )
{
struct btrfs_path * path ;
struct btrfs_key key ;
int ret ;
key . objectid = BTRFS_ORPHAN_OBJECTID ;
key . type = BTRFS_ORPHAN_ITEM_KEY ;
key . offset = offset ;
path = btrfs_alloc_path ( ) ;
if ( ! path )
return - ENOMEM ;
ret = btrfs_search_slot ( NULL , root , & key , path , 0 , 0 ) ;
btrfs_free_path ( path ) ;
return ret ;
}