GOTO(out, rc);
}
- oqc = NULL;
- if (req->rq_repmsg)
+ if (req->rq_repmsg) {
oqc = lustre_swab_repbuf(req, REPLY_REC_OFF, sizeof(*oqc),
lustre_swab_obd_quotactl);
- if (oqc == NULL) {
- CERROR ("Can't unpack obd_quotactl\n");
- GOTO(out, rc = -EPROTO);
+ if (oqc != NULL) {
+ *oqctl = *oqc;
+ } else {
+ CERROR ("Can't unpack obd_quotactl\n");
+ rc = -EPROTO;
+ }
}
-
- *oqctl = *oqc;
EXIT;
out:
ptlrpc_req_finished(req);
{
struct obd_quotactl *soqc;
struct lvfs_run_ctxt saved;
- int rc, rc1;
+ __u64 curspace;
+ int rc;
ENTRY;
OBD_ALLOC_PTR(soqc);
soqc->qc_type = oqctl->qc_type;
rc = obd_quotactl(obd->u.mds.mds_lov_exp, soqc);
+ if (rc)
+ goto out;
- oqctl->qc_dqblk.dqb_curspace = soqc->qc_dqblk.dqb_curspace;
+ curspace = soqc->qc_dqblk.dqb_curspace;
push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
soqc->qc_dqblk.dqb_curspace = 0;
- rc1 = fsfilt_quotactl(obd, obd->u.obt.obt_sb, soqc);
+ rc = fsfilt_quotactl(obd, obd->u.obt.obt_sb, soqc);
pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
+ if (rc)
+ goto out;
- oqctl->qc_dqblk.dqb_curinodes += soqc->qc_dqblk.dqb_curinodes;
- if (!rc1)
- oqctl->qc_dqblk.dqb_valid |= QIF_INODES;
- oqctl->qc_dqblk.dqb_curspace += soqc->qc_dqblk.dqb_curspace;
- if (!rc && !rc1)
- oqctl->qc_dqblk.dqb_valid |= QIF_USAGE;
+ oqctl->qc_dqblk.dqb_curinodes = soqc->qc_dqblk.dqb_curinodes;
+ oqctl->qc_dqblk.dqb_valid |= QIF_INODES;
+ oqctl->qc_dqblk.dqb_curspace = curspace + soqc->qc_dqblk.dqb_curspace;
+ oqctl->qc_dqblk.dqb_valid |= QIF_USAGE;
+out:
OBD_FREE_PTR(soqc);
- if (!rc)
- rc = rc1;
RETURN(rc);
}
dqblk->dqb_btime = dquot->dq_dqb.dqb_btime;
dqblk->dqb_itime = dquot->dq_dqb.dqb_itime;
dqblk->dqb_valid |= QIF_LIMITS | QIF_TIMES;
+ /* mds_get_space will hopefully update stats to more accurate values */
+ dqblk->dqb_curinodes = dquot->dq_dqb.dqb_curinodes;
+ dqblk->dqb_curspace = dquot->dq_dqb.dqb_curspace;
up(&dquot->dq_sem);
lustre_dqput(dquot);
up(&mds->mds_qonoff_sem);
- /* the usages in admin quota file is inaccurate */
- dqblk->dqb_curinodes = 0;
- dqblk->dqb_curspace = 0;
- rc = mds_get_space(obd, oqctl);
+ /* if mds_get_space fails we still return rc=0, but the unset
+ * QIF_INODES and QIF_USAGE will signal that the data are inaccurate */
+ mds_get_space(obd, oqctl);
+
EXIT;
- return rc;
+ return 0;
out:
up(&mds->mds_qonoff_sem);
return rc;
.qc_type = UGQUOTA };
char *obd_type = (char *)qctl.obd_type;
char *obd_uuid = (char *)qctl.obd_uuid.uuid;
- int rc, rc1 = 0, rc2 = 0, rc3 = 0, verbose = 0;
+ int rc, rc1 = 0, rc2 = 0, rc3 = 0, verbose = 0, inacc;
int pass = 0;
char *endptr;
if (*obd_uuid)
mnt = "";
+ inacc = (qctl.qc_cmd == LUSTRE_Q_GETQUOTA) &&
+ ((qctl.qc_dqblk.dqb_valid & (QIF_LIMITS|QIF_USAGE)) != (QIF_LIMITS|QIF_USAGE));
+
print_quota(mnt, &qctl, GENERAL_QUOTA_INFO);
if (!*obd_uuid && qctl.qc_cmd != LUSTRE_Q_GETINFO && verbose) {
rc3 = print_lov_quota(mnt, &qctl);
}
- if (rc1 || rc2 || rc3)
+ if (rc1 || rc2 || rc3 || inacc)
printf("Some errors happened when getting quota info. "
"Some devices may be not working or deactivated. "
"The data in \"[]\" is inaccurate.\n");