f2fs: factor out fsync inode entry operations
authorChao Yu <yuchao0@huawei.com>
Fri, 29 Apr 2016 12:13:37 +0000 (20:13 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 3 May 2016 18:20:07 +0000 (11:20 -0700)
Factor out fsync inode entry operations into {add,del}_fsync_inode.

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/recovery.c

index a646d3ba3b25de1aa827c72f61312568a0f8aa66..58275a29e87d2d57b109a7756b43218cff7353ac 100644 (file)
@@ -67,6 +67,28 @@ static struct fsync_inode_entry *get_fsync_inode(struct list_head *head,
        return NULL;
 }
 
+static struct fsync_inode_entry *add_fsync_inode(struct list_head *head,
+                                                       struct inode *inode)
+{
+       struct fsync_inode_entry *entry;
+
+       entry = kmem_cache_alloc(fsync_entry_slab, GFP_F2FS_ZERO);
+       if (!entry)
+               return NULL;
+
+       entry->inode = inode;
+       list_add_tail(&entry->list, head);
+
+       return entry;
+}
+
+static void del_fsync_inode(struct fsync_inode_entry *entry)
+{
+       iput(entry->inode);
+       list_del(&entry->list);
+       kmem_cache_free(fsync_entry_slab, entry);
+}
+
 static int recover_dentry(struct inode *inode, struct page *ipage)
 {
        struct f2fs_inode *raw_inode = F2FS_INODE(ipage);
@@ -198,6 +220,7 @@ static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head)
 {
        unsigned long long cp_ver = cur_cp_version(F2FS_CKPT(sbi));
        struct curseg_info *curseg;
+       struct inode *inode;
        struct page *page = NULL;
        block_t blkaddr;
        int err = 0;
@@ -233,27 +256,27 @@ static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head)
                                        break;
                        }
 
-                       /* add this fsync inode to the list */
-                       entry = kmem_cache_alloc(fsync_entry_slab, GFP_F2FS_ZERO);
-                       if (!entry) {
-                               err = -ENOMEM;
-                               break;
-                       }
                        /*
                         * CP | dnode(F) | inode(DF)
                         * For this case, we should not give up now.
                         */
-                       entry->inode = f2fs_iget(sbi->sb, ino_of_node(page));
-                       if (IS_ERR(entry->inode)) {
-                               err = PTR_ERR(entry->inode);
-                               kmem_cache_free(fsync_entry_slab, entry);
+                       inode = f2fs_iget(sbi->sb, ino_of_node(page));
+                       if (IS_ERR(inode)) {
+                               err = PTR_ERR(inode);
                                if (err == -ENOENT) {
                                        err = 0;
                                        goto next;
                                }
                                break;
                        }
-                       list_add_tail(&entry->list, head);
+
+                       /* add this fsync inode to the list */
+                       entry = add_fsync_inode(head, inode);
+                       if (!entry) {
+                               err = -ENOMEM;
+                               iput(inode);
+                               break;
+                       }
                }
                entry->blkaddr = blkaddr;
 
@@ -274,11 +297,8 @@ static void destroy_fsync_dnodes(struct list_head *head)
 {
        struct fsync_inode_entry *entry, *tmp;
 
-       list_for_each_entry_safe(entry, tmp, head, list) {
-               iput(entry->inode);
-               list_del(&entry->list);
-               kmem_cache_free(fsync_entry_slab, entry);
-       }
+       list_for_each_entry_safe(entry, tmp, head, list)
+               del_fsync_inode(entry);
 }
 
 static int check_index_in_prev_nodes(struct f2fs_sb_info *sbi,
@@ -533,11 +553,8 @@ static int recover_data(struct f2fs_sb_info *sbi, struct list_head *head)
                        break;
                }
 
-               if (entry->blkaddr == blkaddr) {
-                       iput(entry->inode);
-                       list_del(&entry->list);
-                       kmem_cache_free(fsync_entry_slab, entry);
-               }
+               if (entry->blkaddr == blkaddr)
+                       del_fsync_inode(entry);
 next:
                /* check next segment */
                blkaddr = next_blkaddr_of_node(page);