diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c index 0b4710c1d370..1c6eb6bcfd99 100644 --- a/fs/f2fs/checkpoint.c +++ b/fs/f2fs/checkpoint.c @@ -282,6 +282,47 @@ const struct address_space_operations f2fs_meta_aops = { .set_page_dirty = f2fs_set_meta_page_dirty, }; +static void __add_ino_entry(struct f2fs_sb_info *sbi, nid_t ino) +{ + struct list_head *head; + struct orphan_inode_entry *new, *e; + + new = f2fs_kmem_cache_alloc(orphan_entry_slab, GFP_ATOMIC); + new->ino = ino; + + spin_lock(&sbi->orphan_inode_lock); + list_for_each_entry(e, &sbi->orphan_inode_list, list) { + if (e->ino == ino) { + spin_unlock(&sbi->orphan_inode_lock); + kmem_cache_free(orphan_entry_slab, new); + return; + } + if (e->ino > ino) + break; + } + + /* add new entry into list which is sorted by inode number */ + list_add_tail(&new->list, &e->list); + spin_unlock(&sbi->orphan_inode_lock); +} + +static void __remove_ino_entry(struct f2fs_sb_info *sbi, nid_t ino) +{ + struct orphan_inode_entry *e; + + spin_lock(&sbi->orphan_inode_lock); + list_for_each_entry(e, &sbi->orphan_inode_list, list) { + if (e->ino == ino) { + list_del(&e->list); + sbi->n_orphans--; + spin_unlock(&sbi->orphan_inode_lock); + kmem_cache_free(orphan_entry_slab, e); + return; + } + } + spin_unlock(&sbi->orphan_inode_lock); +} + int acquire_orphan_inode(struct f2fs_sb_info *sbi) { int err = 0; @@ -306,48 +347,14 @@ void release_orphan_inode(struct f2fs_sb_info *sbi) void add_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino) { - struct list_head *head; - struct orphan_inode_entry *new, *orphan; - - new = f2fs_kmem_cache_alloc(orphan_entry_slab, GFP_ATOMIC); - new->ino = ino; - - spin_lock(&sbi->orphan_inode_lock); - head = &sbi->orphan_inode_list; - list_for_each_entry(orphan, head, list) { - if (orphan->ino == ino) { - spin_unlock(&sbi->orphan_inode_lock); - kmem_cache_free(orphan_entry_slab, new); - return; - } - - if (orphan->ino > ino) - break; - } - /* add new orphan entry into list which is sorted by inode number */ - list_add_tail(&new->list, &orphan->list); - spin_unlock(&sbi->orphan_inode_lock); + __add_ino_entry(sbi, ino); } void remove_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino) { - struct list_head *head; - struct orphan_inode_entry *orphan; - - spin_lock(&sbi->orphan_inode_lock); - head = &sbi->orphan_inode_list; - list_for_each_entry(orphan, head, list) { - if (orphan->ino == ino) { - list_del(&orphan->list); - f2fs_bug_on(sbi->n_orphans == 0); - sbi->n_orphans--; - spin_unlock(&sbi->orphan_inode_lock); - kmem_cache_free(orphan_entry_slab, orphan); - return; - } - } - spin_unlock(&sbi->orphan_inode_lock); + /* remove orphan entry from orphan list */ + __remove_ino_entry(sbi, ino); } static void recover_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)