| /** |
| * @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 */ |