From 4fcb9081378f6ad0b7d3cf4105cf5fb2d506966f Mon Sep 17 00:00:00 2001 From: Alex Zhuravlev Date: Thu, 9 Jan 2020 16:28:54 +0300 Subject: [PATCH] LU-12003 osd: take reference to object in osd_trunc_lock() 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 Change-Id: I81647fdec8d42f123e990553edb5e371636f45c0 Reviewed-on: https://review.whamcloud.com/37170 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Mike Pershin Reviewed-by: Lai Siyao Reviewed-by: Oleg Drokin --- lustre/osd-ldiskfs/osd_handler.c | 2 +- lustre/osd-ldiskfs/osd_internal.h | 2 +- lustre/osd-ldiskfs/osd_io.c | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index e606f7d..099510d 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -2034,7 +2034,7 @@ static int osd_trans_stop(const struct lu_env *env, struct dt_device *dt, OBD_FREE_PTR(oh); } - 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); diff --git a/lustre/osd-ldiskfs/osd_internal.h b/lustre/osd-ldiskfs/osd_internal.h index 81afee0..8419834 100644 --- a/lustre/osd-ldiskfs/osd_internal.h +++ b/lustre/osd-ldiskfs/osd_internal.h @@ -1475,7 +1475,7 @@ osd_index_backup(const struct lu_env *env, struct osd_device *osd, bool backup) 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); diff --git a/lustre/osd-ldiskfs/osd_io.c b/lustre/osd-ldiskfs/osd_io.c index 0cf03c4..b3e4c07 100644 --- a/lustre/osd-ldiskfs/osd_io.c +++ b/lustre/osd-ldiskfs/osd_io.c @@ -2196,13 +2196,14 @@ int osd_trunc_lock(struct osd_object *obj, struct osd_thandle *oh, bool 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; } -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) { @@ -2210,6 +2211,7 @@ void osd_trunc_unlock_all(struct list_head *list) 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); } -- 1.8.3.1