f2fs: move alloc new orphan node out of lock protection region
authorGu Zheng <guz.fnst@cn.fujitsu.com>
Fri, 10 Jan 2014 10:09:08 +0000 (18:09 +0800)
committerJaegeuk Kim <jaegeuk.kim@samsung.com>
Tue, 14 Jan 2014 09:12:04 +0000 (18:12 +0900)
Move alloc new orphan node out of lock protection region.

Signed-off-by: Gu Zheng <guz.fnst@cn.fujitsu.com>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
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);
 }