* in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see [sun.com URL with a
- * copy of GPLv2].
+ * version 2 along with this program; If not, see
+ * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
lock_vars[0].write_fptr = lprocfs_wr_lru_size;
lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
- snprintf(lock_name, MAX_STRING_SIZE, "%s/shrink_thumb",
- ns->ns_name);
- lock_vars[0].data = ns;
- lock_vars[0].read_fptr = lprocfs_rd_uint;
- lock_vars[0].write_fptr = lprocfs_wr_uint;
- lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
-
snprintf(lock_name, MAX_STRING_SIZE, "%s/lru_max_age",
ns->ns_name);
lock_vars[0].data = &ns->ns_max_age;
lock_vars[0].write_fptr = lprocfs_wr_uint;
lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+ snprintf(lock_name, MAX_STRING_SIZE, "%s/lock_timeouts",
+ ns->ns_name);
+ lock_vars[0].data = &ns->ns_timeouts;
+ lock_vars[0].read_fptr = lprocfs_rd_uint;
+ lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+
snprintf(lock_name, MAX_STRING_SIZE, "%s/max_nolock_bytes",
ns->ns_name);
lock_vars[0].data = &ns->ns_max_nolock_size;
if (!ns->ns_hash)
GOTO(out_ns, NULL);
- ns->ns_shrink_thumb = LDLM_LOCK_SHRINK_THUMB;
ns->ns_appetite = apt;
LASSERT(obd != NULL);
ns->ns_max_unused = LDLM_DEFAULT_LRU_SIZE;
ns->ns_max_age = LDLM_DEFAULT_MAX_ALIVE;
ns->ns_ctime_age_limit = LDLM_CTIME_AGE_LIMIT;
+ ns->ns_timeouts = 0;
spin_lock_init(&ns->ns_unused_lock);
ns->ns_orig_connect_flags = 0;
ns->ns_connect_flags = 0;
LDLM_DEBUG(lock, "setting FL_LOCAL_ONLY");
if (lock->l_completion_ast)
lock->l_completion_ast(lock, 0, NULL);
- LDLM_LOCK_PUT(lock);
+ LDLM_LOCK_RELEASE(lock);
continue;
}
"client node");
ldlm_lock_destroy(lock);
}
- LDLM_LOCK_PUT(lock);
+ LDLM_LOCK_RELEASE(lock);
} while (1);
EXIT;
res = list_entry(tmp, struct ldlm_resource, lr_hash);
ldlm_resource_getref(res);
spin_unlock(&ns->ns_hash_lock);
+ LDLM_RESOURCE_ADDREF(res);
cleanup_resource(res, &res->lr_granted, flags);
cleanup_resource(res, &res->lr_converting, flags);
* client gets blocking ast when lock gets distracted by
* server. This is 1_4 branch solution, let's see how
* will it behave. */
+ LDLM_RESOURCE_DELREF(res);
if (!ldlm_resource_putref_locked(res))
CDEBUG(D_INFO,
"Namespace %s resource refcount nonzero "
void ldlm_namespace_get_locked(struct ldlm_namespace *ns)
{
- LASSERT(ns->ns_refcount >= 0);
ns->ns_refcount++;
}
struct ldlm_resource *res;
int idx;
- OBD_SLAB_ALLOC(res, ldlm_resource_slab, CFS_ALLOC_IO, sizeof *res);
+ OBD_SLAB_ALLOC_PTR_GFP(res, ldlm_resource_slab, CFS_ALLOC_IO);
if (res == NULL)
return NULL;
atomic_set(&res->lr_refcount, 1);
spin_lock_init(&res->lr_lock);
+ lu_ref_init(&res->lr_reference);
/* one who creates the resource must unlock
* the semaphore after lvb initialization */
ldlm_namespace_put_locked(ns, 0);
list_del_init(&res->lr_hash);
list_del_init(&res->lr_childof);
+ lu_ref_fini(&res->lr_reference);
ns->ns_resources--;
if (ns->ns_resources == 0)
check_res_locked(res);
ldlm_resource_dump(D_INFO, res);
- CDEBUG(D_INFO, "About to add this lock:\n");
- ldlm_lock_dump(D_INFO, lock, 0);
+ CDEBUG(D_OTHER, "About to add this lock:\n");
+ ldlm_lock_dump(D_OTHER, lock, 0);
if (lock->l_destroyed) {
CDEBUG(D_OTHER, "Lock destroyed, not adding to resource\n");
check_res_locked(res);
- ldlm_resource_dump(D_OTHER, res);
+ ldlm_resource_dump(D_INFO, res);
CDEBUG(D_OTHER, "About to insert this lock after %p:\n", original);
ldlm_lock_dump(D_OTHER, new, 0);
ldlm_resource_getref(res);
spin_unlock(&ns->ns_hash_lock);
+ LDLM_RESOURCE_ADDREF(res);
lock_res(res);
ldlm_resource_dump(level, res);
unlock_res(res);
+ LDLM_RESOURCE_DELREF(res);
spin_lock(&ns->ns_hash_lock);
tmp = tmp->next;
ldlm_resource_putref_locked(res);