diff --git a/lustre/ldlm/ldlm_flock.c b/lustre/ldlm/ldlm_flock.c index 737de8235d88a4215ae4478519da1abcfb8d5963..2771a53cc4bb74bbc29636bdeccfe212d7d96550 100644 --- a/lustre/ldlm/ldlm_flock.c +++ b/lustre/ldlm/ldlm_flock.c @@ -547,18 +547,19 @@ ldlm_flock_completion_ast(struct ldlm_lock *lock, int flags, void *data) RETURN(rc); granted: + LDLM_DEBUG(lock, "client-side enqueue granted"); + ns = lock->l_resource->lr_namespace; + lock_res(lock->l_resource); + /* before flock's complete ast gets here, the flock * can possibly be freed by another thread */ if (lock->l_destroyed) { LDLM_DEBUG(lock, "already destroyed by another thread"); + unlock_res(lock->l_resource); RETURN(0); } - LDLM_DEBUG(lock, "client-side enqueue granted"); - ns = lock->l_resource->lr_namespace; - lock_res(lock->l_resource); - /* take lock off the deadlock detection waitq. */ spin_lock(&ldlm_flock_waitq_lock); list_del_init(&lock->l_flock_waitq);