Skip to contentSkip to conversation

f2fs: use rb-tree to track pending discard commands

PATCH New Chao Yu 1 participant 1 message Apr 14, 2017 F2FS file system

lore
Share & tools
lore

Chao Yu

author maintainer
#0 lore raw

PATCH v2 1/1 f2fs: use rb-tree to track pending discard commands

From: Chao Yu <[email protected]>

Introduce rb-tree based discard cache infrastructure to speed up lookup and merge operation of discard entry.

---
v2: fix to update discard cmd with correct size.

 fs/f2fs/extent_cache.c |  15 ++--
 fs/f2fs/f2fs.h         |  48 ++++++++++-
 fs/f2fs/segment.c      | 223 ++++++++++++++++++++++++++++++++++++++++---------
 3 files changed, 236 insertions(+), 50 deletions(-)
fs/f2fs/extent_cache.c +8 -7
index 68e649a31c7d..221ad086ee00 100644
@@ -49,7 +49,7 @@ static struct rb_entry *__lookup_rb_tree_slow(struct rb_root *root,
 	return NULL;
 }
 
-static struct rb_entry *__lookup_rb_tree(struct rb_root *root,
+struct rb_entry *__lookup_rb_tree(struct rb_root *root,
 				struct rb_entry *cached_re, unsigned int ofs)
 {
 	struct rb_entry *re;
@@ -61,7 +61,7 @@ static struct rb_entry *__lookup_rb_tree(struct rb_root *root,
 	return re;
 }
 
-static struct rb_node **__lookup_rb_tree_for_insert(struct f2fs_sb_info *sbi,
+struct rb_node **__lookup_rb_tree_for_insert(struct f2fs_sb_info *sbi,
 				struct rb_root *root, struct rb_node **parent,
 				unsigned int ofs)
 {
@@ -92,13 +92,14 @@ static struct rb_node **__lookup_rb_tree_for_insert(struct f2fs_sb_info *sbi,
  * in order to simpfy the insertion after.
  * tree must stay unchanged between lookup and insertion.
  */
-static struct rb_entry *__lookup_rb_tree_ret(struct rb_root *root,
+struct rb_entry *__lookup_rb_tree_ret(struct rb_root *root,
 				struct rb_entry *cached_re,
 				unsigned int ofs,
 				struct rb_entry **prev_entry,
 				struct rb_entry **next_entry,
 				struct rb_node ***insert_p,
-				struct rb_node **insert_parent)
+				struct rb_node **insert_parent,
+				bool force)
 {
 	struct rb_node **pnode = &root->rb_node;
 	struct rb_node *parent = NULL, *tmp_node;
@@ -145,12 +146,12 @@ static struct rb_entry *__lookup_rb_tree_ret(struct rb_root *root,
 	return NULL;
 
 lookup_neighbors:
-	if (ofs == re->ofs) {
+	if (ofs == re->ofs || force) {
 		/* lookup prev node for merging backward later */
 		tmp_node = rb_prev(&re->rb_node);
 		*prev_entry = rb_entry_safe(tmp_node, struct rb_entry, rb_node);
 	}
-	if (ofs == re->ofs + re->len - 1) {
+	if (ofs == re->ofs + re->len - 1 || force) {
 		/* lookup next node for merging frontward later */
 		tmp_node = rb_next(&re->rb_node);
 		*next_entry = rb_entry_safe(tmp_node, struct rb_entry, rb_node);
@@ -481,7 +482,7 @@ static void f2fs_update_extent_tree_range(struct inode *inode,
 					(struct rb_entry *)et->cached_en, fofs,
 					(struct rb_entry **)&prev_en,
 					(struct rb_entry **)&next_en,
-					&insert_p, &insert_parent);
+					&insert_p, &insert_parent, false);
 	if (!en)
 		en = next_en;
 
fs/f2fs/f2fs.h +45 -3

76 lines not on this page · raw message

fs/f2fs/segment.c +183 -40

285 lines not on this page · raw message

Signature · 1 line
2.12.2.575.gb14f27f