summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMohit Agrawal <moagrawal@redhat.com>2018-10-30 12:35:59 +0530
committerMohit Agrawal <moagrawal@redhat.com>2018-10-30 12:38:37 +0530
commit6cc573631df28eb357ffb006d1dbfe1bfd60aeba (patch)
tree76ddd3d63776c999c64fc077b832e82c8aa91179
parentbae584148761ad98cd3d5c380f8cea1ff83aa8c3 (diff)
core: Use GF_ATOMIC ops to update inode->nlookup
fixes: bz#1644164 Change-Id: I0ac5aff565b3a30d5ff25ec5a3f20e0bda424a5d Signed-off-by: Mohit Agrawal <moagrawal@redhat.com>
-rw-r--r--libglusterfs/src/inode.c64
-rw-r--r--libglusterfs/src/inode.h2
2 files changed, 27 insertions, 39 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;
diff --git a/libglusterfs/src/inode.h b/libglusterfs/src/inode.h
index 276a1f1577c..5745ea643a3 100644
--- a/libglusterfs/src/inode.h
+++ b/libglusterfs/src/inode.h
@@ -89,7 +89,7 @@ struct _inode {
inode_table_t *table; /* the table this inode belongs to */
uuid_t gfid;
gf_lock_t lock;
- uint64_t nlookup;
+ gf_atomic_t nlookup;
uint32_t fd_count; /* Open fd count */
uint32_t active_fd_count; /* Active open fd count */
uint32_t ref; /* reference count on this inode */