dcache.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:8k
源码类别:

Linux/Unix编程

开发平台:

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