+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 rc = 0, size = sizeof(*body);
+ ENTRY;
+
+ LASSERT(lock != NULL);
+
+ req = ptlrpc_prep_req(lock->l_export->exp_imp_reverse,
+ LDLM_GL_CALLBACK, 1, &size, NULL);
+ if (req == NULL)
+ RETURN(-ENOMEM);
+
+ body = lustre_msg_buf(req->rq_reqmsg, 0, sizeof(*body));
+ memcpy(&body->lock_handle1, &lock->l_remote_handle,
+ sizeof(body->lock_handle1));
+ ldlm_lock2desc(lock, &body->lock_desc);
+
+ size = lock->l_resource->lr_lvb_len;
+ req->rq_replen = lustre_msg_size(1, &size);
+
+ req->rq_send_state = LUSTRE_IMP_FULL;
+ req->rq_timeout = 2; /* 2 second timeout for initial AST reply */
+
+ rc = ptlrpc_queue_wait(req);
+ if (rc == -ETIMEDOUT || rc == -EINTR || rc == -ENOTCONN) {
+ ldlm_del_waiting_lock(lock);
+ ldlm_failed_ast(lock, rc, "glimpse");
+ } else if (rc == -EINVAL) {
+ LDLM_DEBUG(lock, "lost the race -- client no longer has this "
+ "lock");
+ } else if (rc == -ELDLM_NO_LOCK_DATA) {
+ LDLM_DEBUG(lock, "lost a race -- client has a lock, but no "
+ "inode");
+ } else if (rc) {
+ LDLM_ERROR(lock, "client sent rc %d rq_status %d from "
+ "glimpse AST", rc, req->rq_status);
+ } else {
+ rc = res->lr_namespace->ns_lvbo->lvbo_update
+ (res, req->rq_repmsg, 0, 1);
+ }
+ ptlrpc_req_finished(req);
+ RETURN(rc);
+}
+