@ -147,7 +147,7 @@ static void __set_nat_cache_dirty(struct f2fs_nm_info *nm_i,
if ( get_nat_flag ( ne , IS_DIRTY ) )
return ;
retry :
head = radix_tree_lookup ( & nm_i - > nat_set_root , set ) ;
if ( ! head ) {
head = f2fs_kmem_cache_alloc ( nat_entry_set_slab , GFP_ATOMIC ) ;
@ -156,11 +156,7 @@ retry:
INIT_LIST_HEAD ( & head - > set_list ) ;
head - > set = set ;
head - > entry_cnt = 0 ;
if ( radix_tree_insert ( & nm_i - > nat_set_root , set , head ) ) {
kmem_cache_free ( nat_entry_set_slab , head ) ;
goto retry ;
}
f2fs_radix_tree_insert ( & nm_i - > nat_set_root , set , head ) ;
}
list_move_tail ( & ne - > list , & head - > entry_list ) ;
nm_i - > dirty_nat_cnt + + ;
@ -238,13 +234,8 @@ static struct nat_entry *grab_nat_entry(struct f2fs_nm_info *nm_i, nid_t nid)
{
struct nat_entry * new ;
new = kmem_cache_alloc ( nat_entry_slab , GFP_ATOMIC ) ;
if ( ! new )
return NULL ;
if ( radix_tree_insert ( & nm_i - > nat_root , nid , new ) ) {
kmem_cache_free ( nat_entry_slab , new ) ;
return NULL ;
}
new = f2fs_kmem_cache_alloc ( nat_entry_slab , GFP_ATOMIC ) ;
f2fs_radix_tree_insert ( & nm_i - > nat_root , nid , new ) ;
memset ( new , 0 , sizeof ( struct nat_entry ) ) ;
nat_set_nid ( new , nid ) ;
nat_reset_flag ( new ) ;
@ -257,15 +248,11 @@ static void cache_nat_entry(struct f2fs_nm_info *nm_i, nid_t nid,
struct f2fs_nat_entry * ne )
{
struct nat_entry * e ;
retry :
down_write ( & nm_i - > nat_tree_lock ) ;
e = __lookup_nat_cache ( nm_i , nid ) ;
if ( ! e ) {
e = grab_nat_entry ( nm_i , nid ) ;
if ( ! e ) {
up_write ( & nm_i - > nat_tree_lock ) ;
goto retry ;
}
node_info_from_raw_nat ( & e - > ni , ne ) ;
}
up_write ( & nm_i - > nat_tree_lock ) ;
@ -276,15 +263,11 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
{
struct f2fs_nm_info * nm_i = NM_I ( sbi ) ;
struct nat_entry * e ;
retry :
down_write ( & nm_i - > nat_tree_lock ) ;
e = __lookup_nat_cache ( nm_i , ni - > nid ) ;
if ( ! e ) {
e = grab_nat_entry ( nm_i , ni - > nid ) ;
if ( ! e ) {
up_write ( & nm_i - > nat_tree_lock ) ;
goto retry ;
}
e - > ni = * ni ;
f2fs_bug_on ( sbi , ni - > blk_addr = = NEW_ADDR ) ;
} else if ( new_blkaddr = = NEW_ADDR ) {
@ -1833,19 +1816,13 @@ static void remove_nats_in_journal(struct f2fs_sb_info *sbi)
nid_t nid = le32_to_cpu ( nid_in_journal ( sum , i ) ) ;
raw_ne = nat_in_journal ( sum , i ) ;
retry :
down_write ( & nm_i - > nat_tree_lock ) ;
ne = __lookup_nat_cache ( nm_i , nid ) ;
if ( ne )
goto found ;
ne = grab_nat_entry ( nm_i , nid ) ;
if ( ! ne ) {
up_write ( & nm_i - > nat_tree_lock ) ;
goto retry ;
ne = grab_nat_entry ( nm_i , nid ) ;
node_info_from_raw_nat ( & ne - > ni , & raw_ne ) ;
}
node_info_from_raw_nat ( & ne - > ni , & raw_ne ) ;
found :
__set_nat_cache_dirty ( nm_i , ne ) ;
up_write ( & nm_i - > nat_tree_lock ) ;
}