|
@@ -601,7 +601,7 @@ int ldlm_prep_elc_req(struct obd_export *exp, struct ptlrpc_request *req,
|
|
|
avail = ldlm_capsule_handles_avail(pill, RCL_CLIENT, canceloff);
|
|
|
|
|
|
flags = ns_connect_lru_resize(ns) ?
|
|
|
- LDLM_CANCEL_LRUR : LDLM_CANCEL_AGED;
|
|
|
+ LDLM_CANCEL_LRUR_NO_WAIT : LDLM_CANCEL_AGED;
|
|
|
to_free = !ns_connect_lru_resize(ns) &&
|
|
|
opc == LDLM_ENQUEUE ? 1 : 0;
|
|
|
|
|
@@ -1146,7 +1146,7 @@ static ldlm_policy_res_t ldlm_cancel_no_wait_policy(struct ldlm_namespace *ns,
|
|
|
switch (lock->l_resource->lr_type) {
|
|
|
case LDLM_EXTENT:
|
|
|
case LDLM_IBITS:
|
|
|
- if (ns->ns_cancel && ns->ns_cancel(lock) != 0)
|
|
|
+ if (ns->ns_cancel && ns->ns_cancel(lock) != 0)
|
|
|
break;
|
|
|
default:
|
|
|
result = LDLM_POLICY_SKIP_LOCK;
|
|
@@ -1251,6 +1251,21 @@ static ldlm_policy_res_t ldlm_cancel_aged_policy(struct ldlm_namespace *ns,
|
|
|
return LDLM_POLICY_CANCEL_LOCK;
|
|
|
}
|
|
|
|
|
|
+static ldlm_policy_res_t
|
|
|
+ldlm_cancel_lrur_no_wait_policy(struct ldlm_namespace *ns,
|
|
|
+ struct ldlm_lock *lock,
|
|
|
+ int unused, int added,
|
|
|
+ int count)
|
|
|
+{
|
|
|
+ ldlm_policy_res_t result;
|
|
|
+
|
|
|
+ result = ldlm_cancel_lrur_policy(ns, lock, unused, added, count);
|
|
|
+ if (result == LDLM_POLICY_KEEP_LOCK)
|
|
|
+ return result;
|
|
|
+
|
|
|
+ return ldlm_cancel_no_wait_policy(ns, lock, unused, added, count);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* Callback function for default policy. Makes decision whether to keep \a lock
|
|
|
* in LRU for current LRU size \a unused, added in current scan \a added and
|
|
@@ -1290,6 +1305,8 @@ ldlm_cancel_lru_policy(struct ldlm_namespace *ns, int flags)
|
|
|
return ldlm_cancel_lrur_policy;
|
|
|
else if (flags & LDLM_CANCEL_PASSED)
|
|
|
return ldlm_cancel_passed_policy;
|
|
|
+ else if (flags & LDLM_CANCEL_LRUR_NO_WAIT)
|
|
|
+ return ldlm_cancel_lrur_no_wait_policy;
|
|
|
} else {
|
|
|
if (flags & LDLM_CANCEL_AGED)
|
|
|
return ldlm_cancel_aged_policy;
|
|
@@ -1338,6 +1355,7 @@ static int ldlm_prepare_lru_list(struct ldlm_namespace *ns,
|
|
|
ldlm_cancel_lru_policy_t pf;
|
|
|
struct ldlm_lock *lock, *next;
|
|
|
int added = 0, unused, remained;
|
|
|
+ int no_wait = flags & (LDLM_CANCEL_NO_WAIT | LDLM_CANCEL_LRUR_NO_WAIT);
|
|
|
|
|
|
spin_lock(&ns->ns_lock);
|
|
|
unused = ns->ns_nr_unused;
|
|
@@ -1365,8 +1383,7 @@ static int ldlm_prepare_lru_list(struct ldlm_namespace *ns,
|
|
|
/* No locks which got blocking requests. */
|
|
|
LASSERT(!(lock->l_flags & LDLM_FL_BL_AST));
|
|
|
|
|
|
- if (flags & LDLM_CANCEL_NO_WAIT &&
|
|
|
- lock->l_flags & LDLM_FL_SKIPPED)
|
|
|
+ if (no_wait && lock->l_flags & LDLM_FL_SKIPPED)
|
|
|
/* already processed */
|
|
|
continue;
|
|
|
|