dcache.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:8k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef __LINUX_DCACHE_H
  2. #define __LINUX_DCACHE_H
  3. #ifdef __KERNEL__
  4. #include <asm/atomic.h>
  5. #include <linux/mount.h>
  6. /*
  7.  * linux/include/linux/dcache.h
  8.  *
  9.  * Dirent cache data structures
  10.  *
  11.  * (C) Copyright 1997 Thomas Schoebel-Theuer,
  12.  * with heavy changes by Linus Torvalds
  13.  */
  14. #define IS_ROOT(x) ((x) == (x)->d_parent)
  15. /*
  16.  * "quick string" -- eases parameter passing, but more importantly
  17.  * saves "metadata" about the string (ie length and the hash).
  18.  */
  19. struct qstr {
  20. const unsigned char * name;
  21. unsigned int len;
  22. unsigned int hash;
  23. };
  24. struct dentry_stat_t {
  25. int nr_dentry;
  26. int nr_unused;
  27. int age_limit;          /* age in seconds */
  28. int want_pages;         /* pages requested by system */
  29. int dummy[2];
  30. };
  31. extern struct dentry_stat_t dentry_stat;
  32. /* Name hashing routines. Initial hash value */
  33. /* Hash courtesy of the R5 hash in reiserfs modulo sign bits */
  34. #define init_name_hash() 0
  35. /* partial hash update function. Assume roughly 4 bits per character */
  36. static __inline__ unsigned long partial_name_hash(unsigned long c, unsigned long prevhash)
  37. {
  38. return (prevhash + (c << 4) + (c >> 4)) * 11;
  39. }
  40. /* Finally: cut down the number of bits to a int value (and try to avoid losing bits) */
  41. static __inline__ unsigned long end_name_hash(unsigned long hash)
  42. {
  43. return (unsigned int) hash;
  44. }
  45. /* Compute the hash for a name string. */
  46. static __inline__ unsigned int full_name_hash(const unsigned char * name, unsigned int len)
  47. {
  48. unsigned long hash = init_name_hash();
  49. while (len--)
  50. hash = partial_name_hash(*name++, hash);
  51. return end_name_hash(hash);
  52. }
  53. #define DNAME_INLINE_LEN 16
  54. struct dentry {
  55. atomic_t d_count;
  56. unsigned int d_flags;
  57. struct inode  * d_inode; /* Where the name belongs to - NULL is negative */
  58. struct dentry * d_parent; /* parent directory */
  59. struct list_head d_hash; /* lookup hash list */
  60. struct list_head d_lru; /* d_count = 0 LRU list */
  61. struct list_head d_child; /* child of parent list */
  62. struct list_head d_subdirs; /* our children */
  63. struct list_head d_alias; /* inode alias list */
  64. int d_mounted;
  65. struct qstr d_name;
  66. unsigned long d_time; /* used by d_revalidate */
  67. struct dentry_operations  *d_op;
  68. struct super_block * d_sb; /* The root of the dentry tree */
  69. unsigned long d_vfs_flags;
  70. void * d_fsdata; /* fs-specific data */
  71. unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */
  72. };
  73. struct dentry_operations {
  74. int (*d_revalidate)(struct dentry *, int);
  75. int (*d_hash) (struct dentry *, struct qstr *);
  76. int (*d_compare) (struct dentry *, struct qstr *, struct qstr *);
  77. int (*d_delete)(struct dentry *);
  78. void (*d_release)(struct dentry *);
  79. void (*d_iput)(struct dentry *, struct inode *);
  80. };
  81. /* the dentry parameter passed to d_hash and d_compare is the parent
  82.  * directory of the entries to be compared. It is used in case these
  83.  * functions need any directory specific information for determining
  84.  * equivalency classes.  Using the dentry itself might not work, as it
  85.  * might be a negative dentry which has no information associated with
  86.  * it */
  87. /*
  88. locking rules:
  89. big lock dcache_lock may block
  90. d_revalidate: no no yes
  91. d_hash no no yes
  92. d_compare: no yes no
  93. d_delete: no yes no
  94. d_release: no no yes
  95. d_iput: no no yes
  96.  */
  97. /* d_flags entries */
  98. #define DCACHE_AUTOFS_PENDING 0x0001    /* autofs: "under construction" */
  99. #define DCACHE_NFSFS_RENAMED  0x0002    /* this dentry has been "silly
  100.  * renamed" and has to be
  101.  * deleted on the last dput()
  102.  */
  103. #define DCACHE_NFSD_DISCONNECTED 0x0004 /* This dentry is not currently connected to the
  104.  * dcache tree. Its parent will either be itself,
  105.  * or will have this flag as well.
  106.  * If this dentry points to a directory, then
  107.  * s_nfsd_free_path semaphore will be down
  108.  */
  109. #define DCACHE_REFERENCED 0x0008  /* Recently used, don't discard. */
  110. extern spinlock_t dcache_lock;
  111. /**
  112.  * d_drop - drop a dentry
  113.  * @dentry: dentry to drop
  114.  *
  115.  * d_drop() unhashes the entry from the parent
  116.  * dentry hashes, so that it won't be found through
  117.  * a VFS lookup any more. Note that this is different
  118.  * from deleting the dentry - d_delete will try to
  119.  * mark the dentry negative if possible, giving a
  120.  * successful _negative_ lookup, while d_drop will
  121.  * just make the cache lookup fail.
  122.  *
  123.  * d_drop() is used mainly for stuff that wants
  124.  * to invalidate a dentry for some reason (NFS
  125.  * timeouts or autofs deletes).
  126.  */
  127. static __inline__ void d_drop(struct dentry * dentry)
  128. {
  129. spin_lock(&dcache_lock);
  130. list_del(&dentry->d_hash);
  131. INIT_LIST_HEAD(&dentry->d_hash);
  132. spin_unlock(&dcache_lock);
  133. }
  134. static __inline__ int dname_external(struct dentry *d)
  135. {
  136. return d->d_name.name != d->d_iname; 
  137. }
  138. /*
  139.  * These are the low-level FS interfaces to the dcache..
  140.  */
  141. extern void d_instantiate(struct dentry *, struct inode *);
  142. extern void d_delete(struct dentry *);
  143. /* allocate/de-allocate */
  144. extern struct dentry * d_alloc(struct dentry *, const struct qstr *);
  145. extern void shrink_dcache_sb(struct super_block *);
  146. extern void shrink_dcache_parent(struct dentry *);
  147. extern int d_invalidate(struct dentry *);
  148. #define shrink_dcache() prune_dcache(0)
  149. struct zone_struct;
  150. /* dcache memory management */
  151. extern int shrink_dcache_memory(int, unsigned int);
  152. extern void prune_dcache(int);
  153. /* icache memory management (defined in linux/fs/inode.c) */
  154. extern int shrink_icache_memory(int, int);
  155. extern void prune_icache(int);
  156. /* quota cache memory management (defined in linux/fs/dquot.c) */
  157. extern int shrink_dqcache_memory(int, unsigned int);
  158. /* only used at mount-time */
  159. extern struct dentry * d_alloc_root(struct inode *);
  160. /* <clickety>-<click> the ramfs-type tree */
  161. extern void d_genocide(struct dentry *);
  162. extern struct dentry *d_find_alias(struct inode *);
  163. extern void d_prune_aliases(struct inode *);
  164. /* test whether we have any submounts in a subdir tree */
  165. extern int have_submounts(struct dentry *);
  166. /*
  167.  * This adds the entry to the hash queues.
  168.  */
  169. extern void d_rehash(struct dentry *);
  170. /**
  171.  * d_add - add dentry to hash queues
  172.  * @entry: dentry to add
  173.  * @inode: The inode to attach to this dentry
  174.  *
  175.  * This adds the entry to the hash queues and initializes @inode.
  176.  * The entry was actually filled in earlier during d_alloc().
  177.  */
  178.  
  179. static __inline__ void d_add(struct dentry * entry, struct inode * inode)
  180. {
  181. d_instantiate(entry, inode);
  182. d_rehash(entry);
  183. }
  184. /* used for rename() and baskets */
  185. extern void d_move(struct dentry *, struct dentry *);
  186. /* appendix may either be NULL or be used for transname suffixes */
  187. extern struct dentry * d_lookup(struct dentry *, struct qstr *);
  188. /* validate "insecure" dentry pointer */
  189. extern int d_validate(struct dentry *, struct dentry *);
  190. extern char * __d_path(struct dentry *, struct vfsmount *, struct dentry *,
  191. struct vfsmount *, char *, int);
  192.   
  193. /* Allocation counts.. */
  194. /**
  195.  * dget, dget_locked - get a reference to a dentry
  196.  * @dentry: dentry to get a reference to
  197.  *
  198.  * Given a dentry or %NULL pointer increment the reference count
  199.  * if appropriate and return the dentry. A dentry will not be 
  200.  * destroyed when it has references. dget() should never be
  201.  * called for dentries with zero reference counter. For these cases
  202.  * (preferably none, functions in dcache.c are sufficient for normal
  203.  * needs and they take necessary precautions) you should hold dcache_lock
  204.  * and call dget_locked() instead of dget().
  205.  */
  206.  
  207. static __inline__ struct dentry * dget(struct dentry *dentry)
  208. {
  209. if (dentry) {
  210. if (!atomic_read(&dentry->d_count))
  211. BUG();
  212. atomic_inc(&dentry->d_count);
  213. }
  214. return dentry;
  215. }
  216. extern struct dentry * dget_locked(struct dentry *);
  217. /**
  218.  * d_unhashed - is dentry hashed
  219.  * @dentry: entry to check
  220.  *
  221.  * Returns true if the dentry passed is not currently hashed.
  222.  */
  223.  
  224. static __inline__ int d_unhashed(struct dentry *dentry)
  225. {
  226. return list_empty(&dentry->d_hash);
  227. }
  228. extern void dput(struct dentry *);
  229. static __inline__ int d_mountpoint(struct dentry *dentry)
  230. {
  231. return dentry->d_mounted;
  232. }
  233. extern struct vfsmount *lookup_mnt(struct vfsmount *, struct dentry *);
  234. #endif /* __KERNEL__ */
  235. #endif /* __LINUX_DCACHE_H */