]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - fs/f2fs/node.c
f2fs: do retry operations with cond_resched
[mirror_ubuntu-bionic-kernel.git] / fs / f2fs / node.c
index 8de4f555d53018f307dd616db966ee525bae4e95..f83326ca32eff4eb17671c61cf9d0b20e0ab5853 100644 (file)
@@ -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);
        }