out:
if (lso != NULL)
- lfsck_assistant_object_put(env, lso);
+ kref_put(&lso->lso_ref, lfsck_assistant_object_put);
return rc;
}
struct lu_fid lso_fid;
__u64 lso_oit_cookie;
struct lu_attr lso_attr;
- atomic_t lso_ref;
+ struct kref lso_ref;
unsigned int lso_dead:1,
lso_is_dir:1;
};
static inline struct lfsck_assistant_object *
lfsck_assistant_object_get(struct lfsck_assistant_object *lso)
{
- atomic_inc(&lso->lso_ref);
+ kref_get(&lso->lso_ref);
return lso;
}
static inline void
-lfsck_assistant_object_put(const struct lu_env *env,
- struct lfsck_assistant_object *lso)
+lfsck_assistant_object_put(struct kref *kref)
{
- if (atomic_dec_and_test(&lso->lso_ref))
- OBD_FREE_PTR(lso);
+ struct lfsck_assistant_object *lso;
+
+ lso = container_of(kref, struct lfsck_assistant_object, lso_ref);
+ OBD_FREE_PTR(lso);
}
static inline struct thandle*
container_of(lar, struct lfsck_layout_req, llr_lar);
lfsck_object_put(env, llr->llr_child);
- lfsck_assistant_object_put(env, lar->lar_parent);
+ kref_put(&lar->lar_parent->lso_ref, lfsck_assistant_object_put);
OBD_FREE_PTR(llr);
}
out:
if (lso != NULL)
- lfsck_assistant_object_put(env, lso);
+ kref_put(&lso->lso_ref, lfsck_assistant_object_put);
return rc;
}
if (attr != NULL)
lso->lso_attr = *attr;
- atomic_set(&lso->lso_ref, 1);
+ kref_init(&lso->lso_ref);
lso->lso_oit_cookie = cookie;
if (is_dir)
lso->lso_is_dir = 1;
if (lnr->lnr_lmv != NULL)
lfsck_lmv_put(env, lnr->lnr_lmv);
- lfsck_assistant_object_put(env, lar->lar_parent);
+ kref_put(&lar->lar_parent->lso_ref, lfsck_assistant_object_put);
OBD_FREE(lnr, lnr->lnr_size);
}
out:
if (lso != NULL && !IS_ERR(lso))
- lfsck_assistant_object_put(env, lso);
+ kref_put(&lso->lso_ref, lfsck_assistant_object_put);
lfsck_close_dir(env, lfsck, rc);
if (rc <= 0)