1 /**
2 * @file op_dcache.h
3 * Compatibility functions for dcache lookups
4 *
5 * @remark Copyright 2002 OProfile authors
6 * @remark Read the file COPYING
7 *
8 * @author Philippe Elie
9 * @author John Levon
10 */
11
12 #ifndef OP_DCACHE_H
13 #define OP_DCACHE_H
14
15 #include <linux/sched.h>
16 #include <linux/unistd.h>
17 #include <linux/mman.h>
18 #include <linux/file.h>
19
20 #include "oprofile.h"
21
22 extern uint op_dname_top;
23 extern struct qstr **op_dname_stack;
24 extern char * op_pool_pos;
25 extern char * op_pool_start;
26 extern char * op_pool_end;
27
28 uint do_hash(struct dentry * dentry, struct vfsmount * vfsmnt, struct dentry * root, struct vfsmount * rootmnt);
29
30 inline static uint alloc_in_pool(char const * str, uint len);
31 inline static int add_hash_entry(struct op_hash_index * entry, uint parent, char const * name, uint len);
32 inline static uint name_hash(char const * name, uint len, uint parent);
33
name_hash(char const * name,uint len,uint parent)34 inline static uint name_hash(char const * name, uint len, uint parent)
35 {
36 uint hash=0;
37
38 while (len--)
39 hash = (hash + (name[len] << 4) + (name[len] >> 4)) * 11;
40
41 return (hash ^ parent) % OP_HASH_MAP_NR;
42 }
43
44 /* empty ascending dname stack */
push_dname(struct qstr * dname)45 inline static void push_dname(struct qstr * dname)
46 {
47 op_dname_stack[op_dname_top] = dname;
48 if (op_dname_top != DNAME_STACK_MAX)
49 op_dname_top++;
50 else
51 printk(KERN_ERR "oprofile: overflowed dname stack !\n");
52 }
53
pop_dname(void)54 inline static struct qstr * pop_dname(void)
55 {
56 if (op_dname_top == 0)
57 return NULL;
58
59 return op_dname_stack[--op_dname_top];
60 }
61
alloc_in_pool(char const * str,uint len)62 inline static uint alloc_in_pool(char const * str, uint len)
63 {
64 char * place = op_pool_pos;
65 if (op_pool_pos + len + 1 >= op_pool_end)
66 return 0;
67
68 strcpy(place, str);
69 op_pool_pos += len + 1;
70 return place - op_pool_start;
71 }
72
get_from_pool(uint index)73 inline static char * get_from_pool(uint index)
74 {
75 return op_pool_start + index;
76 }
77
add_hash_entry(struct op_hash_index * entry,uint parent,char const * name,uint len)78 inline static int add_hash_entry(struct op_hash_index * entry, uint parent, char const * name, uint len)
79 {
80 entry->name = alloc_in_pool(name, len);
81 if (!entry->name)
82 return -1;
83 entry->parent = parent;
84 return 0;
85 }
86
87 #endif /* OP_DCACHE_H */
88