From 4caf5cde3b589a3a9a31caa07907a88236df0178 Mon Sep 17 00:00:00 2001 From: Sergey Cheremencev Date: Wed, 6 Dec 2017 16:52:33 +0300 Subject: [PATCH] LU-10336 osp: wakeup opd_pre_waitq when decrement opd_pre_reserved osp_precreate_cleanup_orphans could be blocked due to reserved objects. In such case it set opd_pre_recovering flag and waits until opd_pre_reserved becomes 0. Thus we need to wake it up when opd_pre_reserved is reset to 0. Change-Id: Ib8d4708685c3c9675872577985a4c6897e3ee385 Signed-off-by: Sergey Cheremencev Cray-bug-id: MRP-3623 Reviewed-on: https://review.whamcloud.com/30397 Reviewed-by: Alex Zhuravlev Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Alexandr Boyko Reviewed-by: Oleg Drokin --- lustre/osp/osp_object.c | 8 ++++++++ lustre/osp/osp_precreate.c | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lustre/osp/osp_object.c b/lustre/osp/osp_object.c index 4e316c4..3e1edc2 100644 --- a/lustre/osp/osp_object.c +++ b/lustre/osp/osp_object.c @@ -2270,6 +2270,14 @@ static void osp_object_release(const struct lu_env *env, struct lu_object *o) d->opd_pre_reserved--; spin_unlock(&d->opd_pre_lock); + /* + * Check that osp_precreate_cleanup_orphans is not blocked + * due to opd_pre_reserved > 0. + */ + if (unlikely(d->opd_pre_reserved == 0 && + (d->opd_pre_recovering || d->opd_pre_status))) + wake_up(&d->opd_pre_waitq); + /* not needed in cache any more */ set_bit(LU_OBJECT_HEARD_BANSHEE, &o->lo_header->loh_flags); } diff --git a/lustre/osp/osp_precreate.c b/lustre/osp/osp_precreate.c index 8fbdcb4..468763c 100644 --- a/lustre/osp/osp_precreate.c +++ b/lustre/osp/osp_precreate.c @@ -1544,7 +1544,8 @@ int osp_precreate_get_fid(const struct lu_env *env, struct osp_device *d, * all reservations are released, see comment in * osp_precreate_thread() just before orphan cleanup */ - if (unlikely(d->opd_pre_reserved == 0 && d->opd_pre_status)) + if (unlikely(d->opd_pre_reserved == 0 && + (d->opd_pre_recovering || d->opd_pre_status))) wake_up(&d->opd_pre_waitq); return 0; -- 1.8.3.1