};
struct lmv_stripe_object {
- atomic_t lso_refs;
+ struct kref lso_refs;
union {
struct lmv_stripe_md lso_lsm;
struct lmv_foreign_md lso_lfm;
CDEBUG(mask,
"dump LMV: magic=%#x refs=%u count=%u index=%u hash=%s:%#x max_inherit=%hhu max_inherit_rr=%hhu version=%u migrate_offset=%u migrate_hash=%s:%x pool=%.*s\n",
- lsm->lsm_md_magic, atomic_read(&lsmo->lso_refs),
+ lsm->lsm_md_magic, kref_read(&lsmo->lso_refs),
lsm->lsm_md_stripe_count, lsm->lsm_md_master_mdt_index,
lmv_is_known_hash_type(lsm->lsm_md_hash_type) ?
mdt_hash_name[lsm->lsm_md_hash_type & LMV_HASH_TYPE_MASK] :
const union lmv_mds_md *lmm,
size_t lmm_size);
+void lmv_stripe_object_free(struct kref *kref);
void lmv_stripe_object_put(struct lmv_stripe_object **lsm_obj);
struct lmv_stripe_object *
lum->lum_max_inherit;
md.def_lsm_obj->lso_lsm.lsm_md_max_inherit_rr =
lum->lum_max_inherit_rr;
- atomic_set(&md.def_lsm_obj->lso_refs, 1);
+ kref_init(&md.def_lsm_obj->lso_refs);
err = ll_update_inode(dir, &md);
md_put_lustre_md(sbi->ll_md_exp, &md);
}
if (lsm_obj) {
- atomic_set(&lsm_obj->lso_refs, 1);
+ kref_init(&lsm_obj->lso_refs);
RETURN(lsm_obj);
}
if (lsm_obj == NULL)
return NULL;
- atomic_inc(&lsm_obj->lso_refs);
+ kref_get(&lsm_obj->lso_refs);
CDEBUG(D_INODE, "get %p %u\n", lsm_obj,
- atomic_read(&lsm_obj->lso_refs));
+ kref_read(&lsm_obj->lso_refs));
return lsm_obj;
}
EXPORT_SYMBOL(lmv_stripe_object_get);
-void lmv_stripe_object_put(struct lmv_stripe_object **lsop)
+void lmv_stripe_object_free(struct kref *kref)
{
struct lmv_stripe_object *lsm_obj;
size_t size;
int i;
- LASSERT(lsop != NULL);
-
- lsm_obj = *lsop;
- if (lsm_obj == NULL)
- return;
-
- *lsop = NULL;
- CDEBUG(D_INODE, "put %p %u\n", lsm_obj,
- atomic_read(&lsm_obj->lso_refs) - 1);
-
- if (!atomic_dec_and_test(&lsm_obj->lso_refs))
- return;
+ lsm_obj = container_of(kref, struct lmv_stripe_object, lso_refs);
if (lmv_dir_foreign(lsm_obj)) {
size = lsm_obj->lso_lfm.lfm_length +
}
OBD_FREE(lsm_obj, size + offsetof(typeof(*lsm_obj), lso_lsm));
}
+
+
+void lmv_stripe_object_put(struct lmv_stripe_object **lsop)
+{
+ struct lmv_stripe_object *lsm_obj;
+
+ LASSERT(lsop != NULL);
+
+ lsm_obj = *lsop;
+ if (lsm_obj == NULL)
+ return;
+
+ *lsop = NULL;
+ CDEBUG(D_INODE, "put %p %u\n", lsm_obj, kref_read(&lsm_obj->lso_refs));
+
+ kref_put(&lsm_obj->lso_refs, lmv_stripe_object_free);
+}
EXPORT_SYMBOL(lmv_stripe_object_put);
static int lmv_cancel_unused(struct obd_export *exp, const struct lu_fid *fid,