Loading fs/f2fs/checkpoint.c +44 −37 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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) Loading Loading
fs/f2fs/checkpoint.c +44 −37 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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) Loading