+int ldlm_server_glimpse_ast(struct ldlm_lock *lock, void *data)
+{
+ struct ldlm_resource *res = lock->l_resource;
+ struct ldlm_request *body;
+ struct ptlrpc_request *req;
+ int size[] = { [MSG_PTLRPC_BODY_OFF] = sizeof(struct ptlrpc_body),
+ [DLM_LOCKREQ_OFF] = sizeof(*body) };
+ int rc = 0;
+ ENTRY;
+
+ LASSERT(lock != NULL);
+
+ req = ptlrpc_prep_req(lock->l_export->exp_imp_reverse,
+ LUSTRE_DLM_VERSION, LDLM_GL_CALLBACK, 2, size,
+ NULL);
+ if (req == NULL)
+ RETURN(-ENOMEM);
+
+ body = lustre_msg_buf(req->rq_reqmsg, DLM_LOCKREQ_OFF, sizeof(*body));
+ body->lock_handle[0] = lock->l_remote_handle;
+ ldlm_lock2desc(lock, &body->lock_desc);
+
+ lock_res_and_lock(lock);
+ size[REPLY_REC_OFF] = lock->l_resource->lr_lvb_len;
+ unlock_res_and_lock(lock);
+ res = lock->l_resource;
+ ptlrpc_req_set_repsize(req, 2, size);
+
+ req->rq_send_state = LUSTRE_IMP_FULL;
+ req->rq_timeout = ldlm_get_rq_timeout(ldlm_timeout, obd_timeout);
+
+ if (lock->l_export && lock->l_export->exp_ldlm_stats)
+ lprocfs_counter_incr(lock->l_export->exp_ldlm_stats,
+ LDLM_GL_CALLBACK - LDLM_FIRST_OPC);
+
+ rc = ptlrpc_queue_wait(req);
+ if (rc == -ELDLM_NO_LOCK_DATA)
+ LDLM_DEBUG(lock, "lost race - client has a lock but no inode");
+ else if (rc != 0)
+ rc = ldlm_handle_ast_error(lock, req, rc, "glimpse");
+ else
+ rc = ldlm_res_lvbo_update(res, req->rq_repmsg,
+ REPLY_REC_OFF, 1);
+ ptlrpc_req_finished(req);
+ RETURN(rc);
+}
+
+static struct ldlm_lock *
+find_existing_lock(struct obd_export *exp,
+ const struct lustre_handle *remote_hdl)
+{
+ struct list_head *iter;
+
+ spin_lock(&exp->exp_ldlm_data.led_lock);
+ list_for_each(iter, &exp->exp_ldlm_data.led_held_locks) {
+ struct ldlm_lock *lock;
+ lock = list_entry(iter, struct ldlm_lock, l_export_chain);
+ if (lock->l_remote_handle.cookie == remote_hdl->cookie) {
+ LDLM_LOCK_GET(lock);
+ spin_unlock(&exp->exp_ldlm_data.led_lock);
+ return lock;
+ }
+ }
+ spin_unlock(&exp->exp_ldlm_data.led_lock);
+ return NULL;
+}
+
+#ifdef __KERNEL__
+extern unsigned long long lu_time_stamp_get(void);
+#else
+#define lu_time_stamp_get() time(NULL)
+#endif
+
+/*
+ * Main server-side entry point into LDLM. This is called by ptlrpc service
+ * threads to carry out client lock enqueueing requests.
+ */
+int ldlm_handle_enqueue0(struct ldlm_namespace *ns,
+ struct ptlrpc_request *req,
+ const struct ldlm_request *dlm_req,
+ const struct ldlm_callback_suite *cbs)