normally the references to objects are held until a transaction
is over, but in few cases reference is released before. and then
such an object can be release, so OSD should have own reference
to prevent early release.
Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Change-Id: I81647fdec8d42f123e990553edb5e371636f45c0
Reviewed-on: https://review.whamcloud.com/37170
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Mike Pershin <mpershin@whamcloud.com>
Reviewed-by: Lai Siyao <lai.siyao@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
- osd_trunc_unlock_all(&truncates);
+ osd_trunc_unlock_all(env, &truncates);
/* inform the quota slave device that the transaction is stopping */
qsd_op_end(env, qsd, qtrans);
/* inform the quota slave device that the transaction is stopping */
qsd_op_end(env, qsd, qtrans);
int osd_trunc_lock(struct osd_object *obj, struct osd_thandle *oh,
bool shared);
int osd_trunc_lock(struct osd_object *obj, struct osd_thandle *oh,
bool shared);
-void osd_trunc_unlock_all(struct list_head *list);
+void osd_trunc_unlock_all(const struct lu_env *env, struct list_head *list);
void osd_process_truncates(struct list_head *list);
void osd_execute_truncate(struct osd_object *obj);
void osd_process_truncates(struct list_head *list);
void osd_execute_truncate(struct osd_object *obj);
else
down_write(&obj->oo_ext_idx_sem);
al->tl_shared = shared;
else
down_write(&obj->oo_ext_idx_sem);
al->tl_shared = shared;
+ lu_object_get(&obj->oo_dt.do_lu);
list_add(&al->tl_list, &oh->ot_trunc_locks);
return 0;
}
list_add(&al->tl_list, &oh->ot_trunc_locks);
return 0;
}
-void osd_trunc_unlock_all(struct list_head *list)
+void osd_trunc_unlock_all(const struct lu_env *env, struct list_head *list)
{
struct osd_access_lock *al, *tmp;
list_for_each_entry_safe(al, tmp, list, tl_list) {
{
struct osd_access_lock *al, *tmp;
list_for_each_entry_safe(al, tmp, list, tl_list) {
up_read(&al->tl_obj->oo_ext_idx_sem);
else
up_write(&al->tl_obj->oo_ext_idx_sem);
up_read(&al->tl_obj->oo_ext_idx_sem);
else
up_write(&al->tl_obj->oo_ext_idx_sem);
+ osd_object_put(env, al->tl_obj);
list_del(&al->tl_list);
OBD_FREE_PTR(al);
}
list_del(&al->tl_list);
OBD_FREE_PTR(al);
}