From: NeilBrown Date: Tue, 1 Oct 2019 18:12:23 +0000 (-0400) Subject: LU-10467 lov: use wait_event() in lov_subobject_kill() X-Git-Tag: 2.13.51~175 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=c0894d1d326701620c0b5538155053e7d93e719d LU-10467 lov: use wait_event() in lov_subobject_kill() lov_subobject_kill() has an open-coded version of wait_event(). Change it to use the macro. There is no need to take a spinlock just to check if a variable have changed value. If there was, the first test would be protected too. "lti_waiter" now has no users and can be removed from lov_thread_info. Change-Id: Ic1126fc500c03c48c4426171e98590ef6dce3098 Signed-off-by: NeilBrown Reviewed-on: https://review.whamcloud.com/36343 Tested-by: jenkins Reviewed-by: Neil Brown Tested-by: Maloo Reviewed-by: Shaun Tancheff Reviewed-by: Oleg Drokin --- diff --git a/lustre/lov/lov_cl_internal.h b/lustre/lov/lov_cl_internal.h index b811451..7768625 100644 --- a/lustre/lov/lov_cl_internal.h +++ b/lustre/lov/lov_cl_internal.h @@ -471,7 +471,6 @@ struct lov_thread_info { struct ost_lvb lti_lvb; struct cl_2queue lti_cl2q; struct cl_page_list lti_plist; - wait_queue_entry_t lti_waiter; }; /** diff --git a/lustre/lov/lov_object.c b/lustre/lov/lov_object.c index 64c99b3..c41a853 100644 --- a/lustre/lov/lov_object.c +++ b/lustre/lov/lov_object.c @@ -284,7 +284,6 @@ static void lov_subobject_kill(const struct lu_env *env, struct lov_object *lov, struct cl_object *sub; struct lu_site *site; wait_queue_head_t *wq; - wait_queue_entry_t *waiter; LASSERT(r0->lo_sub[idx] == los); @@ -299,27 +298,7 @@ static void lov_subobject_kill(const struct lu_env *env, struct lov_object *lov, /* ... wait until it is actually destroyed---sub-object clears its * ->lo_sub[] slot in lovsub_object_free() */ - if (r0->lo_sub[idx] == los) { - waiter = &lov_env_info(env)->lti_waiter; - init_waitqueue_entry(waiter, current); - add_wait_queue(wq, waiter); - set_current_state(TASK_UNINTERRUPTIBLE); - while (1) { - /* this wait-queue is signaled at the end of - * lu_object_free(). */ - set_current_state(TASK_UNINTERRUPTIBLE); - spin_lock(&r0->lo_sub_lock); - if (r0->lo_sub[idx] == los) { - spin_unlock(&r0->lo_sub_lock); - schedule(); - } else { - spin_unlock(&r0->lo_sub_lock); - set_current_state(TASK_RUNNING); - break; - } - } - remove_wait_queue(wq, waiter); - } + wait_event(*wq, r0->lo_sub[idx] != los); LASSERT(r0->lo_sub[idx] == NULL); }