Whamcloud - gitweb
b=24055 a patch to detect if quota is turned on properly
[fs/lustre-release.git] / lustre / quota / lproc_quota.c
index 6f0114a..828a7c1 100644 (file)
@@ -26,7 +26,7 @@
  * GPL HEADER END
  */
 /*
- * Copyright  2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  */
 /*
@@ -215,6 +215,7 @@ int generic_quota_on(struct obd_device *obd, struct obd_quotactl *oqctl, int glo
         int id, is_master, rc = 0, local; /* means we need a local quotaon */
 
         cfs_down(&obt->obt_quotachecking);
+        push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
         id = UGQUOTA2LQC(oqctl->qc_type);
         local = (obt->obt_qctxt.lqc_flags & id) != id;
 
@@ -223,12 +224,10 @@ int generic_quota_on(struct obd_device *obd, struct obd_quotactl *oqctl, int glo
 
         is_master = !strcmp(obd->obd_type->typ_name, LUSTRE_MDS_NAME);
         if (is_master) {
-                cfs_down(&obd->u.mds.mds_qonoff_sem);
+                cfs_down_write(&obd->u.mds.mds_qonoff_sem);
                 if (local) {
-                        push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
                         /* turn on cluster wide quota */
                         rc = mds_admin_quota_on(obd, oqctl);
-                        pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
                         if (rc && rc != -ENOENT)
                                 CERROR("%s: %s admin quotaon failed. rc=%d\n",
                                        obd->obd_name, global ? "global":"local",
@@ -238,7 +237,6 @@ int generic_quota_on(struct obd_device *obd, struct obd_quotactl *oqctl, int glo
 
         if (rc == 0) {
                 if (local) {
-                        push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
                         rc = fsfilt_quotactl(obd, obt->obt_sb, oqctl);
                         if (rc) {
                                 if (rc != -ENOENT)
@@ -249,18 +247,23 @@ int generic_quota_on(struct obd_device *obd, struct obd_quotactl *oqctl, int glo
                                 obt->obt_qctxt.lqc_flags |= UGQUOTA2LQC(oqctl->qc_type);
                                 build_lqs(obd);
                         }
-                        pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
                 }
 
                 if (rc == 0 && global && is_master)
-                        rc = obd_quotactl(obd->u.mds.mds_osc_exp, oqctl);
+                        rc = obd_quotactl(obd->u.mds.mds_lov_exp, oqctl);
         }
 
         if (is_master)
-                cfs_up(&obd->u.mds.mds_qonoff_sem);
+                cfs_up_write(&obd->u.mds.mds_qonoff_sem);
 
+        pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
         cfs_up(&obt->obt_quotachecking);
 
+        CDEBUG(D_QUOTA, "%s: quotaon type:master:global:local:flags:rc "
+               "%u:%d:%d:%d:%lu:%d\n",
+               obd->obd_name, oqctl->qc_type, is_master, global, local,
+               obt->obt_qctxt.lqc_flags, rc);
+
         return rc;
 }