diff --git a/lustre/ldlm/ldlm_request.c b/lustre/ldlm/ldlm_request.c index 4dbe0995734e8ca14cd70a66efb889296e5d9bfd..7933e50674ce3f3c6c75e53304eea46c9fd4f7fe 100644 --- a/lustre/ldlm/ldlm_request.c +++ b/lustre/ldlm/ldlm_request.c @@ -1047,22 +1047,25 @@ int ldlm_cancel_lru_local(struct ldlm_namespace *ns, struct list_head *cancels, if (count != 0 && added > count) break; - /* Calculate lv for every lock. */ - spin_lock(&pl->pl_lock); - slv = ldlm_pool_get_slv(pl); - lvf = atomic_read(&pl->pl_lock_volume_factor); - spin_unlock(&pl->pl_lock); - - la = cfs_duration_sec(cfs_time_sub(cur, - lock->l_last_used)); - if (la == 0) - la = 1; + /* Cancel locks by lru only in the case of count == 0. */ + if (count == 0) { + /* Calculate lv for every lock. */ + spin_lock(&pl->pl_lock); + slv = ldlm_pool_get_slv(pl); + lvf = atomic_read(&pl->pl_lock_volume_factor); + spin_unlock(&pl->pl_lock); + + la = cfs_duration_sec(cfs_time_sub(cur, + lock->l_last_used)); + if (la == 0) + la = 1; - /* Stop when slv is not yet come from server or lv is - * smaller than it is. */ - lv = lvf * la * unused; - if (slv == 1 || lv < slv) - break; + /* Stop when slv is not yet come from server or + * lv is smaller than it is. */ + lv = lvf * la * unused; + if (slv == 1 || lv < slv) + break; + } } else { if ((added >= count) && (!(flags & LDLM_CANCEL_AGED) || diff --git a/lustre/ldlm/ldlm_resource.c b/lustre/ldlm/ldlm_resource.c index ac082e7dfe3becbaa4a6df5a3b25235c68071a85..78ad0859a3df37dbda8e87bf901097bb01359c97 100644 --- a/lustre/ldlm/ldlm_resource.c +++ b/lustre/ldlm/ldlm_resource.c @@ -140,8 +140,16 @@ static int lprocfs_wr_lru_size(struct file *file, const char *buffer, "dropping all unused locks from namespace %s\n", ns->ns_name); if (ns_connect_lru_resize(ns)) { + int canceled, unused = ns->ns_nr_unused; + /* Try to cancel all @ns_nr_unused locks. */ - ldlm_cancel_lru(ns, ns->ns_nr_unused, LDLM_SYNC); + canceled = ldlm_cancel_lru(ns, unused, LDLM_SYNC); + if (canceled < unused) { + CERROR("not all requested locks are canceled, " + "requested: %d, canceled: %d\n", unused, + canceled); + return -EINVAL; + } } else { tmp = ns->ns_max_unused; ns->ns_max_unused = 0;