[sheepdog] [PATCH] object cache: opencode add_to_dirty_tree_and_list()
Liu Yuan
namei.unix at gmail.com
Mon Jun 11 10:53:36 CEST 2012
From: Liu Yuan <tailai.ly at taobao.com>
This functoin becomes very convoluted after more and more parameters added in.
It actually serves different purpse by different callers, open-code it simplify
code a lot.
Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
sheep/object_cache.c | 47 +++++++++++++++++++++++++++--------------------
1 file changed, 27 insertions(+), 20 deletions(-)
diff --git a/sheep/object_cache.c b/sheep/object_cache.c
index c63417f..955b04c 100644
--- a/sheep/object_cache.c
+++ b/sheep/object_cache.c
@@ -202,23 +202,6 @@ out:
return cache;
}
-static void
-add_to_dirty_tree_and_list(struct object_cache *oc, uint32_t idx,
- uint64_t bmap, struct object_cache_entry *entry,
- int create)
-{
- if (!entry) {
- entry = xzalloc(sizeof(*entry));
- entry->idx = idx;
- entry->bmap = bmap;
- entry->create = create;
- }
- if (!dirty_tree_insert(oc->active_dirty_tree, entry))
- list_add(&entry->list, oc->active_dirty_list);
- else
- free(entry);
-}
-
static inline void del_from_dirty_tree_and_list(
struct object_cache_entry *entry,
struct rb_root *dirty_tree)
@@ -257,12 +240,25 @@ static void merge_dirty_tree_and_list(struct object_cache *oc,
list_for_each_entry_safe(entry, t, inactive_dirty_list, list) {
del_from_dirty_tree_and_list(entry, inactive_dirty_tree);
- add_to_dirty_tree_and_list(oc, entry->idx, 0, entry, 0);
+ assert(!dirty_tree_insert(oc->active_dirty_tree, entry));
+ list_add(&entry->list, oc->active_dirty_list);
}
pthread_mutex_unlock(&oc->lock);
}
+static inline struct object_cache_entry *
+alloc_cache_entry(uint32_t idx, uint64_t bmap, int create)
+{
+ struct object_cache_entry *entry = xzalloc(sizeof(*entry));
+
+ entry->idx = idx;
+ entry->bmap = bmap;
+ entry->create = create;
+
+ return entry;
+}
+
static int object_cache_lookup(struct object_cache *oc, uint32_t idx,
int create)
{
@@ -283,7 +279,9 @@ static int object_cache_lookup(struct object_cache *oc, uint32_t idx,
}
if (create) {
+ struct object_cache_entry *entry;
unsigned data_length;
+
if (idx & CACHE_VDI_BIT)
data_length = SD_INODE_SIZE;
else
@@ -293,8 +291,11 @@ static int object_cache_lookup(struct object_cache *oc, uint32_t idx,
if (ret != SD_RES_SUCCESS)
ret = -1;
else {
+ entry = alloc_cache_entry(idx, 0, 1);
pthread_mutex_lock(&oc->lock);
- add_to_dirty_tree_and_list(oc, idx, 0, NULL, 1);
+ assert(!dirty_tree_insert(oc->active_dirty_tree,
+ entry));
+ list_add(&entry->list, oc->active_dirty_list);
pthread_mutex_unlock(&oc->lock);
}
}
@@ -406,13 +407,19 @@ static int object_cache_rw(struct object_cache *oc, uint32_t idx,
hdr->data_length, hdr->obj.offset);
if (hdr->flags & SD_FLAG_CMD_WRITE) {
+ struct object_cache_entry *entry;
+
ret = write_cache_object(oc->vid, idx, req->data,
hdr->data_length, hdr->obj.offset);
if (ret != SD_RES_SUCCESS)
goto out;
bmap = calc_object_bmap(hdr->data_length, hdr->obj.offset);
+ entry = alloc_cache_entry(idx, bmap, 0);
pthread_mutex_lock(&oc->lock);
- add_to_dirty_tree_and_list(oc, idx, bmap, NULL, 0);
+ if (!dirty_tree_insert(oc->active_dirty_tree, entry))
+ list_add(&entry->list, oc->active_dirty_list);
+ else
+ free(entry);
pthread_mutex_unlock(&oc->lock);
} else {
ret = read_cache_object(oc->vid, idx, req->data,
--
1.7.10.2
More information about the sheepdog
mailing list