diff options
Diffstat (limited to 'libglusterfs/src/inode.c')
-rw-r--r-- | libglusterfs/src/inode.c | 64 |
1 files changed, 26 insertions, 38 deletions
diff --git a/libglusterfs/src/inode.c b/libglusterfs/src/inode.c index 143a63f97b8..538c7797c61 100644 --- a/libglusterfs/src/inode.c +++ b/libglusterfs/src/inode.c @@ -450,6 +450,7 @@ __inode_unref(inode_t *inode) { int index = 0; xlator_t *this = NULL; + uint64_t nlookup = 0; if (!inode) return NULL; @@ -476,7 +477,8 @@ __inode_unref(inode_t *inode) if (!inode->ref) { inode->table->active_size--; - if (inode->nlookup) + nlookup = GF_ATOMIC_GET(inode->nlookup); + if (nlookup) __inode_passivate(inode); else __inode_retire(inode); @@ -680,6 +682,8 @@ inode_new(inode_table_t *table) static inode_t * __inode_ref_reduce_by_n(inode_t *inode, uint64_t nref) { + uint64_t nlookup = 0; + if (!inode) return NULL; @@ -693,7 +697,8 @@ __inode_ref_reduce_by_n(inode_t *inode, uint64_t nref) if (!inode->ref) { inode->table->active_size--; - if (inode->nlookup) + nlookup = GF_ATOMIC_GET(inode->nlookup); + if (nlookup) __inode_passivate(inode); else __inode_retire(inode); @@ -703,28 +708,19 @@ __inode_ref_reduce_by_n(inode_t *inode, uint64_t nref) } static inode_t * -__inode_lookup(inode_t *inode) +inode_forget_atomic(inode_t *inode, uint64_t nlookup) { - if (!inode) - return NULL; - - inode->nlookup++; - - return inode; -} + uint64_t inode_lookup = 0; -static inode_t * -__inode_forget(inode_t *inode, uint64_t nlookup) -{ if (!inode) return NULL; - GF_ASSERT(inode->nlookup >= nlookup); - - inode->nlookup -= nlookup; - - if (!nlookup) - inode->nlookup = 0; + if (nlookup == 0) { + GF_ATOMIC_INIT(inode->nlookup, 0); + } else { + inode_lookup = GF_ATOMIC_FETCH_SUB(inode->nlookup, nlookup); + GF_ASSERT(inode_lookup >= nlookup); + } return inode; } @@ -1073,21 +1069,13 @@ inode_link(inode_t *inode, inode_t *parent, const char *name, struct iatt *iatt) int inode_lookup(inode_t *inode) { - inode_table_t *table = NULL; - if (!inode) { gf_msg_callingfn(THIS->name, GF_LOG_WARNING, 0, LG_MSG_INODE_NOT_FOUND, "inode not found"); return -1; } - table = inode->table; - - pthread_mutex_lock(&table->lock); - { - __inode_lookup(inode); - } - pthread_mutex_unlock(&table->lock); + GF_ATOMIC_INC(inode->nlookup); return 0; } @@ -1129,11 +1117,7 @@ inode_forget(inode_t *inode, uint64_t nlookup) table = inode->table; - pthread_mutex_lock(&table->lock); - { - __inode_forget(inode, nlookup); - } - pthread_mutex_unlock(&table->lock); + inode_forget_atomic(inode, nlookup); inode_table_prune(table); @@ -1531,7 +1515,7 @@ inode_table_prune(inode_table_t *table) list_for_each_entry_safe(del, tmp, &purge, list) { list_del_init(&del->list); - __inode_forget(del, 0); + inode_forget_atomic(del, 0); __inode_destroy(del); } } @@ -1782,7 +1766,7 @@ inode_table_destroy(inode_table_t *inode_table) */ while (!list_empty(&inode_table->lru)) { trav = list_first_entry(&inode_table->lru, inode_t, list); - __inode_forget(trav, 0); + inode_forget_atomic(trav, 0); __inode_retire(trav); inode_table->lru_size--; } @@ -1799,7 +1783,7 @@ inode_table_destroy(inode_table_t *inode_table) "Active inode(%p) with refcount" "(%d) found during cleanup", trav, trav->ref); - __inode_forget(trav, 0); + inode_forget_atomic(trav, 0); __inode_ref_reduce_by_n(trav, 0); } } @@ -2277,6 +2261,7 @@ inode_dump(inode_t *inode, char *prefix) struct list_head fd_list; int ref = 0; char key[GF_DUMP_MAX_BUF_LEN]; + uint64_t nlookup = 0; if (!inode) return; @@ -2289,8 +2274,9 @@ inode_dump(inode_t *inode, char *prefix) } { + nlookup = GF_ATOMIC_GET(inode->nlookup); gf_proc_dump_write("gfid", "%s", uuid_utoa(inode->gfid)); - gf_proc_dump_write("nlookup", "%ld", inode->nlookup); + gf_proc_dump_write("nlookup", "%ld", nlookup); gf_proc_dump_write("fd-count", "%u", inode->fd_count); gf_proc_dump_write("active-fd-count", "%u", inode->active_fd_count); gf_proc_dump_write("ref", "%u", inode->ref); @@ -2382,6 +2368,7 @@ inode_dump_to_dict(inode_t *inode, char *prefix, dict_t *dict) char key[GF_DUMP_MAX_BUF_LEN] = { 0, }; + uint64_t nlookup = 0; ret = TRY_LOCK(&inode->lock); if (ret) @@ -2393,7 +2380,8 @@ inode_dump_to_dict(inode_t *inode, char *prefix, dict_t *dict) goto out; snprintf(key, sizeof(key), "%s.nlookup", prefix); - ret = dict_set_uint64(dict, key, inode->nlookup); + nlookup = GF_ATOMIC_GET(inode->nlookup); + ret = dict_set_uint64(dict, key, nlookup); if (ret) goto out; |