Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 01866032 authored by Oleg Drokin's avatar Oleg Drokin Committed by Greg Kroah-Hartman
Browse files

staging/lustre/osc: Remove commented out osc_page_protected()



The complicated version of osc_page_protected and osc_page_is_dlocked
are unsafe and were commented out for ages, so probably no point in
carrying them on.

Signed-off-by: default avatarOleg Drokin <green@linuxhacker.ru>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 7b214b9b
Loading
Loading
Loading
Loading
+0 −99
Original line number Diff line number Diff line
@@ -51,111 +51,12 @@ static int osc_lru_reserve(const struct lu_env *env, struct osc_object *obj,
 *  @{
 */

/*
 * Comment out osc_page_protected because it may sleep inside the
 * the client_obd_list_lock.
 * client_obd_list_lock -> osc_ap_completion -> osc_completion ->
 *   -> osc_page_protected -> osc_page_is_dlocked -> osc_match_base
 *   -> ldlm_lock_match -> sptlrpc_import_check_ctx -> sleep.
 */
#if 0
static int osc_page_is_dlocked(const struct lu_env *env,
			       const struct osc_page *opg,
			       enum cl_lock_mode mode, int pending, int unref)
{
	struct cl_page	 *page;
	struct osc_object      *obj;
	struct osc_thread_info *info;
	struct ldlm_res_id     *resname;
	struct lustre_handle   *lockh;
	ldlm_policy_data_t     *policy;
	ldlm_mode_t	     dlmmode;
	__u64                   flags;

	might_sleep();

	info = osc_env_info(env);
	resname = &info->oti_resname;
	policy = &info->oti_policy;
	lockh = &info->oti_handle;
	page = opg->ops_cl.cpl_page;
	obj = cl2osc(opg->ops_cl.cpl_obj);

	flags = LDLM_FL_TEST_LOCK | LDLM_FL_BLOCK_GRANTED;
	if (pending)
		flags |= LDLM_FL_CBPENDING;

	dlmmode = osc_cl_lock2ldlm(mode) | LCK_PW;
	osc_lock_build_res(env, obj, resname);
	osc_index2policy(policy, page->cp_obj, page->cp_index, page->cp_index);
	return osc_match_base(osc_export(obj), resname, LDLM_EXTENT, policy,
			      dlmmode, &flags, NULL, lockh, unref);
}

/**
 * Checks an invariant that a page in the cache is covered by a lock, as
 * needed.
 */
static int osc_page_protected(const struct lu_env *env,
			      const struct osc_page *opg,
			      enum cl_lock_mode mode, int unref)
{
	struct cl_object_header *hdr;
	struct cl_lock	  *scan;
	struct cl_page	  *page;
	struct cl_lock_descr    *descr;
	int result;

	LINVRNT(!opg->ops_temp);

	page = opg->ops_cl.cpl_page;
	if (page->cp_owner != NULL &&
	    cl_io_top(page->cp_owner)->ci_lockreq == CILR_NEVER)
		/*
		 * If IO is done without locks (liblustre, or lloop), lock is
		 * not required.
		 */
		result = 1;
	else
		/* otherwise check for a DLM lock */
	result = osc_page_is_dlocked(env, opg, mode, 1, unref);
	if (result == 0) {
		/* maybe this page is a part of a lockless io? */
		hdr = cl_object_header(opg->ops_cl.cpl_obj);
		descr = &osc_env_info(env)->oti_descr;
		descr->cld_mode = mode;
		descr->cld_start = page->cp_index;
		descr->cld_end   = page->cp_index;
		spin_lock(&hdr->coh_lock_guard);
		list_for_each_entry(scan, &hdr->coh_locks, cll_linkage) {
			/*
			 * Lock-less sub-lock has to be either in HELD state
			 * (when io is actively going on), or in CACHED state,
			 * when top-lock is being unlocked:
			 * cl_io_unlock()->cl_unuse()->...->lov_lock_unuse().
			 */
			if ((scan->cll_state == CLS_HELD ||
			     scan->cll_state == CLS_CACHED) &&
			    cl_lock_ext_match(&scan->cll_descr, descr)) {
				struct osc_lock *olck;

				olck = osc_lock_at(scan);
				result = osc_lock_is_lockless(olck);
				break;
			}
		}
		spin_unlock(&hdr->coh_lock_guard);
	}
	return result;
}
#else
static int osc_page_protected(const struct lu_env *env,
			      const struct osc_page *opg,
			      enum cl_lock_mode mode, int unref)
{
	return 1;
}
#endif

/*****************************************************************************
 *