if (!(flags & (LDLM_FL_BLOCK_WAIT | LDLM_FL_BLOCK_GRANTED |
LDLM_FL_BLOCK_CONV))) {
- struct fs_db *fsdb = (struct fs_db *)lock->l_ast_data;
- struct lustre_handle lockh;
+ struct fs_db *fsdb;
- mgs_ir_notify_complete(fsdb);
+ /* l_ast_data is used as a marker to avoid cancel ldlm lock
+ * twice. See LU-1259. */
+ lock_res_and_lock(lock);
+ fsdb = (struct fs_db *)lock->l_ast_data;
+ lock->l_ast_data = NULL;
+ unlock_res_and_lock(lock);
- ldlm_lock2handle(lock, &lockh);
- ldlm_lock_decref_and_cancel(&lockh, LCK_EX);
+ if (fsdb != NULL) {
+ struct lustre_handle lockh;
+
+ mgs_ir_notify_complete(fsdb);
+
+ ldlm_lock2handle(lock, &lockh);
+ ldlm_lock_decref_and_cancel(&lockh, LCK_EX);
+ }
}
RETURN(ldlm_completion_ast(lock, flags, cbdata));