From: Liu Yuan <[email protected]> We should always use this helper to get entry idx.
Signed-off-by: Liu Yuan <[email protected]> --- sheep/object_cache.c | 52 +++++++++++++++++++------------------------------- 1 file changed, 20 insertions(+), 32 deletions(-) diff --git a/sheep/object_cache.c b/sheep/object_cache.c index 2ee609b..ddf2a1d 100644 --- a/sheep/object_cache.c +++ b/sheep/object_cache.c @@ -109,9 +109,10 @@ static inline int hash(uint64_t vid) return hash_64(vid, HASH_BITS); } -static inline uint32_t idx_mask(uint32_t idx) +/* We should always use this helper to get entry idx */ +static inline uint32_t entry_idx(struct object_cache_entry *entry) { - return idx &= ~CACHE_INDEX_MASK; + return entry->idx & ~CACHE_INDEX_MASK; } static inline uint32_t object_cache_oid_to_idx(uint64_t oid) @@ -148,15 +149,15 @@ object_cache_insert(struct rb_root *root, struct object_cache_entry *new) struct rb_node **p = &root->rb_node; struct rb_node *parent = NULL; struct object_cache_entry *entry; - uint32_t idx = idx_mask(new->idx); + uint32_t idx = entry_idx(new); while (*p) { parent = *p; entry = rb_entry(parent, struct object_cache_entry, node); - if (idx < idx_mask(entry->idx)) + if (idx < entry_idx(entry)) p = &(*p)->rb_left; - else if (idx > idx_mask(entry->idx)) + else if (idx > entry_idx(entry)) p = &(*p)->rb_right; else { /* already has this entry */ @@ -174,14 +175,13 @@ static struct object_cache_entry *object_tree_search(struct rb_root *root, { struct rb_node *n = root->rb_node; struct object_cache_entry *t; - idx = idx_mask(idx); while (n) { t = rb_entry(n, struct object_cache_entry, node); - if (idx < idx_mask(t->idx)) + if (idx < entry_idx(t)) n = n->rb_left; - else if (idx > idx_mask(t->idx)) + else if (idx > entry_idx(t)) n = n->rb_right; else return t; /* found it */ @@ -206,19 +206,12 @@ del_from_object_tree_and_list(struct object_cache_entry *entry, cds_list_del_rcu(&entry->lru_list); } -static uint64_t cache_vid_to_data_oid(uint32_t vid, uint32_t idx) -{ - idx = idx_mask(idx); - - return vid_to_data_oid(vid, idx); -} - static uint64_t idx_to_oid(uint32_t vid, uint32_t idx) { if (idx_has_vdi_bit(idx)) return vid_to_vdi_oid(vid); else - return cache_vid_to_data_oid(vid, idx); + return vid_to_data_oid(vid, idx); } static int remove_cache_object(struct object_cache *oc, uint32_t idx) @@ -226,8 +219,6 @@ static int remove_cache_object(struct object_cache *oc, uint32_t idx) struct strbuf buf; int ret = SD_RES_SUCCESS; - idx = idx_mask(idx); - strbuf_init(&buf, PATH_MAX); strbuf_addstr(&buf, cache_dir); strbuf_addf(&buf, "/%06"PRIx32"/%08"PRIx32, oc->vid, idx); @@ -246,20 +237,19 @@ out: static struct object_cache_entry * dirty_tree_and_list_insert(struct object_cache *oc, uint32_t idx, - uint64_t bmap, int create) + uint64_t bmap, int create) { struct rb_node **p = &oc->dirty_tree.rb_node; struct rb_node *parent = NULL; struct object_cache_entry *entry; - idx = idx_mask(idx); while (*p) { parent = *p; entry = rb_entry(parent, struct object_cache_entry, dirty_node); - if (idx < idx_mask(entry->idx)) + if (idx < entry_idx(entry)) p = &(*p)->rb_left; - else if (idx > idx_mask(entry->idx)) + else if (idx > entry_idx(entry)) p = &(*p)->rb_right; else { /* already has this entry, merge bmap */ @@ -313,7 +303,7 @@ static int write_cache_object(struct object_cache_entry *entry, void *buf, size_t size; int fd, flags = def_open_flags, ret = SD_RES_SUCCESS; struct strbuf p; - uint32_t vid = entry->oc->vid, idx = idx_mask(entry->idx); + uint32_t vid = entry->oc->vid, idx = entry_idx(entry); strbuf_init(&p, PATH_MAX); strbuf_addstr(&p, cache_dir); @@ -405,7 +395,7 @@ out: static int read_cache_object(struct object_cache_entry *entry, void *buf, size_t count, off_t offset) { - uint32_t vid = entry->oc->vid, idx = idx_mask(entry->idx); + uint32_t vid = entry->oc->vid, idx = entry_idx(entry); int ret; ret = read_cache_object_noupdate(vid, idx, buf, count, offset); @@ -428,8 +418,6 @@ static int push_cache_object(uint32_t vid, uint32_t idx, uint64_t bmap, dprintf("%"PRIx64", create %d\n", oid, create); - idx = idx_mask(idx); - if (!bmap) { dprintf("WARN: nothing to flush\n"); return SD_RES_SUCCESS; @@ -494,7 +482,7 @@ static int do_reclaim_object(struct object_cache_entry *entry) pthread_rwlock_wrlock(&oc->lock); - oid = idx_to_oid(oc->vid, entry->idx); + oid = idx_to_oid(oc->vid, entry_idx(entry)); if (uatomic_read(&entry->refcnt) > 0) { dprintf("%"PRIx64" is in operation, skip...\n", oid); ret = -1; @@ -507,7 +495,7 @@ static int do_reclaim_object(struct object_cache_entry *entry) goto out; } - if (remove_cache_object(oc, entry->idx) != SD_RES_SUCCESS) { + if (remove_cache_object(oc, entry_idx(entry)) != SD_RES_SUCCESS) { ret = -1; goto out; } @@ -540,7 +528,7 @@ static void do_reclaim(struct work *work) if (do_reclaim_object(entry) < 0) continue; - if (idx_has_vdi_bit(entry->idx)) + if (idx_has_vdi_bit(entry_idx(entry))) data_length = SD_INODE_SIZE; else data_length = SD_DATA_OBJ_SIZE; @@ -764,7 +752,7 @@ static int object_cache_pull(struct object_cache *oc, uint32_t idx) oid = vid_to_vdi_oid(oc->vid); data_length = SD_INODE_SIZE; } else { - oid = cache_vid_to_data_oid(oc->vid, idx); + oid = vid_to_data_oid(oc->vid, idx); data_length = SD_DATA_OBJ_SIZE; } @@ -802,7 +790,7 @@ static int object_cache_push(struct object_cache *oc) pthread_rwlock_wrlock(&oc->lock); list_for_each_entry_safe(entry, t, &oc->dirty_list, dirty_list) { - ret = push_cache_object(oc->vid, entry->idx, entry->bmap, + ret = push_cache_object(oc->vid, entry_idx(entry), entry->bmap, !!(entry->idx & CACHE_CREATE_BIT)); if (ret != SD_RES_SUCCESS) goto push_failed; @@ -845,7 +833,7 @@ void object_cache_delete(uint32_t vid) pthread_mutex_unlock(&hashtable_lock[h]); pthread_rwlock_wrlock(&cache->lock); - list_for_each_entry_safe(entry, t, &cache->object_list, dirty_list) { + list_for_each_entry_safe(entry, t, &cache->object_list, object_list) { del_from_object_tree_and_list(entry, &cache->object_tree); if (!list_empty(&entry->dirty_list)) del_from_dirty_tree_and_list(entry, &cache->dirty_tree); -- 1.7.10.2 -- sheepdog mailing list [email protected] http://lists.wpkg.org/mailman/listinfo/sheepdog
