Whamcloud - gitweb
branch: HEAD
authorericm <ericm>
Mon, 11 May 2009 19:04:23 +0000 (19:04 +0000)
committerericm <ericm>
Mon, 11 May 2009 19:04:23 +0000 (19:04 +0000)
Hold relevant obd's refcount during quota recovery.
b=19450
a=fanyong
r=ericm
r=tianzy

lustre/quota/quota_context.c
lustre/quota/quota_ctl.c
lustre/quota/quota_master.c

index 258b809..1a23830 100644 (file)
@@ -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);
 }
index 8a3d2e8..2ebc692 100644 (file)
@@ -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;
                 }
index d7873da..37e6ad6 100644 (file)
@@ -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);