Hold relevant obd's refcount during quota recovery.
b=19450
a=fanyong
r=ericm
r=tianzy
ptlrpc_daemonize("qslave_recovd");
+ /* for obdfilter */
+ class_incref(obd, "qslave_recovd_filter", obd);
+
complete(&data->comp);
- if (qctxt->lqc_recovery)
+ if (qctxt->lqc_recovery) {
+ class_decref(obd, "qslave_recovd_filter", obd);
RETURN(0);
+ }
qctxt->lqc_recovery = 1;
for (type = USRQUOTA; type < MAXQUOTAS; type++) {
}
}
+ class_decref(obd, "qslave_recovd_filter", obd);
qctxt->lqc_recovery = 0;
RETURN(rc);
}
{
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;
RETURN(-EFAULT);
}
+ /* for lov tgt */
obd_getref(obd);
for (i = 0; i < lov->desc.ld_tgt_count; i++) {
int err;
- if (!lov->lov_tgts[i] || !lov->lov_tgts[i]->ltd_active) {
+ tgt = lov->lov_tgts[i];
+ if (!tgt || !tgt->ltd_active || tgt->ltd_reap) {
if (oqctl->qc_cmd == Q_GETOQUOTA) {
CERROR("ost %d is inactive\n", i);
rc = -EIO;
continue;
}
- err = obd_quotactl(lov->lov_tgts[i]->ltd_exp, oqctl);
+ err = obd_quotactl(tgt->ltd_exp, oqctl);
if (err) {
- if (lov->lov_tgts[i]->ltd_active && !rc)
+ if (tgt->ltd_active && !rc)
rc = err;
continue;
}
ptlrpc_daemonize("qmaster_recovd");
- class_incref(obd, "qmaster_recovd", obd);
+ /* for mds */
+ class_incref(obd, "qmaster_recovd_mds", obd);
+ /* for lov */
+ class_incref(mds->mds_osc_obd, "qmaster_recovd_lov", mds->mds_osc_obd);
+
complete(&data->comp);
for (type = USRQUOTA; type < MAXQUOTAS; type++) {
kfree(dqid);
}
}
- class_decref(obd, "qmaster_recovd", obd);
+ class_decref(mds->mds_osc_obd, "qmaster_recovd_lov", mds->mds_osc_obd);
+ class_decref(obd, "qmaster_recovd_mds", obd);
RETURN(rc);
}
int rc = 0;
ENTRY;
- if (unlikely(!mds->mds_quota))
+ if (unlikely(!mds->mds_quota || obd->obd_stopping))
RETURN(rc);
mutex_down(&obd->obd_dev_sem);