Whamcloud - gitweb
git://git.whamcloud.com
/
fs
/
lustre-release.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
LU-1046 ldlm: hold ldlm_cb_set_arg until the last user exit
[fs/lustre-release.git]
/
lustre
/
ldlm
/
ldlm_internal.h
diff --git
a/lustre/ldlm/ldlm_internal.h
b/lustre/ldlm/ldlm_internal.h
index
c5b2139
..
aa0faef
100644
(file)
--- a/
lustre/ldlm/ldlm_internal.h
+++ b/
lustre/ldlm/ldlm_internal.h
@@
-28,6
+28,9
@@
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2011 Whamcloud, Inc.
+ *
*/
/*
* This file is part of Lustre, http://www.lustre.org/
*/
/*
* This file is part of Lustre, http://www.lustre.org/
@@
-43,6
+46,12
@@
extern cfs_list_t ldlm_srv_namespace_list;
extern cfs_semaphore_t ldlm_cli_namespace_lock;
extern cfs_list_t ldlm_cli_namespace_list;
extern cfs_semaphore_t ldlm_cli_namespace_lock;
extern cfs_list_t ldlm_cli_namespace_list;
+static inline int ldlm_res_eq(const struct ldlm_res_id *res0,
+ const struct ldlm_res_id *res1)
+{
+ return !memcmp(res0, res1, sizeof(*res0));
+}
+
static inline cfs_atomic_t *ldlm_namespace_nr(ldlm_side_t client)
{
return client == LDLM_NAMESPACE_SERVER ?
static inline cfs_atomic_t *ldlm_namespace_nr(ldlm_side_t client)
{
return client == LDLM_NAMESPACE_SERVER ?
@@
-94,16
+103,24
@@
void ldlm_namespace_free_prior(struct ldlm_namespace *ns,
void ldlm_namespace_free_post(struct ldlm_namespace *ns);
/* ldlm_lock.c */
void ldlm_namespace_free_post(struct ldlm_namespace *ns);
/* ldlm_lock.c */
-/* Number of blocking/completion callbacks that will be sent in
- * parallel (see bug 11301). */
-#define PARALLEL_AST_LIMIT 200
-
struct ldlm_cb_set_arg {
struct ldlm_cb_set_arg {
- struct ptlrpc_request_set *set;
+ int type; /* LDLM_BL_CALLBACK or LDLM_CP_CALLBACK */
+ unsigned int threshold; /* threshold to wake up the waiting proc */
+ cfs_atomic_t rpcs; /* # of inflight rpcs in set */
cfs_atomic_t restart;
cfs_atomic_t restart;
- __u32 type; /* LDLM_BL_CALLBACK or LDLM_CP_CALLBACK */
+ cfs_atomic_t refcount;
+ cfs_waitq_t waitq;
};
};
+static inline void ldlm_csa_put(struct ldlm_cb_set_arg *arg)
+{
+ if (cfs_atomic_dec_and_test(&arg->refcount)) {
+ LASSERT(cfs_atomic_read(&arg->rpcs) == 0);
+
+ OBD_FREE_PTR(arg);
+ }
+}
+
typedef enum {
LDLM_WORK_BL_AST,
LDLM_WORK_CP_AST,
typedef enum {
LDLM_WORK_BL_AST,
LDLM_WORK_CP_AST,
@@
-126,7
+143,8
@@
void ldlm_add_ast_work_item(struct ldlm_lock *lock, struct ldlm_lock *new,
cfs_list_t *work_list);
int ldlm_reprocess_queue(struct ldlm_resource *res, cfs_list_t *queue,
cfs_list_t *work_list);
cfs_list_t *work_list);
int ldlm_reprocess_queue(struct ldlm_resource *res, cfs_list_t *queue,
cfs_list_t *work_list);
-int ldlm_run_ast_work(cfs_list_t *rpc_list, ldlm_desc_ast_t ast_type);
+int ldlm_run_ast_work(struct ldlm_namespace *ns, cfs_list_t *rpc_list,
+ ldlm_desc_ast_t ast_type);
int ldlm_lock_remove_from_lru(struct ldlm_lock *lock);
int ldlm_lock_remove_from_lru_nolock(struct ldlm_lock *lock);
void ldlm_lock_add_to_lru_nolock(struct ldlm_lock *lock);
int ldlm_lock_remove_from_lru(struct ldlm_lock *lock);
int ldlm_lock_remove_from_lru_nolock(struct ldlm_lock *lock);
void ldlm_lock_add_to_lru_nolock(struct ldlm_lock *lock);
@@
-252,7
+270,7
@@
static inline int is_granted_or_cancelled(struct ldlm_lock *lock)
lock_res_and_lock(lock);
if (((lock->l_req_mode == lock->l_granted_mode) &&
!(lock->l_flags & LDLM_FL_CP_REQD)) ||
lock_res_and_lock(lock);
if (((lock->l_req_mode == lock->l_granted_mode) &&
!(lock->l_flags & LDLM_FL_CP_REQD)) ||
- (lock->l_flags &
LDLM_FL_FAILED
))
+ (lock->l_flags &
(LDLM_FL_FAILED | LDLM_FL_CANCEL)
))
ret = 1;
unlock_res_and_lock(lock);
ret = 1;
unlock_res_and_lock(lock);