- if (olck->ols_state >= OLS_GRANTED)
- result = osc_lock_flush(olck,
- ldlm_is_discard_data(dlmlock));
- osc_lock_unhold(olck);
-
- lock_res_and_lock(dlmlock);
- /* Now that we're the only user of dlm read/write reference,
- * mostly the ->l_readers + ->l_writers should be zero.
- * However, there is a corner case.
- * See b=18829 for details.*/
- do_cancel = (dlmlock->l_readers == 0 &&
- dlmlock->l_writers == 0);
- ldlm_set_cbpending(dlmlock);
- unlock_res_and_lock(dlmlock);
- if (do_cancel)
- result = ldlm_cli_cancel(&olck->ols_handle, LCF_ASYNC);
- if (result < 0)
- CL_LOCK_DEBUG(D_ERROR, env, lock,
- "lock %p cancel failure with error(%d)\n",
- lock, result);
- }
- olck->ols_state = OLS_CANCELLED;
- olck->ols_flags &= ~LDLM_FL_LVB_READY;
- osc_lock_detach(env, olck);
-}
-
-#ifdef CONFIG_LUSTRE_DEBUG_EXPENSIVE_CHECK
-static int check_cb(const struct lu_env *env, struct cl_io *io,
- struct osc_page *ops, void *cbdata)
-{
- struct cl_lock *lock = cbdata;
-
- if (lock->cll_descr.cld_mode == CLM_READ) {
- struct cl_lock *tmp;
- tmp = cl_lock_at_pgoff(env, lock->cll_descr.cld_obj,
- osc_index(ops), lock, 1, 0);
- if (tmp != NULL) {
- cl_lock_put(env, tmp);
- return CLP_GANG_OKAY;
- }
- }
-
- CL_LOCK_DEBUG(D_ERROR, env, lock, "still has pages\n");
- CL_PAGE_DEBUG(D_ERROR, env, ops->ops_cl.cpl_page, "\n");
- return CLP_GANG_ABORT;
-}
-
-/**
- * Returns true iff there are pages under \a olck not protected by other
- * locks.
- */
-static int osc_lock_has_pages(struct osc_lock *olck)
-{
- struct cl_lock *lock;
- struct cl_lock_descr *descr;
- struct cl_object *obj;
- struct osc_object *oob;
- struct cl_env_nest nest;
- struct cl_io *io;
- struct lu_env *env;
- int result;
-
- env = cl_env_nested_get(&nest);
- if (IS_ERR(env))
- return 0;
-
- obj = olck->ols_cl.cls_obj;
- oob = cl2osc(obj);
- io = &oob->oo_debug_io;
- lock = olck->ols_cl.cls_lock;
- descr = &lock->cll_descr;
-
- mutex_lock(&oob->oo_debug_mutex);
-
- io->ci_obj = cl_object_top(obj);
- io->ci_ignore_layout = 1;
- cl_io_init(env, io, CIT_MISC, io->ci_obj);
- do {
- result = osc_page_gang_lookup(env, oob, io,
- descr->cld_start, descr->cld_end,
- check_cb, (void *)lock);
- if (result == CLP_GANG_ABORT)
- break;
- if (result == CLP_GANG_RESCHED)
- cond_resched();
- } while (result != CLP_GANG_OKAY);
- cl_io_fini(env, io);
- mutex_unlock(&oob->oo_debug_mutex);
- cl_env_nested_put(&nest, env);
-
- return (result == CLP_GANG_ABORT);
-}
-#else
-static int osc_lock_has_pages(struct osc_lock *olck)
-{
- return 0;
-}
-#endif /* CONFIG_LUSTRE_DEBUG_EXPENSIVE_CHECK */
-
-static void osc_lock_delete(const struct lu_env *env,
- const struct cl_lock_slice *slice)
-{
- struct osc_lock *olck;
-
- olck = cl2osc_lock(slice);
- if (olck->ols_glimpse) {
- LASSERT(!olck->ols_hold);
- LASSERT(!olck->ols_lock);
- return;
- }