From: ericm Date: Mon, 11 May 2009 19:04:23 +0000 (+0000) Subject: branch: HEAD X-Git-Tag: v1_9_181~3 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=7f240c333a9e47104e42c0ac28b3bbd025221423;p=fs%2Flustre-release.git branch: HEAD Hold relevant obd's refcount during quota recovery. b=19450 a=fanyong r=ericm r=tianzy --- diff --git a/lustre/quota/quota_context.c b/lustre/quota/quota_context.c index 258b809..1a23830 100644 --- a/lustre/quota/quota_context.c +++ b/lustre/quota/quota_context.c @@ -1252,10 +1252,15 @@ static int qslave_recovery_main(void *arg) 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++) { @@ -1316,6 +1321,7 @@ free: } } + class_decref(obd, "qslave_recovd_filter", obd); qctxt->lqc_recovery = 0; RETURN(rc); } diff --git a/lustre/quota/quota_ctl.c b/lustre/quota/quota_ctl.c index 8a3d2e8..2ebc692 100644 --- a/lustre/quota/quota_ctl.c +++ b/lustre/quota/quota_ctl.c @@ -337,6 +337,7 @@ int lov_quota_ctl(struct obd_device *unused, struct obd_export *exp, { 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; @@ -352,11 +353,13 @@ int lov_quota_ctl(struct obd_device *unused, struct obd_export *exp, 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; @@ -366,9 +369,9 @@ int lov_quota_ctl(struct obd_device *unused, struct obd_export *exp, 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; } diff --git a/lustre/quota/quota_master.c b/lustre/quota/quota_master.c index d7873da..37e6ad6 100644 --- a/lustre/quota/quota_master.c +++ b/lustre/quota/quota_master.c @@ -1561,7 +1561,11 @@ static int qmaster_recovery_main(void *arg) 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++) { @@ -1594,7 +1598,8 @@ free: 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); } @@ -1605,7 +1610,7 @@ int mds_quota_recovery(struct obd_device *obd) 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);