static int osc_lock_unuse(const struct lu_env *env, const struct cl_lock_slice *slice) { struct osc_lock *ols = cl2osc_lock(slice); LINVRNT(osc_lock_invariant(ols)); switch (ols->ols_state) { case OLS_NEW: LASSERT(!ols->ols_hold); LASSERT(ols->ols_agl); return 0; case OLS_UPCALL_RECEIVED: osc_lock_unhold(ols); case OLS_ENQUEUED: LASSERT(!ols->ols_hold); osc_lock_detach(env, ols); ols->ols_state = OLS_NEW; return 0; case OLS_GRANTED: LASSERT(!ols->ols_glimpse); LASSERT(ols->ols_hold); /* * Move lock into OLS_RELEASED state before calling * osc_cancel_base() so that possible synchronous cancellation * (that always happens e.g., for liblustre) sees that lock is * released. */ ols->ols_state = OLS_RELEASED; return osc_lock_unhold(ols); default: CERROR("Impossible state: %d\n", ols->ols_state); LBUG(); } }
void osc_lock_fini(const struct lu_env *env, struct cl_lock_slice *slice) { struct osc_lock *ols = cl2osc_lock(slice); LINVRNT(osc_lock_invariant(ols)); LASSERT(ols->ols_dlmlock == NULL); OBD_SLAB_FREE_PTR(ols, osc_lock_kmem); }
static void osc_lock_fini(const struct lu_env *env, struct cl_lock_slice *slice) { struct osc_lock *ols = cl2osc_lock(slice); LINVRNT(osc_lock_invariant(ols)); LASSERT(!ols->ols_dlmlock); kmem_cache_free(osc_lock_kmem, ols); }
void mdc_lock_lockless_cancel(const struct lu_env *env, const struct cl_lock_slice *slice) { struct osc_lock *ols = cl2osc_lock(slice); struct osc_object *osc = cl2osc(slice->cls_obj); struct cl_lock_descr *descr = &slice->cls_lock->cll_descr; int rc; LASSERT(ols->ols_dlmlock == NULL); rc = mdc_lock_flush(env, osc, descr->cld_start, descr->cld_end, descr->cld_mode, 0); if (rc != 0) CERROR("Pages for lockless lock %p were not purged(%d)\n", ols, rc); osc_lock_wake_waiters(env, osc, ols); }
static void osc_lock_fini(const struct lu_env *env, struct cl_lock_slice *slice) { struct osc_lock *ols = cl2osc_lock(slice); LINVRNT(osc_lock_invariant(ols)); /* * ->ols_hold can still be true at this point if, for example, a * thread that requested a lock was killed (and released a reference * to the lock), before reply from a server was received. In this case * lock is destroyed immediately after upcall. */ osc_lock_unhold(ols); LASSERT(ols->ols_lock == NULL); LASSERT(atomic_read(&ols->ols_pageref) == 0 || atomic_read(&ols->ols_pageref) == _PAGEREF_MAGIC); OBD_SLAB_FREE_PTR(ols, osc_lock_kmem); }