-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
* GPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011 Whamcloud, Inc.
- *
+ * Copyright (c) 2010, 2011, Whamcloud, Inc.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
RETURN(0);
}
+EXPORT_SYMBOL(ldlm_expired_completion_wait);
/* We use the same basis for both server side and client side functions
from a single node. */
LDLM_DEBUG(lock, "client-side enqueue returned a blocked lock, "
"going forward");
- ldlm_lock_dump(D_OTHER, lock, 0);
ldlm_reprocess_all(lock->l_resource);
RETURN(0);
}
+EXPORT_SYMBOL(ldlm_completion_ast_async);
/**
* Client side LDLM "completion" AST. This is called in several cases:
LDLM_DEBUG(lock, "client-side enqueue returned a blocked lock, "
"sleeping");
- ldlm_lock_dump(D_OTHER, lock, 0);
noreproc:
RETURN(ldlm_completion_tail(lock));
}
+EXPORT_SYMBOL(ldlm_completion_ast);
/**
* A helper to build a blocking ast function
}
RETURN(0);
}
+EXPORT_SYMBOL(ldlm_blocking_ast_nocheck);
/**
* Server blocking AST
}
RETURN(ldlm_blocking_ast_nocheck(lock));
}
+EXPORT_SYMBOL(ldlm_blocking_ast);
/*
* ->l_glimpse_ast() for DLM extent locks acquired on the server-side. See
*/
return -ELDLM_NO_LOCK_DATA;
}
+EXPORT_SYMBOL(ldlm_glimpse_ast);
int ldlm_cli_enqueue_local(struct ldlm_namespace *ns,
const struct ldlm_res_id *res_id,
out_nolock:
return err;
}
+EXPORT_SYMBOL(ldlm_cli_enqueue_local);
static void failed_lock_cleanup(struct ldlm_namespace *ns,
struct ldlm_lock *lock, int mode)
lock_res_and_lock(lock);
/* Key change rehash lock in per-export hash with new key */
if (exp->exp_lock_hash) {
+ /* In the function below, .hs_keycmp resolves to
+ * ldlm_export_lock_keycmp() */
+ /* coverity[overrun-buffer-val] */
cfs_hash_rehash_key(exp->exp_lock_hash,
&lock->l_remote_handle,
&reply->lock_handle,
if (!(type == LDLM_IBITS && !(exp->exp_connect_flags &
OBD_CONNECT_IBITS)))
/* We assume lock type cannot change on server*/
- ldlm_convert_policy_to_local(
+ ldlm_convert_policy_to_local(exp,
lock->l_resource->lr_type,
&reply->lock_desc.l_policy_data,
&lock->l_policy_data);
LDLM_LOCK_RELEASE(lock);
return rc;
}
+EXPORT_SYMBOL(ldlm_cli_enqueue_fini);
/* PAGE_SIZE-512 is to allow TCP/IP and LNET headers to fit into
* a single page on the send/receive side. XXX: 512 should be changed
struct ldlm_namespace *ns = exp->exp_obd->obd_namespace;
struct req_capsule *pill = &req->rq_pill;
struct ldlm_request *dlm = NULL;
- int flags, avail, to_free, bufcount, pack = 0;
+ int flags, avail, to_free, pack = 0;
CFS_LIST_HEAD(head);
int rc;
ENTRY;
cancels = &head;
if (exp_connect_cancelset(exp)) {
/* Estimate the amount of available space in the request. */
- bufcount = req_capsule_filled_sizes(pill, RCL_CLIENT);
+ req_capsule_filled_sizes(pill, RCL_CLIENT);
avail = ldlm_capsule_handles_avail(pill, RCL_CLIENT, canceloff);
flags = ns_connect_lru_resize(ns) ?
}
RETURN(0);
}
+EXPORT_SYMBOL(ldlm_prep_elc_req);
int ldlm_prep_enqueue_req(struct obd_export *exp, struct ptlrpc_request *req,
cfs_list_t *cancels, int count)
return ldlm_prep_elc_req(exp, req, LUSTRE_DLM_VERSION, LDLM_ENQUEUE,
LDLM_ENQUEUE_CANCEL_OFF, cancels, count);
}
+EXPORT_SYMBOL(ldlm_prep_enqueue_req);
/* If a request has some specific initialisation it is passed in @reqp,
* otherwise it is created in ldlm_cli_enqueue.
LDLM_DEBUG(lock, "client-side enqueue START");
}
+ lock->l_conn_export = exp;
+ lock->l_export = NULL;
+ lock->l_blocking_ast = einfo->ei_cb_bl;
+ lock->l_flags |= (*flags & LDLM_FL_NO_LRU);
+
/* lock not sent to server yet */
if (reqp == NULL || *reqp == NULL) {
DLM_LOCKREQ_OFF, len, (int)sizeof(*body));
}
- lock->l_conn_export = exp;
- lock->l_export = NULL;
- lock->l_blocking_ast = einfo->ei_cb_bl;
- lock->l_flags |= (*flags & LDLM_FL_NO_LRU);
-
/* Dump lock data into the request buffer */
body = req_capsule_client_get(&req->rq_pill, &RMF_DLM_REQ);
ldlm_lock2desc(lock, &body->lock_desc);
RETURN(rc);
}
+EXPORT_SYMBOL(ldlm_cli_enqueue);
static int ldlm_cli_convert_local(struct ldlm_lock *lock, int new_mode,
__u32 *flags)
ptlrpc_req_finished(req);
return rc;
}
+EXPORT_SYMBOL(ldlm_cli_convert);
/* Cancel locks locally.
* Returns:
count = free;
while (1) {
- int bufcount;
-
imp = class_exp2cliimp(exp);
if (imp == NULL || imp->imp_invalid) {
CDEBUG(D_DLMTRACE,
if (req == NULL)
GOTO(out, rc = -ENOMEM);
- bufcount = req_capsule_filled_sizes(&req->rq_pill, RCL_CLIENT);
+ req_capsule_filled_sizes(&req->rq_pill, RCL_CLIENT);
req_capsule_set_size(&req->rq_pill, &RMF_DLM_REQ, RCL_CLIENT,
ldlm_request_bufsize(count, LDLM_CANCEL));
ptlrpc_request_set_replen(req);
if (flags & LCF_ASYNC) {
- ptlrpcd_add_req(req, PSCOPE_OTHER);
+ ptlrpcd_add_req(req, PDL_POLICY_LOCAL, -1);
sent = count;
GOTO(out, 0);
} else {
out:
return sent ? sent : rc;
}
+EXPORT_SYMBOL(ldlm_cli_cancel_req);
static inline struct ldlm_pool *ldlm_imp2pl(struct obd_import *imp)
{
int ldlm_cli_update_pool(struct ptlrpc_request *req)
{
struct obd_device *obd;
- __u64 old_slv, new_slv;
+ __u64 new_slv;
__u32 new_limit;
ENTRY;
if (unlikely(!req->rq_import || !req->rq_import->imp_obd ||
* oops in that time.
*/
cfs_write_lock(&obd->obd_pool_lock);
- old_slv = obd->obd_pool_slv;
obd->obd_pool_slv = new_slv;
obd->obd_pool_limit = new_limit;
cfs_write_unlock(&obd->obd_pool_lock);
ldlm_cli_cancel_list(&cancels, count, NULL, 0);
RETURN(0);
}
+EXPORT_SYMBOL(ldlm_cli_cancel);
/* XXX until we will have compound requests and can cut cancels from generic rpc
* we need send cancels with LDLM_FL_BL_AST flag as separate rpc */
RETURN(count);
}
+EXPORT_SYMBOL(ldlm_cli_cancel_list_local);
/**
* Cancel as many locks as possible w/o sending any rpcs (e.g. to write back
RETURN(ldlm_cli_cancel_list_local(cancels, count, cancel_flags));
}
+EXPORT_SYMBOL(ldlm_cancel_resource_local);
/* If @req is NULL, send CANCEL request to server with handles of locks
* in the @cancels. If EARLY_CANCEL is not supported, send CANCEL requests
LASSERT(count == 0);
RETURN(0);
}
+EXPORT_SYMBOL(ldlm_cli_cancel_list);
int ldlm_cli_cancel_unused_resource(struct ldlm_namespace *ns,
const struct ldlm_res_id *res_id,
ldlm_resource_putref(res);
RETURN(0);
}
+EXPORT_SYMBOL(ldlm_cli_cancel_unused_resource);
struct ldlm_cli_cancel_arg {
int lc_flags;
RETURN(ELDLM_OK);
}
}
+EXPORT_SYMBOL(ldlm_cli_cancel_unused);
/* Lock iterators. */
unlock_res(res);
RETURN(rc);
}
+EXPORT_SYMBOL(ldlm_resource_foreach);
struct iter_helper_data {
ldlm_iterator_t iter;
ldlm_res_iter_helper, &helper);
}
+EXPORT_SYMBOL(ldlm_namespace_foreach);
/* non-blocking function to manipulate a lock whose cb_data is being put away.
* return 0: find no resource
ldlm_resource_putref(res);
RETURN(rc);
}
+EXPORT_SYMBOL(ldlm_resource_iterate);
/* Lock replay */
/* Key change rehash lock in per-export hash with new key */
exp = req->rq_export;
if (exp && exp->exp_lock_hash) {
+ /* In the function below, .hs_keycmp resolves to
+ * ldlm_export_lock_keycmp() */
+ /* coverity[overrun-buffer-val] */
cfs_hash_rehash_key(exp->exp_lock_hash,
&lock->l_remote_handle,
&reply->lock_handle,
LDLM_LOCK_PUT(lock);
out:
if (rc != ELDLM_OK)
- ptlrpc_connect_import(req->rq_import, NULL);
+ ptlrpc_connect_import(req->rq_import);
RETURN(rc);
}
aa = ptlrpc_req_async_args(req);
aa->lock_handle = body->lock_handle[0];
req->rq_interpret_reply = (ptlrpc_interpterer_t)replay_lock_interpret;
- ptlrpcd_add_req(req, PSCOPE_OTHER);
+ ptlrpcd_add_req(req, PDL_POLICY_LOCAL, -1);
RETURN(0);
}
RETURN(rc);
}
+EXPORT_SYMBOL(ldlm_replay_locks);