Whamcloud - gitweb
LU-337 Fix alloc flags in alloc_qinfo()
[fs/lustre-release.git] / lustre / quota / quota_interface.c
index 168f6df..87c14cf 100644 (file)
@@ -26,7 +26,7 @@
  * GPL HEADER END
  */
 /*
- * Copyright  2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  */
 /*
@@ -655,7 +655,7 @@ static int mds_quota_setup(struct obd_device *obd)
         mds->mds_quota_info.qi_version = LUSTRE_QUOTA_V2;
         cfs_sema_init(&obt->obt_quotachecking, 1);
         /* initialize quota master and quota context */
-        cfs_sema_init(&mds->mds_qonoff_sem, 1);
+        cfs_init_rwsem(&mds->mds_qonoff_sem);
         rc = qctxt_init(obd, dqacq_handler);
         if (rc) {
                 CERROR("%s: initialize quota context failed! (rc:%d)\n",
@@ -704,9 +704,9 @@ static int mds_quota_fs_cleanup(struct obd_device *obd)
         memset(&oqctl, 0, sizeof(oqctl));
         oqctl.qc_type = UGQUOTA;
 
-        cfs_down(&mds->mds_qonoff_sem);
+        cfs_down_write(&mds->mds_qonoff_sem);
         mds_admin_quota_off(obd, &oqctl);
-        cfs_up(&mds->mds_qonoff_sem);
+        cfs_up_write(&mds->mds_qonoff_sem);
         RETURN(0);
 }
 
@@ -787,7 +787,7 @@ static struct osc_quota_info *alloc_qinfo(struct client_obd *cli,
         struct osc_quota_info *oqi;
         ENTRY;
 
-        OBD_SLAB_ALLOC(oqi, qinfo_cachep, CFS_ALLOC_STD, sizeof(*oqi));
+        OBD_SLAB_ALLOC(oqi, qinfo_cachep, CFS_ALLOC_IO, sizeof(*oqi));
         if(!oqi)
                 RETURN(NULL);
 
@@ -839,7 +839,7 @@ int osc_quota_setdq(struct client_obd *cli, const unsigned int qid[],
 
 
         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
-                struct osc_quota_info *oqi, *old;
+                struct osc_quota_info *oqi = NULL, *old;
 
                 if (!(valid & ((cnt == USRQUOTA) ?
                     OBD_MD_FLUSRQUOTA : OBD_MD_FLGRPQUOTA)))
@@ -849,12 +849,16 @@ int osc_quota_setdq(struct client_obd *cli, const unsigned int qid[],
                 noquota = (cnt == USRQUOTA) ?
                     (flags & OBD_FL_NO_USRQUOTA) : (flags & OBD_FL_NO_GRPQUOTA);
 
-                oqi = alloc_qinfo(cli, id, cnt);
-                if (!oqi) {
-                        rc = -ENOMEM;
-                        CDEBUG(D_QUOTA, "setdq for %s %d failed, (rc = %d)\n",
-                               cnt == USRQUOTA ? "user" : "group", id, rc);
-                        break;
+                if (noquota) {
+                        oqi = alloc_qinfo(cli, id, cnt);
+                        if (!oqi) {
+                                rc = -ENOMEM;
+                                CDEBUG(D_QUOTA, "setdq for %s %d failed, "
+                                       "(rc = %d)\n",
+                                       cnt == USRQUOTA ? "user" : "group",
+                                       id, rc);
+                                break;
+                        }
                 }
 
                 cfs_spin_lock(&qinfo_list_lock);
@@ -865,17 +869,19 @@ int osc_quota_setdq(struct client_obd *cli, const unsigned int qid[],
                         insert_qinfo_hash(oqi);
                 cfs_spin_unlock(&qinfo_list_lock);
 
-                if (old || !noquota)
-                        free_qinfo(oqi);
-                if (old && !noquota)
-                        free_qinfo(old);
-
                 if (old && !noquota)
                         CDEBUG(D_QUOTA, "setdq to remove for %s %d\n",
                                cnt == USRQUOTA ? "user" : "group", id);
                 else if (!old && noquota)
                         CDEBUG(D_QUOTA, "setdq to insert for %s %d\n",
                                cnt == USRQUOTA ? "user" : "group", id);
+
+                if (old) {
+                        if (noquota)
+                                free_qinfo(oqi);
+                        else
+                                free_qinfo(old);
+                }
         }
 
         RETURN(rc);