-#endif
-
-int client_quota_ctl(struct obd_device *unused, struct obd_export *exp,
- struct obd_quotactl *oqctl)
-{
- struct ptlrpc_request *req;
- struct obd_quotactl *oqc;
- const struct req_format *rf;
- int ver, opc, rc, resends = 0;
- ENTRY;
-
- if (!strcmp(exp->exp_obd->obd_type->typ_name, LUSTRE_MDC_NAME)) {
- rf = &RQF_MDS_QUOTACTL;
- ver = LUSTRE_MDS_VERSION,
- opc = MDS_QUOTACTL;
- } else if (!strcmp(exp->exp_obd->obd_type->typ_name, LUSTRE_OSC_NAME)) {
- rf = &RQF_OST_QUOTACTL;
- ver = LUSTRE_OST_VERSION,
- opc = OST_QUOTACTL;
- } else {
- RETURN(-EINVAL);
- }
-
-restart_request:
-
- req = ptlrpc_request_alloc_pack(class_exp2cliimp(exp), rf, ver, opc);
- if (req == NULL)
- RETURN(-ENOMEM);
-
- oqc = req_capsule_client_get(&req->rq_pill, &RMF_OBD_QUOTACTL);
- *oqc = *oqctl;
-
- ptlrpc_request_set_replen(req);
- ptlrpc_at_set_req_timeout(req);
- req->rq_no_resend = 1;
-
- rc = ptlrpc_queue_wait(req);
- if (rc) {
- CERROR("ptlrpc_queue_wait failed, rc: %d\n", rc);
- GOTO(out, rc);
- }
-
- oqc = NULL;
- if (req->rq_repmsg)
- oqc = req_capsule_server_get(&req->rq_pill, &RMF_OBD_QUOTACTL);
-
- if (oqc == NULL) {
- CERROR ("Can't unpack obd_quotactl\n");
- GOTO(out, rc = -EPROTO);
- }
-
- *oqctl = *oqc;
- EXIT;
-out:
- ptlrpc_req_finished(req);
-
- if (client_quota_recoverable_error(rc)) {
- resends++;
- if (!client_quota_should_resend(resends, &exp->exp_obd->u.cli)) {
- CERROR("too many resend retries, returning error\n");
- RETURN(-EIO);
- }
-
- goto restart_request;
- }
-
- return rc;
-}
-
-/**
- * For lmv, only need to send request to master MDT, and the master MDT will
- * process with other slave MDTs.
- */
-int lmv_quota_ctl(struct obd_device *unused, struct obd_export *exp,
- struct obd_quotactl *oqctl)
-{
- struct obd_device *obd = class_exp2obd(exp);
- struct lmv_obd *lmv = &obd->u.lmv;
- struct lmv_tgt_desc *tgt = &lmv->tgts[0];
- int rc;
- ENTRY;
-
- if (!lmv->desc.ld_tgt_count || !tgt->ltd_active) {
- CERROR("master lmv inactive\n");
- RETURN(-EIO);
- }
-
- rc = obd_quotactl(tgt->ltd_exp, oqctl);
- RETURN(rc);
-}
-
-int lov_quota_ctl(struct obd_device *unused, struct obd_export *exp,
- struct obd_quotactl *oqctl)
-{
- struct obd_device *obd = class_exp2obd(exp);
- struct lov_obd *lov = &obd->u.lov;
- struct lov_tgt_desc *tgt;
- __u64 curspace = 0;
- __u64 bhardlimit = 0;
- int i, rc = 0;
- ENTRY;
-
- if (oqctl->qc_cmd != LUSTRE_Q_QUOTAON &&
- oqctl->qc_cmd != LUSTRE_Q_QUOTAOFF &&
- oqctl->qc_cmd != Q_GETOQUOTA &&
- oqctl->qc_cmd != Q_INITQUOTA &&
- oqctl->qc_cmd != LUSTRE_Q_SETQUOTA &&
- oqctl->qc_cmd != Q_FINVALIDATE) {
- CERROR("bad quota opc %x for lov obd", oqctl->qc_cmd);
- RETURN(-EFAULT);
- }
-
- /* for lov tgt */
- obd_getref(obd);
- for (i = 0; i < lov->desc.ld_tgt_count; i++) {
- int err;
-
- tgt = lov->lov_tgts[i];
- if (!tgt || !tgt->ltd_active || tgt->ltd_reap) {
- if (oqctl->qc_cmd == Q_GETOQUOTA) {
- rc = -EREMOTEIO;
- CERROR("ost %d is inactive\n", i);
- } else {
- CDEBUG(D_HA, "ost %d is inactive\n", i);
- }
- continue;
- }
-
- err = obd_quotactl(tgt->ltd_exp, oqctl);
- if (err) {
- if (tgt->ltd_active && !rc)
- rc = err;
- continue;
- }
-
- if (oqctl->qc_cmd == Q_GETOQUOTA) {
- curspace += oqctl->qc_dqblk.dqb_curspace;
- bhardlimit += oqctl->qc_dqblk.dqb_bhardlimit;
- }
- }
- obd_putref(obd);
-
- if (oqctl->qc_cmd == Q_GETOQUOTA) {
- oqctl->qc_dqblk.dqb_curspace = curspace;
- oqctl->qc_dqblk.dqb_bhardlimit = bhardlimit;
- }
- RETURN(rc);
-}