mdt_remote_object_lock_try() drops object
reference in case of an error but if the
request was sent to a server it is decreased
again via failed_lock_cleanup()
Add ldlm_created_callback. It is called after
lock creation, so we can safely add a reference
to l_ast_data and drop it only in BL AST handler.
Lustre-commit:
b2368774a01eb89981e2ceb92be9673e4b403d62
Lustre-change: https://review.whamcloud.com/34181
Cray-bug-id: LUS-7013
Signed-off-by: Lai Siyao <lai.siyao@whamcloud.com>
Signed-off-by: Andriy Skulysh <c17819@cray.com>
Reviewed-by: Alexandr Boyko <c17825@cray.com>
Reviewed-by: Vitaly Fertman <c17818@cray.com>
Reviewed-by: Mike Pershin <mpershin@whamcloud.com>
Reviewed-by: Lai Siyao <lai.siyao@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Change-Id: I49c946278f379390634642370d15c7fe89441d86
Reviewed-on: https://review.whamcloud.com/39976
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
/** 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) {