]> Pileus Git - ~andy/linux/blobdiff - fs/f2fs/checkpoint.c
f2fs: move alloc new orphan node out of lock protection region
[~andy/linux] / fs / f2fs / checkpoint.c
index fdc5a12c0edd51fd29b68379cdbc23c7d24c67fb..681782c715fb74c144250284dad5dae960807c7d 100644 (file)
@@ -219,26 +219,29 @@ void add_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
        struct list_head *head, *this;
        struct orphan_inode_entry *new = NULL, *orphan = NULL;
 
+       new = f2fs_kmem_cache_alloc(orphan_entry_slab, GFP_ATOMIC);
+       new->ino = ino;
+
        mutex_lock(&sbi->orphan_inode_mutex);
        head = &sbi->orphan_inode_list;
        list_for_each(this, head) {
                orphan = list_entry(this, struct orphan_inode_entry, list);
-               if (orphan->ino == ino)
-                       goto out;
+               if (orphan->ino == ino) {
+                       mutex_unlock(&sbi->orphan_inode_mutex);
+                       kmem_cache_free(orphan_entry_slab, new);
+                       return;
+               }
+
                if (orphan->ino > ino)
                        break;
                orphan = NULL;
        }
 
-       new = f2fs_kmem_cache_alloc(orphan_entry_slab, GFP_ATOMIC);
-       new->ino = ino;
-
        /* add new_oentry into list which is sorted by inode number */
        if (orphan)
                list_add(&new->list, this->prev);
        else
                list_add_tail(&new->list, head);
-out:
        mutex_unlock(&sbi->orphan_inode_mutex);
 }