- imm = oqctl->qc_type & IMMQUOTA;
- oqctl->qc_type &= ~IMMQUOTA;
-
- if (oqctl->qc_type != USRQUOTA &&
- oqctl->qc_type != GRPQUOTA &&
- oqctl->qc_type != UGQUOTA)
- RETURN(-EINVAL);
-
- if (!atomic_dec_and_test(&obt->obt_quotachecking)) {
- CDEBUG(D_INFO, "other people are doing quotacheck\n");
- atomic_inc(&obt->obt_quotachecking);
- RETURN(-EBUSY);
- }
-
- down(&mds->mds_qonoff_sem);
- /* close admin quota files */
- push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- mds_admin_quota_off(obd, oqctl);
-
- rc = obd_quotactl(mds->mds_osc_exp, oqctl);
- rc2 = fsfilt_quotactl(obd, obd->u.obt.obt_sb, oqctl);
- if (!rc2) {
- if (imm)
- obt->obt_qctxt.lqc_immutable = 1;
- obt->obt_qctxt.lqc_flags &= ~UGQUOTA2LQC(oqctl->qc_type);
- }
- pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- up(&mds->mds_qonoff_sem);
- atomic_inc(&obt->obt_quotachecking);
-
- RETURN(rc ?: rc2);
+ cfs_down(&obt->obt_quotachecking);
+ rc = do_mds_quota_off(obd, oqctl);
+ cfs_up(&obt->obt_quotachecking);
+ RETURN(rc);