diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2014-07-26 02:47:16 +0400 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2014-07-29 18:40:25 +0400 |
commit | 953e6cc6bcb615dfa373320ffa62b574c6be608a (patch) | |
tree | 0518b26673d6ec969713035f97b1ed72cd9bf90a /fs/f2fs/checkpoint.c | |
parent | 0f7b2abd188089a44f60e2bf8521d1363ada9e12 (diff) | |
download | linux-953e6cc6bcb615dfa373320ffa62b574c6be608a.tar.xz |
f2fs: punch the core function for inode management
This patch punches out the core functions to manage the inode numbers.
Reviewed-by: Chao Yu <chao2.yu@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs/checkpoint.c')
-rw-r--r-- | fs/f2fs/checkpoint.c | 81 |
1 files changed, 44 insertions, 37 deletions
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) |