Whamcloud - gitweb
LU-10336 osp: wakeup opd_pre_waitq when decrement opd_pre_reserved 97/30397/4
authorSergey Cheremencev <c17829@cray.com>
Wed, 6 Dec 2017 13:52:33 +0000 (16:52 +0300)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 8 Mar 2018 17:36:50 +0000 (17:36 +0000)
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 <c17829@cray.com>
Cray-bug-id: MRP-3623
Reviewed-on: https://review.whamcloud.com/30397
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Alexandr Boyko <c17825@cray.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/osp/osp_object.c
lustre/osp/osp_precreate.c

index 4e316c4..3e1edc2 100644 (file)
@@ -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);
        }
index 8fbdcb4..468763c 100644 (file)
@@ -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;