- case IT_QUOTA_DQACQ:
- /* XXX: to be added in a next patch */
- GOTO(out, -EOPNOTSUPP);
+ case IT_QUOTA_DQACQ: {
+ struct lquota_entry *lqe;
+ struct ldlm_lock *lock;
+
+ if (res->lr_name.name[LUSTRE_RES_ID_QUOTA_SEQ_OFF] == 0)
+ /* acquire on global lock? something is wrong ... */
+ GOTO(out, rc = -EPROTO);
+
+ /* verify global lock isn't stale */
+ if (!lustre_handle_is_used(&reqbody->qb_glb_lockh))
+ GOTO(out, rc = -ENOLCK);
+
+ lock = ldlm_handle2lock(&reqbody->qb_glb_lockh);
+ if (lock == NULL)
+ GOTO(out, rc = -ENOLCK);
+ LDLM_LOCK_PUT(lock);
+
+ lqe = res->lr_lvb_data;
+ LASSERT(lqe != NULL);
+ lqe_getref(lqe);
+
+ /* acquire quota space */
+ rc = qmt_dqacq0(env, lqe, qmt, uuid, reqbody->qb_flags,
+ reqbody->qb_count, reqbody->qb_usage,
+ repbody);
+ lqe_putref(lqe);
+ if (rc)
+ GOTO(out, rc);