-
- __lustre_hash_key_validate(lh, key, hnode);
-
- read_lock(&lh->lh_rwlock);
- i = lh_hash(lh, key, lh->lh_cur_size - 1);
- lhb = &lh->lh_buckets[i];
- LASSERT(i < lh->lh_cur_size);
- LASSERT(hlist_unhashed(hnode));
-
- write_lock(&lhb->lhb_rwlock);
- existing_hnode = __lustre_hash_bucket_lookup(lh, lhb, key);
- if (existing_hnode)
- obj = lh_get(lh, existing_hnode);
- else
- obj = __lustre_hash_bucket_add(lh, lhb, hnode);
- write_unlock(&lhb->lhb_rwlock);
-
- size = lustre_hash_rehash_size(lh);
- read_unlock(&lh->lh_rwlock);
- if (size)
- lustre_hash_rehash(lh, size);
-
+
+ ehnode = lustre_hash_findadd_unique_hnode(lh, key, hnode);
+ obj = lh_get(lh, ehnode);
+ lh_put(lh, ehnode);