X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fldlm%2Fldlm_lock.c;h=165fe683d5452dd1a065bd582463b832ebb1e286;hp=bb17c8a97a29b89b4b301acbf93a774dd1b2282d;hb=2ad695f40cf1920033d77723311ed5ed7a3b07cc;hpb=7b2ab9beae02080797ff2da5105eaddadd67c151 diff --git a/lustre/ldlm/ldlm_lock.c b/lustre/ldlm/ldlm_lock.c index bb17c8a..165fe68 100644 --- a/lustre/ldlm/ldlm_lock.c +++ b/lustre/ldlm/ldlm_lock.c @@ -63,6 +63,7 @@ char *ldlm_lockname[] = { [LCK_GROUP] "GROUP", [LCK_COS] "COS" }; +EXPORT_SYMBOL(ldlm_lockname); char *ldlm_typename[] = { [LDLM_PLAIN] "PLN", @@ -70,6 +71,7 @@ char *ldlm_typename[] = { [LDLM_FLOCK] "FLK", [LDLM_IBITS] "IBT", }; +EXPORT_SYMBOL(ldlm_typename); static ldlm_policy_wire_to_local_t ldlm_policy_wire18_to_local[] = { [LDLM_PLAIN - LDLM_MIN_TYPE] ldlm_plain_policy_wire_to_local, @@ -152,6 +154,7 @@ char *ldlm_it2str(int it) return "UNKNOWN"; } } +EXPORT_SYMBOL(ldlm_it2str); extern cfs_mem_cache_t *ldlm_lock_slab; @@ -169,12 +172,14 @@ ldlm_processing_policy ldlm_get_processing_policy(struct ldlm_resource *res) { return ldlm_processing_policy_table[res->lr_type]; } +EXPORT_SYMBOL(ldlm_get_processing_policy); #endif /* HAVE_SERVER_SUPPORT */ void ldlm_register_intent(struct ldlm_namespace *ns, ldlm_res_policy arg) { ns->ns_policy = arg; } +EXPORT_SYMBOL(ldlm_register_intent); /* * REFCOUNTED LOCK OBJECTS @@ -192,6 +197,7 @@ struct ldlm_lock *ldlm_lock_get(struct ldlm_lock *lock) cfs_atomic_inc(&lock->l_refc); return lock; } +EXPORT_SYMBOL(ldlm_lock_get); void ldlm_lock_put(struct ldlm_lock *lock) { @@ -230,6 +236,7 @@ void ldlm_lock_put(struct ldlm_lock *lock) EXIT; } +EXPORT_SYMBOL(ldlm_lock_put); int ldlm_lock_remove_from_lru_nolock(struct ldlm_lock *lock) { @@ -338,6 +345,9 @@ int ldlm_lock_destroy_internal(struct ldlm_lock *lock) if (lock->l_export && lock->l_export->exp_lock_hash) { /* NB: it's safe to call cfs_hash_del() even lock isn't * in exp_lock_hash. */ + /* In the function below, .hs_keycmp resolves to + * ldlm_export_lock_keycmp() */ + /* coverity[overrun-buffer-val] */ cfs_hash_del(lock->l_export->exp_lock_hash, &lock->l_remote_handle, &lock->l_exp_hash); } @@ -517,6 +527,7 @@ int ldlm_lock_change_resource(struct ldlm_namespace *ns, struct ldlm_lock *lock, RETURN(0); } +EXPORT_SYMBOL(ldlm_lock_change_resource); /* * HANDLES @@ -526,6 +537,7 @@ void ldlm_lock2handle(const struct ldlm_lock *lock, struct lustre_handle *lockh) { lockh->cookie = lock->l_handle.h_cookie; } +EXPORT_SYMBOL(ldlm_lock2handle); /* if flags: atomically get the lock and set the flags. * Return NULL if flag already set @@ -574,6 +586,7 @@ struct ldlm_lock *__ldlm_handle2lock(const struct lustre_handle *handle, unlock_res_and_lock(lock); RETURN(lock); } +EXPORT_SYMBOL(__ldlm_handle2lock); void ldlm_lock2desc(struct ldlm_lock *lock, struct ldlm_lock_desc *desc) { @@ -623,6 +636,7 @@ void ldlm_lock2desc(struct ldlm_lock *lock, struct ldlm_lock_desc *desc) &desc->l_policy_data); } } +EXPORT_SYMBOL(ldlm_lock2desc); void ldlm_add_bl_work_item(struct ldlm_lock *lock, struct ldlm_lock *new, cfs_list_t *work_list) @@ -675,6 +689,7 @@ void ldlm_lock_addref(struct lustre_handle *lockh, __u32 mode) ldlm_lock_addref_internal(lock, mode); LDLM_LOCK_PUT(lock); } +EXPORT_SYMBOL(ldlm_lock_addref); void ldlm_lock_addref_internal_nolock(struct ldlm_lock *lock, __u32 mode) { @@ -719,6 +734,7 @@ int ldlm_lock_addref_try(struct lustre_handle *lockh, __u32 mode) } return result; } +EXPORT_SYMBOL(ldlm_lock_addref_try); /* only called for local locks */ void ldlm_lock_addref_internal(struct ldlm_lock *lock, __u32 mode) @@ -825,6 +841,7 @@ void ldlm_lock_decref(struct lustre_handle *lockh, __u32 mode) ldlm_lock_decref_internal(lock, mode); LDLM_LOCK_PUT(lock); } +EXPORT_SYMBOL(ldlm_lock_decref); /* This will drop a lock reference and mark it for destruction, but will not * necessarily cancel the lock before returning. */ @@ -842,6 +859,7 @@ void ldlm_lock_decref_and_cancel(struct lustre_handle *lockh, __u32 mode) ldlm_lock_decref_internal(lock, mode); LDLM_LOCK_PUT(lock); } +EXPORT_SYMBOL(ldlm_lock_decref_and_cancel); struct sl_insert_point { cfs_list_t *res_link; @@ -1114,6 +1132,7 @@ void ldlm_lock_allow_match_locked(struct ldlm_lock *lock) lock->l_flags |= LDLM_FL_LVB_READY; cfs_waitq_broadcast(&lock->l_waitq); } +EXPORT_SYMBOL(ldlm_lock_allow_match_locked); void ldlm_lock_allow_match(struct ldlm_lock *lock) { @@ -1121,6 +1140,7 @@ void ldlm_lock_allow_match(struct ldlm_lock *lock) ldlm_lock_allow_match_locked(lock); unlock_res_and_lock(lock); } +EXPORT_SYMBOL(ldlm_lock_allow_match); /* Can be called in two ways: * @@ -1267,6 +1287,7 @@ ldlm_mode_t ldlm_lock_match(struct ldlm_namespace *ns, int flags, return rc ? mode : 0; } +EXPORT_SYMBOL(ldlm_lock_match); ldlm_mode_t ldlm_revalidate_lock_handle(struct lustre_handle *lockh, __u64 *bits) @@ -1618,6 +1639,38 @@ ldlm_work_revoke_ast_lock(struct ptlrpc_request_set *rqset, void *opaq) RETURN(rc); } +int ldlm_work_gl_ast_lock(struct ptlrpc_request_set *rqset, void *opaq) +{ + struct ldlm_cb_set_arg *arg = opaq; + struct ldlm_glimpse_work *gl_work; + struct ldlm_lock *lock; + int rc = 0; + ENTRY; + + if (cfs_list_empty(arg->list)) + RETURN(-ENOENT); + + gl_work = cfs_list_entry(arg->list->next, struct ldlm_glimpse_work, + gl_list); + cfs_list_del_init(&gl_work->gl_list); + + lock = gl_work->gl_lock; + + /* transfer the glimpse descriptor to ldlm_cb_set_arg */ + arg->gl_desc = gl_work->gl_desc; + + /* invoke the actual glimpse callback */ + if (lock->l_glimpse_ast(lock, (void*)arg) == 0) + rc = 1; + + LDLM_LOCK_RELEASE(lock); + + if ((gl_work->gl_flags & LDLM_GL_WORK_NOFREE) == 0) + OBD_FREE_PTR(gl_work); + + RETURN(rc); +} + int ldlm_run_ast_work(struct ldlm_namespace *ns, cfs_list_t *rpc_list, ldlm_desc_ast_t ast_type) { @@ -1648,6 +1701,10 @@ int ldlm_run_ast_work(struct ldlm_namespace *ns, cfs_list_t *rpc_list, arg->type = LDLM_BL_CALLBACK; work_ast_lock = ldlm_work_revoke_ast_lock; break; + case LDLM_WORK_GL_AST: + arg->type = LDLM_GL_CALLBACK; + work_ast_lock = ldlm_work_gl_ast_lock; + break; default: LBUG(); } @@ -1698,6 +1755,7 @@ void ldlm_reprocess_all_ns(struct ldlm_namespace *ns) } EXIT; } +EXPORT_SYMBOL(ldlm_reprocess_all_ns); void ldlm_reprocess_all(struct ldlm_resource *res) { @@ -1806,6 +1864,7 @@ void ldlm_lock_cancel(struct ldlm_lock *lock) EXIT; } +EXPORT_SYMBOL(ldlm_lock_cancel); int ldlm_lock_set_data(struct lustre_handle *lockh, void *data) { @@ -1902,6 +1961,7 @@ void ldlm_lock_downgrade(struct ldlm_lock *lock, int new_mode) EXIT; } +EXPORT_SYMBOL(ldlm_lock_downgrade); struct ldlm_resource *ldlm_lock_convert(struct ldlm_lock *lock, int new_mode, __u32 *flags) @@ -2021,6 +2081,7 @@ struct ldlm_resource *ldlm_lock_convert(struct ldlm_lock *lock, int new_mode, OBD_SLAB_FREE(node, ldlm_interval_slab, sizeof(*node)); RETURN(res); } +EXPORT_SYMBOL(ldlm_lock_convert); void ldlm_lock_dump_handle(int level, struct lustre_handle *lockh) { @@ -2037,6 +2098,7 @@ void ldlm_lock_dump_handle(int level, struct lustre_handle *lockh) LDLM_LOCK_PUT(lock); } +EXPORT_SYMBOL(ldlm_lock_dump_handle); void _ldlm_lock_debug(struct ldlm_lock *lock, struct libcfs_debug_msg_data *msgdata,