/** Type for glimpse callback function of a lock. */
typedef int (*ldlm_glimpse_callback)(struct ldlm_lock *lock, void *data);
+/** Type for created callback function of a lock. */
+typedef void (*ldlm_created_callback)(struct ldlm_lock *lock);
+
/** Work list for sending GL ASTs to multiple locks. */
struct ldlm_glimpse_work {
struct ldlm_lock *gl_lock; /* lock to glimpse */
void *ei_cb_local_bl; /** blocking local lock callback */
void *ei_cb_cp; /** lock completion callback */
void *ei_cb_gl; /** lock glimpse callback */
+ ldlm_created_callback ei_cb_created; /** lock created callback */
void *ei_cbdata; /** Data to be passed into callbacks. */
void *ei_namespace; /** lock namespace **/
u64 ei_inodebits; /** lock inode bits **/
lvb_len, lvb_type);
if (IS_ERR(lock))
RETURN(PTR_ERR(lock));
+
+ if (einfo->ei_cb_created)
+ einfo->ei_cb_created(lock);
+
/* for the local lock, add the reference */
ldlm_lock_addref_internal(lock, einfo->ei_mode);
ldlm_lock2handle(lock, lockh);
return 1;
}
+static void mdt_remote_object_lock_created_cb(struct ldlm_lock *lock)
+{
+ mdt_object_get(NULL, lock->l_ast_data);
+}
+
int mdt_remote_object_lock_try(struct mdt_thread_info *mti,
struct mdt_object *o, const struct lu_fid *fid,
struct lustre_handle *lh, enum ldlm_mode mode,
* if we cache lock, couple lock with mdt_object, so that object
* can be easily found in lock ASTs.
*/
- mdt_object_get(mti->mti_env, o);
einfo->ei_cbdata = o;
+ einfo->ei_cb_created = mdt_remote_object_lock_created_cb;
}
memset(policy, 0, sizeof(*policy));
rc = mo_object_lock(mti->mti_env, mdt_object_child(o), lh, einfo,
policy);
- if (rc < 0 && cache)
- mdt_object_put(mti->mti_env, o);
/* Return successfully acquired bits to a caller */
if (rc == 0) {