int mds_quota_ctl(struct obd_device *obd, struct obd_export *unused,
struct obd_quotactl *oqctl)
{
+ struct obd_device_target *obt = &obd->u.obt;
struct lustre_quota_ctxt *qctxt = &obd->u.obt.obt_qctxt;
struct timeval work_start;
struct timeval work_end;
do_gettimeofday(&work_start);
switch (oqctl->qc_cmd) {
case Q_QUOTAON:
+ oqctl->qc_id = obt->obt_qfmt; /* override qfmt version */
rc = mds_quota_on(obd, oqctl);
break;
case Q_QUOTAOFF:
+ oqctl->qc_id = obt->obt_qfmt; /* override qfmt version */
rc = mds_quota_off(obd, oqctl);
break;
case Q_SETINFO:
rc = mds_quota_invalidate(obd, oqctl);
break;
case LUSTRE_Q_FINVALIDATE:
+ oqctl->qc_id = obt->obt_qfmt; /* override qfmt version */
rc = mds_quota_finvalidate(obd, oqctl);
break;
default:
down(&mds->mds_qonoff_sem);
oqctl->qc_cmd = Q_FINVALIDATE;
- oqctl->qc_id = obd->u.obt.obt_qfmt;
rc = fsfilt_quotactl(obd, obd->u.obt.obt_sb, oqctl);
if (!rc)
rc = obd_quotactl(mds->mds_osc_exp, oqctl);
push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
rc = mds_admin_quota_on(obd, oqctl);
if (rc)
- goto out;
-
- rc = obd_quotactl(mds->mds_osc_exp, oqctl);
- if (rc)
- goto out;
+ GOTO(out, rc);
rc = fsfilt_quotactl(obd, obd->u.obt.obt_sb, oqctl);
if (!rc)
obt->obt_qctxt.lqc_flags |= UGQUOTA2LQC(oqctl->qc_type);
+ else
+ GOTO(out, rc);
+
+ rc = obd_quotactl(mds->mds_osc_exp, oqctl);
+
out:
pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
up(&mds->mds_qonoff_sem);