Whamcloud - gitweb
LU-9679 mdt: use OBD_ALLOC_PTR_ARRAY() and FREE
[fs/lustre-release.git] / lustre / quota / lquota_entry.c
index 73c3d05..ae495d8 100644 (file)
@@ -20,7 +20,7 @@
  * GPL HEADER END
  */
 /*
- * Copyright (c) 2012, Intel Corporation.
+ * Copyright (c) 2012, 2015, Intel Corporation.
  * Use is subject to license terms.
  *
  * Author: Johann Lombardi <johann.lombardi@intel.com>
@@ -35,8 +35,8 @@
 #include "lquota_internal.h"
 
 static int hash_lqs_cur_bits = HASH_LQE_CUR_BITS;
-CFS_MODULE_PARM(hash_lqs_cur_bits, "i", int, 0444,
-                "the current bits of lqe hash");
+module_param(hash_lqs_cur_bits, int, 0444);
+MODULE_PARM_DESC(hash_lqs_cur_bits, "the current bits of lqe hash");
 
 static unsigned
 lqe64_hash_hash(struct cfs_hash *hs, const void *key, unsigned mask)
@@ -100,12 +100,15 @@ void lquota_lqe_debug0(struct lquota_entry *lqe,
                       const char *fmt, ...)
 {
        struct lquota_site *site = lqe->lqe_site;
+       struct va_format vaf;
        va_list args;
 
        LASSERT(site->lqs_ops->lqe_debug != NULL);
 
        va_start(args, fmt);
-       site->lqs_ops->lqe_debug(lqe, site->lqs_parent, msgdata, fmt, args);
+       vaf.fmt = fmt;
+       vaf.va = &args;
+       site->lqs_ops->lqe_debug(lqe, site->lqs_parent, msgdata, &vaf);
        va_end(args);
 }
 
@@ -173,8 +176,7 @@ retry:
                        "freed:%lu, repeat:%u\n", hash,
                        d.lid_inuse, d.lid_freed, repeat);
                repeat++;
-               set_current_state(TASK_INTERRUPTIBLE);
-               schedule_timeout(cfs_time_seconds(1));
+               schedule_timeout_interruptible(cfs_time_seconds(1));
                goto retry;
        }
        EXIT;
@@ -203,7 +205,8 @@ struct lquota_site *lquota_site_alloc(const struct lu_env *env, void *parent,
        char                     hashname[15];
        ENTRY;
 
-       LASSERT(qtype < MAXQUOTAS);
+       if (qtype >= LL_MAXQUOTAS)
+               RETURN(ERR_PTR(-ENOTSUPP));
 
        OBD_ALLOC_PTR(site);
        if (site == NULL)
@@ -224,7 +227,11 @@ struct lquota_site *lquota_site_alloc(const struct lu_env *env, void *parent,
                                            HASH_LQE_BKT_BITS),
                                        0, CFS_HASH_MIN_THETA,
                                        CFS_HASH_MAX_THETA, &lqe64_hash_ops,
-                                       CFS_HASH_DEFAULT|CFS_HASH_BIGNAME);
+                                       CFS_HASH_RW_SEM_BKTLOCK |
+                                       CFS_HASH_COUNTER |
+                                       CFS_HASH_REHASH |
+                                       CFS_HASH_BIGNAME);
+
        if (site->lqs_hash == NULL) {
                OBD_FREE_PTR(site);
                RETURN(ERR_PTR(-ENOMEM));
@@ -278,8 +285,10 @@ static void lqe_init(struct lquota_entry *lqe)
  *
  * \param env - the environment passed by the caller
  * \param lqe - is the quota entry to refresh
+ * \param find - don't create entry on disk if true
  */
-static int lqe_read(const struct lu_env *env, struct lquota_entry *lqe)
+static int lqe_read(const struct lu_env *env,
+                   struct lquota_entry *lqe, bool find)
 {
        struct lquota_site      *site;
        int                      rc;
@@ -292,7 +301,7 @@ static int lqe_read(const struct lu_env *env, struct lquota_entry *lqe)
 
        LQUOTA_DEBUG(lqe, "read");
 
-       rc = site->lqs_ops->lqe_read(env, lqe, site->lqs_parent);
+       rc = site->lqs_ops->lqe_read(env, lqe, site->lqs_parent, find);
        if (rc == 0)
                /* mark the entry as up-to-date */
                lqe->lqe_uptodate = true;
@@ -306,12 +315,15 @@ static int lqe_read(const struct lu_env *env, struct lquota_entry *lqe)
  * \param env  - the environment passed by the caller
  * \param site - lquota site which stores quota entries in a hash table
  * \param qid  - is the quota ID to be found/created
+ * \param find - don't create lqe on disk in case of ENOENT if true
  *
  * \retval 0     - success
  * \retval -ve   - failure
  */
-struct lquota_entry *lqe_locate(const struct lu_env *env,
-                               struct lquota_site *site, union lquota_id *qid)
+struct lquota_entry *lqe_locate_find(const struct lu_env *env,
+                                    struct lquota_site *site,
+                                    union lquota_id *qid,
+                                    bool find)
 {
        struct lquota_entry     *lqe, *new = NULL;
        int                      rc = 0;
@@ -325,7 +337,7 @@ struct lquota_entry *lqe_locate(const struct lu_env *env,
 
        OBD_SLAB_ALLOC_PTR_GFP(new, lqe_kmem, GFP_NOFS);
        if (new == NULL) {
-               CERROR("Fail to allocate lqe for id:"LPU64", "
+               CERROR("Fail to allocate lqe for id:%llu, "
                        "hash:%s\n", qid->qid_uid, site->lqs_hash->hs_name);
                RETURN(ERR_PTR(-ENOMEM));
        }
@@ -343,7 +355,7 @@ struct lquota_entry *lqe_locate(const struct lu_env *env,
        lqe_init(new);
 
        /* read quota settings from disk and mark lqe as up-to-date */
-       rc = lqe_read(env, new);
+       rc = lqe_read(env, new, find);
        if (rc)
                GOTO(out, lqe = ERR_PTR(rc));