summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk@kernel.org>2016-01-26 18:12:50 +0100
committerJaegeuk Kim <jaegeuk@kernel.org>2016-02-23 01:07:23 +0100
commit43a2fa180ea498fb849c625fc517ce91491501a0 (patch)
treeb4add848911e5e62c7481d2c160f77614b9bf192 /fs
parentf2fs: reconstruct the code to free an extent_node (diff)
downloadlinux-43a2fa180ea498fb849c625fc517ce91491501a0.tar.xz
linux-43a2fa180ea498fb849c625fc517ce91491501a0.zip
f2fs: move extent_node list operations being coupled with rbtree operation
This patch moves extent_node list operations to be handled together with its rbtree operations. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs')
-rw-r--r--fs/f2fs/extent_cache.c40
1 files changed, 17 insertions, 23 deletions
diff --git a/fs/f2fs/extent_cache.c b/fs/f2fs/extent_cache.c
index ecb1f99e1fc8..995a7b1baa70 100644
--- a/fs/f2fs/extent_cache.c
+++ b/fs/f2fs/extent_cache.c
@@ -360,10 +360,16 @@ static struct extent_node *__try_merge_extent_node(struct f2fs_sb_info *sbi,
en = next_ex;
}
- if (en) {
- __try_update_largest_extent(et, en);
- et->cached_en = en;
- }
+ if (!en)
+ return NULL;
+
+ __try_update_largest_extent(et, en);
+ et->cached_en = en;
+
+ spin_lock(&sbi->extent_lock);
+ if (!list_empty(&en->list))
+ list_move_tail(&en->list, &sbi->extent_list);
+ spin_unlock(&sbi->extent_lock);
return en;
}
@@ -400,6 +406,11 @@ do_insert:
__try_update_largest_extent(et, en);
et->cached_en = en;
+
+ /* update in global extent list */
+ spin_lock(&sbi->extent_lock);
+ list_add_tail(&en->list, &sbi->extent_list);
+ spin_unlock(&sbi->extent_lock);
return en;
}
@@ -498,13 +509,6 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode,
insert_p = NULL;
insert_parent = NULL;
}
-
- /* update in global extent list */
- spin_lock(&sbi->extent_lock);
- if (en1)
- list_add_tail(&en1->list, &sbi->extent_list);
- spin_unlock(&sbi->extent_lock);
-
en = next_en;
}
@@ -512,9 +516,8 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode,
if (blkaddr) {
set_extent_info(&ei, fofs, blkaddr, len);
- en1 = __try_merge_extent_node(sbi, et, &ei, prev_en, next_en);
- if (!en1)
- en1 = __insert_extent_tree(sbi, et, &ei,
+ if (!__try_merge_extent_node(sbi, et, &ei, prev_en, next_en))
+ __insert_extent_tree(sbi, et, &ei,
insert_p, insert_parent);
/* give up extent_cache, if split and small updates happen */
@@ -524,15 +527,6 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode,
et->largest.len = 0;
set_inode_flag(F2FS_I(inode), FI_NO_EXTENT);
}
-
- spin_lock(&sbi->extent_lock);
- if (en1) {
- if (list_empty(&en1->list))
- list_add_tail(&en1->list, &sbi->extent_list);
- else
- list_move_tail(&en1->list, &sbi->extent_list);
- }
- spin_unlock(&sbi->extent_lock);
}
if (is_inode_flag_set(F2FS_I(inode), FI_NO_EXTENT))