#endif
#include <linux/lprocfs_status.h>
-
-int mea_name2idx(struct mea *mea, char *name, int namelen)
+static int mea_last_char_hash(int count, char *name, int namelen)
{
unsigned int c;
+
+ c = name[namelen - 1];
+ if (c == 0)
+ CWARN("looks like wrong len is passed\n");
+ c = c % count;
+ return c;
+}
- /* just to simplify caller code */
- if (mea == NULL)
- return 0;
-
- if (mea->mea_count == 0)
- return 0;
+static int mea_all_chars_hash(int count, char *name, int namelen)
+{
+ unsigned int c = 0;
- /* FIXME: real hash calculation here */
- c = name[namelen - 1];
- c = c % mea->mea_count;
-
- LASSERT(c < mea->mea_count);
+ while (--namelen >= 0)
+ c += name[namelen];
+ c = c % count;
return c;
}
-int raw_name2idx(int count, const char *name, int namelen)
+int raw_name2idx(int hashtype, int count, const char *name, int namelen)
{
- unsigned int c;
+ unsigned int c = 0;
LASSERT(namelen > 0);
if (count <= 1)
return 0;
-
- /* FIXME: real hash calculation here */
- c = name[namelen - 1];
- c = c % count;
+ switch (hashtype) {
+ case MEA_MAGIC_LAST_CHAR:
+ c = mea_last_char_hash(count, (char *) name, namelen);
+ break;
+ case MEA_MAGIC_ALL_CHARS:
+ c = mea_all_chars_hash(count, (char *) name, namelen);
+ break;
+ default:
+ CERROR("unknown hash type 0x%x\n", hashtype);
+ }
return c;
}
+int mea_name2idx(struct mea *mea, char *name, int namelen)
+{
+ unsigned int c;
+
+ LASSERT(mea && mea->mea_count);
+
+ c = raw_name2idx(mea->mea_magic, mea->mea_count, name, namelen);
+
+ LASSERT(c < mea->mea_count);
+ return c;
+}
+