[Sheepdog] [PATCH] farm: fix put_entry() of trunk
Liu Yuan
namei.unix at gmail.com
Thu Mar 15 13:26:33 CET 2012
From: Liu Yuan <tailai.ly at taobao.com>
There is race when trunk entry is put for hash list.
Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
sheep/farm/trunk.c | 7 +++++--
1 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/sheep/farm/trunk.c b/sheep/farm/trunk.c
index b9f0b3e..b41a4d0 100644
--- a/sheep/farm/trunk.c
+++ b/sheep/farm/trunk.c
@@ -189,7 +189,12 @@ static inline int trunk_entry_no_sha1(struct trunk_entry_incore *entry)
static inline void put_entry(struct trunk_entry_incore *entry)
{
+ int h = hash(entry->raw.oid);
+
+ pthread_mutex_lock(&hashtable_lock[h]);
hlist_del(&entry->hash);
+ pthread_mutex_unlock(&hashtable_lock[h]);
+
pthread_mutex_lock(&active_list_lock);
list_del(&entry->active_list);
trunk_entry_active_nr--;
@@ -360,7 +365,6 @@ void trunk_put_entry(uint64_t oid)
entry = lookup_trunk_entry(oid, 0);
if (entry)
- /* When it is supposed to be put, no IO requests for it */
put_entry(entry);
}
@@ -373,7 +377,6 @@ void trunk_reset(void)
{
struct trunk_entry_incore *entry, *t;
list_for_each_entry_safe(entry, t, &trunk_active_list, active_list) {
- /* This is supposed to be called by format operation, so no lock needed */
put_entry(entry);
}
eprintf("%s\n", trunk_entry_active_nr ? "WARN: active_list not clean" :
--
1.7.8.2
More information about the sheepdog
mailing list