oprofile 0.9.6

Copy in the rest of the oprofile 0.9.6 tree so we have a source
copy to match the prebuilt binaries that are checked into
external/.

Change-Id: Iaac327571d5d583594a4194973bf256569061048
diff --git a/module/op_dcache.h b/module/op_dcache.h
new file mode 100644
index 0000000..26560e1
--- /dev/null
+++ b/module/op_dcache.h
@@ -0,0 +1,87 @@
+/**
+ * @file op_dcache.h
+ * Compatibility functions for dcache lookups
+ *
+ * @remark Copyright 2002 OProfile authors
+ * @remark Read the file COPYING
+ *
+ * @author Philippe Elie
+ * @author John Levon
+ */
+
+#ifndef OP_DCACHE_H
+#define OP_DCACHE_H
+
+#include <linux/sched.h>
+#include <linux/unistd.h>
+#include <linux/mman.h>
+#include <linux/file.h>
+
+#include "oprofile.h"
+
+extern uint op_dname_top;
+extern struct qstr **op_dname_stack;
+extern char * op_pool_pos;
+extern char * op_pool_start;
+extern char * op_pool_end;
+
+uint do_hash(struct dentry * dentry, struct vfsmount * vfsmnt, struct dentry * root, struct vfsmount * rootmnt);
+
+inline static uint alloc_in_pool(char const * str, uint len);
+inline static int add_hash_entry(struct op_hash_index * entry, uint parent, char const * name, uint len);
+inline static uint name_hash(char const * name, uint len, uint parent);
+
+inline static uint name_hash(char const * name, uint len, uint parent)
+{
+	uint hash=0;
+
+	while (len--)
+		hash = (hash + (name[len] << 4) + (name[len] >> 4)) * 11;
+
+	return (hash ^ parent) % OP_HASH_MAP_NR;
+}
+
+/* empty ascending dname stack */
+inline static void push_dname(struct qstr * dname)
+{
+	op_dname_stack[op_dname_top] = dname;
+	if (op_dname_top != DNAME_STACK_MAX)
+		op_dname_top++;
+	else
+		printk(KERN_ERR "oprofile: overflowed dname stack !\n");
+}
+
+inline static struct qstr * pop_dname(void)
+{
+	if (op_dname_top == 0)
+		return NULL;
+
+	return op_dname_stack[--op_dname_top];
+}
+
+inline static uint alloc_in_pool(char const * str, uint len)
+{
+	char * place = op_pool_pos;
+	if (op_pool_pos + len + 1 >= op_pool_end)
+		return 0;
+
+	strcpy(place, str);
+	op_pool_pos += len + 1;
+	return place - op_pool_start;
+}
+
+inline static char * get_from_pool(uint index)
+{
+	return op_pool_start + index;
+}
+
+inline static int add_hash_entry(struct op_hash_index * entry, uint parent, char const * name, uint len)
+{
+	entry->name = alloc_in_pool(name, len);
+	if (!entry->name)
+		return -1;
+	entry->parent = parent;
+	return 0;
+}
+
+#endif /* OP_DCACHE_H */