Blame view

include/linux/dcache.h 11.5 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  #ifndef __LINUX_DCACHE_H
  #define __LINUX_DCACHE_H
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
4
  #include <asm/atomic.h>
  #include <linux/list.h>
82524746c   Franck Bui-Huu   rcu: split list.h...
5
  #include <linux/rculist.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
8
  #include <linux/spinlock.h>
  #include <linux/cache.h>
  #include <linux/rcupdate.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
  
  struct nameidata;
cf28b4863   Jan Blunck   d_path: Make d_pa...
11
  struct path;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
  struct vfsmount;
  
  /*
   * linux/include/linux/dcache.h
   *
   * Dirent cache data structures
   *
   * (C) Copyright 1997 Thomas Schoebel-Theuer,
   * with heavy changes by Linus Torvalds
   */
  
  #define IS_ROOT(x) ((x) == (x)->d_parent)
  
  /*
   * "quick string" -- eases parameter passing, but more importantly
   * saves "metadata" about the string (ie length and the hash).
   *
   * hash comes first so it snuggles against d_parent in the
   * dentry.
   */
  struct qstr {
  	unsigned int hash;
  	unsigned int len;
  	const unsigned char *name;
  };
  
  struct dentry_stat_t {
  	int nr_dentry;
  	int nr_unused;
  	int age_limit;          /* age in seconds */
  	int want_pages;         /* pages requested by system */
  	int dummy[2];
  };
  extern struct dentry_stat_t dentry_stat;
  
  /* Name hashing routines. Initial hash value */
  /* Hash courtesy of the R5 hash in reiserfs modulo sign bits */
  #define init_name_hash()		0
  
  /* partial hash update function. Assume roughly 4 bits per character */
  static inline unsigned long
  partial_name_hash(unsigned long c, unsigned long prevhash)
  {
  	return (prevhash + (c << 4) + (c >> 4)) * 11;
  }
  
  /*
   * Finally: cut down the number of bits to a int value (and try to avoid
   * losing bits)
   */
  static inline unsigned long end_name_hash(unsigned long hash)
  {
  	return (unsigned int) hash;
  }
  
  /* Compute the hash for a name string. */
  static inline unsigned int
  full_name_hash(const unsigned char *name, unsigned int len)
  {
  	unsigned long hash = init_name_hash();
  	while (len--)
  		hash = partial_name_hash(*name++, hash);
  	return end_name_hash(hash);
  }
c2452f327   Nick Piggin   shrink struct dentry
76
77
78
79
80
81
82
83
84
85
  /*
   * Try to keep struct dentry aligned on 64 byte cachelines (this will
   * give reasonable cacheline footprint with larger lines without the
   * large memory footprint increase).
   */
  #ifdef CONFIG_64BIT
  #define DNAME_INLINE_LEN_MIN 32 /* 192 bytes */
  #else
  #define DNAME_INLINE_LEN_MIN 40 /* 128 bytes */
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86
87
88
89
90
  
  struct dentry {
  	atomic_t d_count;
  	unsigned int d_flags;		/* protected by d_lock */
  	spinlock_t d_lock;		/* per dentry lock */
c2452f327   Nick Piggin   shrink struct dentry
91
  	int d_mounted;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
93
94
95
  	struct inode *d_inode;		/* Where the name belongs to - NULL is
  					 * negative */
  	/*
  	 * The next three fields are touched by __d_lookup.  Place them here
3f4bb1f41   Eric Dumazet   [PATCH] struct de...
96
  	 * so they all fit in a cache line.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
  	 */
3f4bb1f41   Eric Dumazet   [PATCH] struct de...
98
  	struct hlist_node d_hash;	/* lookup hash list */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
100
101
102
  	struct dentry *d_parent;	/* parent directory */
  	struct qstr d_name;
  
  	struct list_head d_lru;		/* LRU list */
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
103
104
105
106
107
108
109
  	/*
  	 * d_child and d_rcu can share memory
  	 */
  	union {
  		struct list_head d_child;	/* child of parent list */
  	 	struct rcu_head d_rcu;
  	} d_u;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
111
112
  	struct list_head d_subdirs;	/* our children */
  	struct list_head d_alias;	/* inode alias list */
  	unsigned long d_time;		/* used by d_revalidate */
e56980d45   Jan Engelhardt   fs: make struct d...
113
  	const struct dentry_operations *d_op;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
114
115
  	struct super_block *d_sb;	/* The root of the dentry tree */
  	void *d_fsdata;			/* fs-specific data */
c2452f327   Nick Piggin   shrink struct dentry
116

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
118
  	unsigned char d_iname[DNAME_INLINE_LEN_MIN];	/* small names */
  };
a90b9c05d   Ingo Molnar   [PATCH] lockdep: ...
119
120
121
122
123
124
125
126
127
128
129
  /*
   * dentry->d_lock spinlock nesting subclasses:
   *
   * 0: normal
   * 1: nested
   */
  enum dentry_d_lock_class
  {
  	DENTRY_D_LOCK_NORMAL, /* implicitly used by plain spin_lock() APIs. */
  	DENTRY_D_LOCK_NESTED
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130
131
132
133
134
135
136
  struct dentry_operations {
  	int (*d_revalidate)(struct dentry *, struct nameidata *);
  	int (*d_hash) (struct dentry *, struct qstr *);
  	int (*d_compare) (struct dentry *, struct qstr *, struct qstr *);
  	int (*d_delete)(struct dentry *);
  	void (*d_release)(struct dentry *);
  	void (*d_iput)(struct dentry *, struct inode *);
c23fbb6bc   Eric Dumazet   VFS: delay the de...
137
  	char *(*d_dname)(struct dentry *, char *, int);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
  };
  
  /* the dentry parameter passed to d_hash and d_compare is the parent
   * directory of the entries to be compared. It is used in case these
   * functions need any directory specific information for determining
   * equivalency classes.  Using the dentry itself might not work, as it
   * might be a negative dentry which has no information associated with
   * it */
  
  /*
  locking rules:
  		big lock	dcache_lock	d_lock   may block
  d_revalidate:	no		no		no       yes
  d_hash		no		no		no       yes
  d_compare:	no		yes		yes      no
  d_delete:	no		yes		no       no
  d_release:	no		no		no       yes
  d_iput:		no		no		no       yes
   */
  
  /* d_flags entries */
  #define DCACHE_AUTOFS_PENDING 0x0001    /* autofs: "under construction" */
  #define DCACHE_NFSFS_RENAMED  0x0002    /* this dentry has been "silly
  					 * renamed" and has to be
  					 * deleted on the last dput()
  					 */
  #define	DCACHE_DISCONNECTED 0x0004
       /* This dentry is possibly not currently connected to the dcache tree,
        * in which case its parent will either be itself, or will have this
        * flag as well.  nfsd will not use a dentry with this bit set, but will
        * first endeavour to clear the bit either by discovering that it is
        * connected, or by performing lookup operations.   Any filesystem which
        * supports nfsd_operations MUST have a lookup function which, if it finds
        * a directory inode with a DCACHE_DISCONNECTED dentry, will d_move
        * that dentry into place and return that dentry rather than the passed one,
        * typically using d_splice_alias.
        */
  
  #define DCACHE_REFERENCED	0x0008  /* Recently used, don't discard. */
  #define DCACHE_UNHASHED		0x0010	
c28f7e56e   Eric Paris   fsnotify: parent ...
178
  #define DCACHE_INOTIFY_PARENT_WATCHED	0x0020 /* Parent inode is watched by inotify */
c32ccd87b   Nick Piggin   [PATCH] inotify: ...
179

c2452f327   Nick Piggin   shrink struct dentry
180
  #define DCACHE_COOKIE		0x0040	/* For use by dcookie subsystem */
c28f7e56e   Eric Paris   fsnotify: parent ...
181
  #define DCACHE_FSNOTIFY_PARENT_WATCHED	0x0080 /* Parent inode is watched by some fsnotify listener */
d83c49f3e   Al Viro   Fix the regressio...
182
  #define DCACHE_CANT_MOUNT	0x0100
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
183
  extern spinlock_t dcache_lock;
74c3cbe33   Al Viro   [PATCH] audit: wa...
184
  extern seqlock_t rename_lock;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
  
  /**
   * d_drop - drop a dentry
   * @dentry: dentry to drop
   *
   * d_drop() unhashes the entry from the parent dentry hashes, so that it won't
   * be found through a VFS lookup any more. Note that this is different from
   * deleting the dentry - d_delete will try to mark the dentry negative if
   * possible, giving a successful _negative_ lookup, while d_drop will
   * just make the cache lookup fail.
   *
   * d_drop() is used mainly for stuff that wants to invalidate a dentry for some
   * reason (NFS timeouts or autofs deletes).
   *
   * __d_drop requires dentry->d_lock.
   */
  
  static inline void __d_drop(struct dentry *dentry)
  {
  	if (!(dentry->d_flags & DCACHE_UNHASHED)) {
  		dentry->d_flags |= DCACHE_UNHASHED;
  		hlist_del_rcu(&dentry->d_hash);
  	}
  }
  
  static inline void d_drop(struct dentry *dentry)
  {
  	spin_lock(&dcache_lock);
  	spin_lock(&dentry->d_lock);
   	__d_drop(dentry);
  	spin_unlock(&dentry->d_lock);
  	spin_unlock(&dcache_lock);
  }
  
  static inline int dname_external(struct dentry *dentry)
  {
  	return dentry->d_name.name != dentry->d_iname;
  }
  
  /*
   * These are the low-level FS interfaces to the dcache..
   */
  extern void d_instantiate(struct dentry *, struct inode *);
  extern struct dentry * d_instantiate_unique(struct dentry *, struct inode *);
770bfad84   David Howells   NFS: Add dentry m...
229
  extern struct dentry * d_materialise_unique(struct dentry *, struct inode *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
230
231
232
233
  extern void d_delete(struct dentry *);
  
  /* allocate/de-allocate */
  extern struct dentry * d_alloc(struct dentry *, const struct qstr *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
234
  extern struct dentry * d_splice_alias(struct inode *, struct dentry *);
e45b590b9   Christoph Hellwig   [PATCH] change d_...
235
  extern struct dentry * d_add_ci(struct dentry *, struct inode *, struct qstr *);
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
236
  extern struct dentry * d_obtain_alias(struct inode *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
237
238
  extern void shrink_dcache_sb(struct super_block *);
  extern void shrink_dcache_parent(struct dentry *);
c636ebdb1   David Howells   [PATCH] VFS: Dest...
239
  extern void shrink_dcache_for_umount(struct super_block *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
  extern int d_invalidate(struct dentry *);
  
  /* only used at mount-time */
  extern struct dentry * d_alloc_root(struct inode *);
  
  /* <clickety>-<click> the ramfs-type tree */
  extern void d_genocide(struct dentry *);
  
  extern struct dentry *d_find_alias(struct inode *);
  extern void d_prune_aliases(struct inode *);
  
  /* test whether we have any submounts in a subdir tree */
  extern int have_submounts(struct dentry *);
  
  /*
   * This adds the entry to the hash queues.
   */
  extern void d_rehash(struct dentry *);
  
  /**
   * d_add - add dentry to hash queues
   * @entry: dentry to add
   * @inode: The inode to attach to this dentry
   *
   * This adds the entry to the hash queues and initializes @inode.
   * The entry was actually filled in earlier during d_alloc().
   */
   
  static inline void d_add(struct dentry *entry, struct inode *inode)
  {
  	d_instantiate(entry, inode);
  	d_rehash(entry);
  }
  
  /**
   * d_add_unique - add dentry to hash queues without aliasing
   * @entry: dentry to add
   * @inode: The inode to attach to this dentry
   *
   * This adds the entry to the hash queues and initializes @inode.
   * The entry was actually filled in earlier during d_alloc().
   */
  static inline struct dentry *d_add_unique(struct dentry *entry, struct inode *inode)
  {
  	struct dentry *res;
  
  	res = d_instantiate_unique(entry, inode);
  	d_rehash(res != NULL ? res : entry);
  	return res;
  }
  
  /* used for rename() and baskets */
  extern void d_move(struct dentry *, struct dentry *);
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
293
  extern struct dentry *d_ancestor(struct dentry *, struct dentry *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294
295
296
297
  
  /* appendix may either be NULL or be used for transname suffixes */
  extern struct dentry * d_lookup(struct dentry *, struct qstr *);
  extern struct dentry * __d_lookup(struct dentry *, struct qstr *);
3e7e241f8   Eric W. Biederman   [PATCH] dcache: A...
298
  extern struct dentry * d_hash_and_lookup(struct dentry *, struct qstr *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
299
300
301
  
  /* validate "insecure" dentry pointer */
  extern int d_validate(struct dentry *, struct dentry *);
c23fbb6bc   Eric Dumazet   VFS: delay the de...
302
303
304
305
  /*
   * helper function for dentry_operations.d_dname() members
   */
  extern char *dynamic_dname(struct dentry *, char *, int, const char *, ...);
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
306
  extern char *__d_path(const struct path *path, struct path *root, char *, int);
20d4fdc1a   Jan Engelhardt   [patch 2/4] fs: m...
307
  extern char *d_path(const struct path *, char *, int);
8df9d1a41   Miklos Szeredi   vfs: show unreach...
308
  extern char *d_path_with_unreachable(const struct path *, char *, int);
c103135c1   Al Viro   new helper: __den...
309
  extern char *__dentry_path(struct dentry *, char *, int);
6092d0481   Ram Pai   [patch 1/7] vfs: ...
310
  extern char *dentry_path(struct dentry *, char *, int);
cf28b4863   Jan Blunck   d_path: Make d_pa...
311

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
  /* Allocation counts.. */
  
  /**
   *	dget, dget_locked	-	get a reference to a dentry
   *	@dentry: dentry to get a reference to
   *
   *	Given a dentry or %NULL pointer increment the reference count
   *	if appropriate and return the dentry. A dentry will not be 
   *	destroyed when it has references. dget() should never be
   *	called for dentries with zero reference counter. For these cases
   *	(preferably none, functions in dcache.c are sufficient for normal
   *	needs and they take necessary precautions) you should hold dcache_lock
   *	and call dget_locked() instead of dget().
   */
   
  static inline struct dentry *dget(struct dentry *dentry)
  {
  	if (dentry) {
  		BUG_ON(!atomic_read(&dentry->d_count));
  		atomic_inc(&dentry->d_count);
  	}
  	return dentry;
  }
  
  extern struct dentry * dget_locked(struct dentry *);
  
  /**
   *	d_unhashed -	is dentry hashed
   *	@dentry: entry to check
   *
   *	Returns true if the dentry passed is not currently hashed.
   */
   
  static inline int d_unhashed(struct dentry *dentry)
  {
  	return (dentry->d_flags & DCACHE_UNHASHED);
  }
f3da392e9   Alexey Dobriyan   dcache: extrace a...
349
350
351
352
  static inline int d_unlinked(struct dentry *dentry)
  {
  	return d_unhashed(dentry) && !IS_ROOT(dentry);
  }
d83c49f3e   Al Viro   Fix the regressio...
353
354
355
356
357
358
359
360
361
362
363
  static inline int cant_mount(struct dentry *dentry)
  {
  	return (dentry->d_flags & DCACHE_CANT_MOUNT);
  }
  
  static inline void dont_mount(struct dentry *dentry)
  {
  	spin_lock(&dentry->d_lock);
  	dentry->d_flags |= DCACHE_CANT_MOUNT;
  	spin_unlock(&dentry->d_lock);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
  static inline struct dentry *dget_parent(struct dentry *dentry)
  {
  	struct dentry *ret;
  
  	spin_lock(&dentry->d_lock);
  	ret = dget(dentry->d_parent);
  	spin_unlock(&dentry->d_lock);
  	return ret;
  }
  
  extern void dput(struct dentry *);
  
  static inline int d_mountpoint(struct dentry *dentry)
  {
  	return dentry->d_mounted;
  }
1c755af4d   Al Viro   switch lookup_mnt()
380
  extern struct vfsmount *lookup_mnt(struct path *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
381
382
383
  extern struct dentry *lookup_create(struct nameidata *nd, int is_dir);
  
  extern int sysctl_vfs_cache_pressure;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
384
  #endif	/* __LINUX_DCACHE_H */