* 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.
*/
/*
#include <lprocfs_status.h>
#include "quota_internal.h"
+static int hash_lqs_cur_bits = HASH_LQS_CUR_BITS;
+CFS_MODULE_PARM(hash_lqs_cur_bits, "i", int, 0444,
+ "the current bits of lqs hash");
+
#ifdef HAVE_QUOTA_SUPPORT
static cfs_hash_ops_t lqs_hash_ops;
cfs_spin_unlock(&qctxt->lqc_lock);
qctxt->lqc_lqs_hash = cfs_hash_create("LQS_HASH",
- HASH_LQS_CUR_BITS,
+ hash_lqs_cur_bits,
HASH_LQS_MAX_BITS,
- &lqs_hash_ops, CFS_HASH_REHASH);
+ min(hash_lqs_cur_bits,
+ HASH_LQS_BKT_BITS),
+ 0, CFS_HASH_MIN_THETA,
+ CFS_HASH_MAX_THETA,
+ &lqs_hash_ops, CFS_HASH_DEFAULT);
if (!qctxt->lqc_lqs_hash) {
CERROR("initialize hash lqs for %s error!\n", obd->obd_name);
RETURN(-ENOMEM);
}
-void hash_put_lqs(void *obj, void *data)
+int hash_put_lqs(cfs_hash_t *hs, cfs_hash_bd_t *bd,
+ cfs_hlist_node_t *hnode, void *data)
+
{
- lqs_putref((struct lustre_qunit_size *)obj);
+ lqs_putref((struct lustre_qunit_size *)cfs_hash_object(hs, hnode));
+ return 0;
}
void qctxt_cleanup(struct lustre_quota_ctxt *qctxt, int force)
cfs_hash_for_each_safe(qctxt->lqc_lqs_hash, hash_put_lqs, NULL);
l_wait_event(qctxt->lqc_lqs_waitq, check_lqs(qctxt), &lwi);
cfs_down_write(&obt->obt_rwsem);
- cfs_hash_destroy(qctxt->lqc_lqs_hash);
+ cfs_hash_putref(qctxt->lqc_lqs_hash);
qctxt->lqc_lqs_hash = NULL;
cfs_up_write(&obt->obt_rwsem);
}
static int
-lqs_compare(void *key, cfs_hlist_node_t *hnode)
+lqs_keycmp(void *key, cfs_hlist_node_t *hnode)
{
- struct lustre_qunit_size *q;
- int rc;
- ENTRY;
-
- LASSERT(key);
- q = cfs_hlist_entry(hnode, struct lustre_qunit_size, lqs_hash);
+ struct lustre_qunit_size *q =
+ cfs_hlist_entry(hnode, struct lustre_qunit_size, lqs_hash);
- cfs_spin_lock(&q->lqs_lock);
- rc = (q->lqs_key == *((unsigned long long *)key));
- cfs_spin_unlock(&q->lqs_lock);
+ RETURN(q->lqs_key == *((unsigned long long *)key));
+}
- RETURN(rc);
+static void *
+lqs_object(cfs_hlist_node_t *hnode)
+{
+ return cfs_hlist_entry(hnode, struct lustre_qunit_size, lqs_hash);
}
static void *
}
static void *
-lqs_put(cfs_hlist_node_t *hnode)
+lqs_put_locked(cfs_hlist_node_t *hnode)
{
struct lustre_qunit_size *q =
cfs_hlist_entry(hnode, struct lustre_qunit_size, lqs_hash);
}
static cfs_hash_ops_t lqs_hash_ops = {
- .hs_hash = lqs_hash,
- .hs_key = lqs_key,
- .hs_compare = lqs_compare,
- .hs_get = lqs_get,
- .hs_put = lqs_put,
- .hs_exit = lqs_exit
+ .hs_hash = lqs_hash,
+ .hs_key = lqs_key,
+ .hs_keycmp = lqs_keycmp,
+ .hs_object = lqs_object,
+ .hs_get = lqs_get,
+ .hs_put_locked = lqs_put_locked,
+ .hs_exit = lqs_exit
};
#endif /* HAVE_QUOTA_SUPPORT */