OBD_FREE_LARGE(lsme, lsme_size);
}
-void lsm_free(struct lov_stripe_md *lsm)
+void lsm_free(struct kref *kref)
{
+ struct lov_stripe_md *lsm = container_of(kref, struct lov_stripe_md,
+ lsm_refc);
unsigned int entry_count = lsm->lsm_entry_count;
unsigned int i;
size_t lsm_size;
if (!lsm)
GOTO(out_lsme, rc = -ENOMEM);
- atomic_set(&lsm->lsm_refc, 1);
+ kref_init(&lsm->lsm_refc);
spin_lock_init(&lsm->lsm_lock);
lsm->lsm_maxbytes = maxbytes;
lmm_oi_le_to_cpu(&lsm->lsm_oi, &lmm->lmm_oi);
if (!lsm)
return ERR_PTR(-ENOMEM);
- atomic_set(&lsm->lsm_refc, 1);
+ kref_init(&lsm->lsm_refc);
spin_lock_init(&lsm->lsm_lock);
lsm->lsm_magic = le32_to_cpu(lcm->lcm_magic);
lsm->lsm_layout_gen = le32_to_cpu(lcm->lcm_layout_gen);
if (lsm == NULL)
RETURN(ERR_PTR(-ENOMEM));
- atomic_set(&lsm->lsm_refc, 1);
+ kref_init(&lsm->lsm_refc);
spin_lock_init(&lsm->lsm_lock);
lsm->lsm_magic = le32_to_cpu(lfm->lfm_magic);
lsm->lsm_foreign_size = lov_foreign_size_le(lfm);
CDEBUG_LIMIT(level,
"lsm %p, objid "DOSTID", maxbytes %#llx, magic 0x%08X, refc: %d, entry: %u, mirror: %u, flags: %u,layout_gen %u\n",
lsm, POSTID(&lsm->lsm_oi), lsm->lsm_maxbytes, lsm->lsm_magic,
- atomic_read(&lsm->lsm_refc), lsm->lsm_entry_count,
+ kref_read(&lsm->lsm_refc), lsm->lsm_entry_count,
lsm->lsm_mirror_count, lsm->lsm_flags, lsm->lsm_layout_gen);
if (lsm->lsm_magic == LOV_MAGIC_FOREIGN) {
}
struct lov_stripe_md {
- atomic_t lsm_refc;
+ struct kref lsm_refc;
spinlock_t lsm_lock;
pid_t lsm_lock_owner; /* debugging */
};
const struct lsm_operations *lsm_op_find(int magic);
-void lsm_free(struct lov_stripe_md *lsm);
+void lsm_free(struct kref *kref);
static inline bool lov_supported_comp_magic(unsigned int magic)
{
size_t buf_size);
struct lov_stripe_md *lov_unpackmd(struct lov_obd *lov, void *buf,
size_t buf_size);
-int lov_free_memmd(struct lov_stripe_md **lsmp);
+void lov_free_memmd(struct lov_stripe_md **lsmp);
void lov_dump_lmm_v1(int level, struct lov_mds_md_v1 *lmm);
void lov_dump_lmm_common(int level, void *lmmp);
static inline struct lov_stripe_md *lsm_addref(struct lov_stripe_md *lsm)
{
- LASSERT(atomic_read(&lsm->lsm_refc) > 0);
- atomic_inc(&lsm->lsm_refc);
+ kref_get(&lsm->lsm_refc);
return lsm;
}
(*p)(env, cookie, "entries: %d, %s, lsm{%p 0x%08X %d %u}:\n",
lsm->lsm_entry_count,
test_bit(LO_LAYOUT_INVALID, &lov->lo_obj_flags) ? "invalid" :
- "valid", lsm, lsm->lsm_magic, atomic_read(&lsm->lsm_refc),
+ "valid", lsm, lsm->lsm_magic, kref_read(&lsm->lsm_refc),
lsm->lsm_layout_gen);
for (i = 0; i < lsm->lsm_entry_count; i++) {
(*p)(env, cookie,
"released: %s, lsm{%p 0x%08X %d %u}:\n",
test_bit(LO_LAYOUT_INVALID, &lov->lo_obj_flags) ? "invalid" :
- "valid", lsm, lsm->lsm_magic, atomic_read(&lsm->lsm_refc),
+ "valid", lsm, lsm->lsm_magic, kref_read(&lsm->lsm_refc),
lsm->lsm_layout_gen);
return 0;
}
"foreign: %s, lsm{%p 0x%08X %d %u}:\n",
test_bit(LO_LAYOUT_INVALID, &lov->lo_obj_flags) ?
"invalid" : "valid", lsm,
- lsm->lsm_magic, atomic_read(&lsm->lsm_refc),
+ lsm->lsm_magic, kref_read(&lsm->lsm_refc),
lsm->lsm_layout_gen);
(*p)(env, cookie,
"raw_ea_content '%.*s'\n",
if (lov->lo_lsm != NULL) {
lsm = lsm_addref(lov->lo_lsm);
CDEBUG(D_INODE, "lsm %p addref %d/%d by %p.\n",
- lsm, atomic_read(&lsm->lsm_refc),
+ lsm, kref_read(&lsm->lsm_refc),
test_bit(LO_LAYOUT_INVALID, &lov->lo_obj_flags),
current);
}
return stripe_count;
}
-int lov_free_memmd(struct lov_stripe_md **lsmp)
+void lov_free_memmd(struct lov_stripe_md **lsmp)
{
struct lov_stripe_md *lsm = *lsmp;
- int refc;
*lsmp = NULL;
- refc = atomic_dec_return(&lsm->lsm_refc);
- LASSERT(refc >= 0);
- if (refc == 0)
- lsm_free(lsm);
-
- return refc;
+ kref_put(&lsm->lsm_refc, lsm_free);
}
/*