struct obd_uuid *uuid;
struct lquota_lvb *lvb;
struct ldlm_resource *res = (*lockp)->l_resource;
+ struct ldlm_reply *ldlm_rep;
int rc, lvb_len;
ENTRY;
if (repbody == NULL)
RETURN(err_serious(-EFAULT));
+ ldlm_rep = req_capsule_server_get(&req->rq_pill, &RMF_DLM_REP);
+ if (ldlm_rep == NULL)
+ RETURN(err_serious(-EFAULT));
+
uuid = &(*lockp)->l_export->exp_client_uuid;
switch (it->opc) {
default:
CERROR("%s: invalid intent opcode: %llu\n", qmt->qmt_svname,
it->opc);
- GOTO(out, rc = err_serious(-EINVAL));
+ GOTO(out, rc = -EINVAL);
}
/* on success, pack lvb in reply */
GOTO(out, rc = lvb_len);
req_capsule_shrink(&req->rq_pill, &RMF_DLM_LVB, lvb_len, RCL_SERVER);
- EXIT;
out:
- return rc;
+ ldlm_rep->lock_policy_res2 = clear_serious(rc);
+ EXIT;
+ return ELDLM_OK;
}
/*
struct lustre_handle *lockh;
struct quota_body *rep_qbody = NULL, *req_qbody;
struct qsd_async_args *aa = (struct qsd_async_args *)arg;
+ struct ldlm_reply *lockrep;
__u64 flags = LDLM_FL_HAS_INTENT;
ENTRY;
rc = ldlm_cli_enqueue_fini(aa->aa_exp, req, LDLM_PLAIN, 0, LCK_CR,
&flags, (void *)aa->aa_lvb,
sizeof(struct lquota_lvb), lockh, rc);
- if (rc < 0)
+ if (rc < 0) {
/* the lock has been destroyed, forget about the lock handle */
memset(lockh, 0, sizeof(*lockh));
+ /*
+ * To avoid the server being fullfilled by LDLM locks, server
+ * may reject the locking request by returning -EINPROGRESS,
+ * this is different from the -EINPROGRESS returned by quota
+ * code.
+ */
+ if (rc == -EINPROGRESS)
+ rc = -EAGAIN;
+ GOTO(out, rc);
+ }
+
+ lockrep = req_capsule_server_get(&req->rq_pill, &RMF_DLM_REP);
+ LASSERT(lockrep != NULL);
+ rc = ptlrpc_status_ntoh(lockrep->lock_policy_res2);
if (rc == 0 || rc == -EDQUOT || rc == -EINPROGRESS)
rep_qbody = req_capsule_server_get(&req->rq_pill,
&RMF_QUOTA_BODY);
-
+out:
aa->aa_completion(env, aa->aa_qqi, req_qbody, rep_qbody, lockh,
aa->aa_lvb, aa->aa_arg, rc);
RETURN(rc);