Blame view

fs/dcache.c 53.8 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  /*
   * fs/dcache.c
   *
   * Complete reimplementation
   * (C) 1997 Thomas Schoebel-Theuer,
   * with heavy changes by Linus Torvalds
   */
  
  /*
   * Notes on the allocation strategy:
   *
   * The dcache is a master of the icache - whenever a dcache entry
   * exists, the inode will always exist. "iput()" is done either when
   * the dcache entry is deleted or garbage collected.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
17
18
19
  #include <linux/syscalls.h>
  #include <linux/string.h>
  #include <linux/mm.h>
  #include <linux/fs.h>
7a91bf7f5   John McCutchan   [PATCH] fsnotify_...
20
  #include <linux/fsnotify.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
23
24
25
26
27
28
29
30
31
32
33
  #include <linux/slab.h>
  #include <linux/init.h>
  #include <linux/smp_lock.h>
  #include <linux/hash.h>
  #include <linux/cache.h>
  #include <linux/module.h>
  #include <linux/mount.h>
  #include <linux/file.h>
  #include <asm/uaccess.h>
  #include <linux/security.h>
  #include <linux/seqlock.h>
  #include <linux/swap.h>
  #include <linux/bootmem.h>
07f3f05c1   David Howells   [PATCH] BLOCK: Mo...
34
  #include "internal.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36

fa3536cc1   Eric Dumazet   [PATCH] Use __rea...
37
  int sysctl_vfs_cache_pressure __read_mostly = 100;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
39
40
  EXPORT_SYMBOL_GPL(sysctl_vfs_cache_pressure);
  
   __cacheline_aligned_in_smp DEFINE_SPINLOCK(dcache_lock);
e4d919188   Ingo Molnar   [PATCH] lockdep: ...
41
  static __cacheline_aligned_in_smp DEFINE_SEQLOCK(rename_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
43
  
  EXPORT_SYMBOL(dcache_lock);
e18b890bb   Christoph Lameter   [PATCH] slab: rem...
44
  static struct kmem_cache *dentry_cache __read_mostly;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
46
47
48
49
50
51
52
53
54
55
56
57
  
  #define DNAME_INLINE_LEN (sizeof(struct dentry)-offsetof(struct dentry,d_iname))
  
  /*
   * This is the single most critical data structure when it comes
   * to the dcache: the hashtable for lookups. Somebody should try
   * to make this good - I've just made it work.
   *
   * This hash-function tries to avoid losing too many bits of hash
   * information, yet avoid using a prime hash-size or similar.
   */
  #define D_HASHBITS     d_hash_shift
  #define D_HASHMASK     d_hash_mask
fa3536cc1   Eric Dumazet   [PATCH] Use __rea...
58
59
60
  static unsigned int d_hash_mask __read_mostly;
  static unsigned int d_hash_shift __read_mostly;
  static struct hlist_head *dentry_hashtable __read_mostly;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
62
63
64
65
66
  static LIST_HEAD(dentry_unused);
  
  /* Statistics gathering. */
  struct dentry_stat_t dentry_stat = {
  	.age_limit = 45,
  };
b3423415f   Eric Dumazet   [PATCH] dcache: a...
67
  static void __d_free(struct dentry *dentry)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
70
71
72
  	if (dname_external(dentry))
  		kfree(dentry->d_name.name);
  	kmem_cache_free(dentry_cache, dentry); 
  }
b3423415f   Eric Dumazet   [PATCH] dcache: a...
73
74
75
76
77
  static void d_callback(struct rcu_head *head)
  {
  	struct dentry * dentry = container_of(head, struct dentry, d_u.d_rcu);
  	__d_free(dentry);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
79
80
81
82
83
84
85
  /*
   * no dcache_lock, please.  The caller must decrement dentry_stat.nr_dentry
   * inside dcache_lock.
   */
  static void d_free(struct dentry *dentry)
  {
  	if (dentry->d_op && dentry->d_op->d_release)
  		dentry->d_op->d_release(dentry);
b3423415f   Eric Dumazet   [PATCH] dcache: a...
86
87
88
89
90
  	/* if dentry was never inserted into hash, immediate free is OK */
  	if (dentry->d_hash.pprev == NULL)
  		__d_free(dentry);
  	else
  		call_rcu(&dentry->d_u.d_rcu, d_callback);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
91
92
93
94
95
96
97
  }
  
  /*
   * Release the dentry's inode, using the filesystem
   * d_iput() operation if defined.
   * Called with dcache_lock and per dentry lock held, drops both.
   */
858119e15   Arjan van de Ven   [PATCH] Unlinline...
98
  static void dentry_iput(struct dentry * dentry)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
100
101
102
103
104
105
  {
  	struct inode *inode = dentry->d_inode;
  	if (inode) {
  		dentry->d_inode = NULL;
  		list_del_init(&dentry->d_alias);
  		spin_unlock(&dentry->d_lock);
  		spin_unlock(&dcache_lock);
f805fbdaa   Linus Torvalds   Make fsnotify pos...
106
107
  		if (!inode->i_nlink)
  			fsnotify_inoderemove(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
  		if (dentry->d_op && dentry->d_op->d_iput)
  			dentry->d_op->d_iput(dentry, inode);
  		else
  			iput(inode);
  	} else {
  		spin_unlock(&dentry->d_lock);
  		spin_unlock(&dcache_lock);
  	}
  }
  
  /* 
   * This is dput
   *
   * This is complicated by the fact that we do not want to put
   * dentries that are no longer on any hash chain on the unused
   * list: we'd much rather just get rid of them immediately.
   *
   * However, that implies that we have to traverse the dentry
   * tree upwards to the parents which might _also_ now be
   * scheduled for deletion (it may have been only waiting for
   * its last child to go away).
   *
   * This tail recursion is done by hand as we don't want to depend
   * on the compiler to always get this right (gcc generally doesn't).
   * Real recursion would eat up our stack space.
   */
  
  /*
   * dput - release a dentry
   * @dentry: dentry to release 
   *
   * Release a dentry. This will drop the usage count and if appropriate
   * call the dentry unlink method as well as removing it from the queues and
   * releasing its resources. If the parent dentries were scheduled for release
   * they too may now get deleted.
   *
   * no dcache lock, please.
   */
  
  void dput(struct dentry *dentry)
  {
  	if (!dentry)
  		return;
  
  repeat:
  	if (atomic_read(&dentry->d_count) == 1)
  		might_sleep();
  	if (!atomic_dec_and_lock(&dentry->d_count, &dcache_lock))
  		return;
  
  	spin_lock(&dentry->d_lock);
  	if (atomic_read(&dentry->d_count)) {
  		spin_unlock(&dentry->d_lock);
  		spin_unlock(&dcache_lock);
  		return;
  	}
  
  	/*
  	 * AV: ->d_delete() is _NOT_ allowed to block now.
  	 */
  	if (dentry->d_op && dentry->d_op->d_delete) {
  		if (dentry->d_op->d_delete(dentry))
  			goto unhash_it;
  	}
  	/* Unreachable? Get rid of it */
   	if (d_unhashed(dentry))
  		goto kill_it;
    	if (list_empty(&dentry->d_lru)) {
    		dentry->d_flags |= DCACHE_REFERENCED;
    		list_add(&dentry->d_lru, &dentry_unused);
    		dentry_stat.nr_unused++;
    	}
   	spin_unlock(&dentry->d_lock);
  	spin_unlock(&dcache_lock);
  	return;
  
  unhash_it:
  	__d_drop(dentry);
  
  kill_it: {
  		struct dentry *parent;
  
  		/* If dentry was on d_lru list
  		 * delete it from there
  		 */
    		if (!list_empty(&dentry->d_lru)) {
    			list_del(&dentry->d_lru);
    			dentry_stat.nr_unused--;
    		}
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
197
    		list_del(&dentry->d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
229
230
231
232
233
234
235
236
237
238
239
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
293
294
295
  		dentry_stat.nr_dentry--;	/* For d_free, below */
  		/*drops the locks, at that point nobody can reach this dentry */
  		dentry_iput(dentry);
  		parent = dentry->d_parent;
  		d_free(dentry);
  		if (dentry == parent)
  			return;
  		dentry = parent;
  		goto repeat;
  	}
  }
  
  /**
   * d_invalidate - invalidate a dentry
   * @dentry: dentry to invalidate
   *
   * Try to invalidate the dentry if it turns out to be
   * possible. If there are other dentries that can be
   * reached through this one we can't delete it and we
   * return -EBUSY. On success we return 0.
   *
   * no dcache lock.
   */
   
  int d_invalidate(struct dentry * dentry)
  {
  	/*
  	 * If it's already been dropped, return OK.
  	 */
  	spin_lock(&dcache_lock);
  	if (d_unhashed(dentry)) {
  		spin_unlock(&dcache_lock);
  		return 0;
  	}
  	/*
  	 * Check whether to do a partial shrink_dcache
  	 * to get rid of unused child entries.
  	 */
  	if (!list_empty(&dentry->d_subdirs)) {
  		spin_unlock(&dcache_lock);
  		shrink_dcache_parent(dentry);
  		spin_lock(&dcache_lock);
  	}
  
  	/*
  	 * Somebody else still using it?
  	 *
  	 * If it's a directory, we can't drop it
  	 * for fear of somebody re-populating it
  	 * with children (even though dropping it
  	 * would make it unreachable from the root,
  	 * we might still populate it if it was a
  	 * working directory or similar).
  	 */
  	spin_lock(&dentry->d_lock);
  	if (atomic_read(&dentry->d_count) > 1) {
  		if (dentry->d_inode && S_ISDIR(dentry->d_inode->i_mode)) {
  			spin_unlock(&dentry->d_lock);
  			spin_unlock(&dcache_lock);
  			return -EBUSY;
  		}
  	}
  
  	__d_drop(dentry);
  	spin_unlock(&dentry->d_lock);
  	spin_unlock(&dcache_lock);
  	return 0;
  }
  
  /* This should be called _only_ with dcache_lock held */
  
  static inline struct dentry * __dget_locked(struct dentry *dentry)
  {
  	atomic_inc(&dentry->d_count);
  	if (!list_empty(&dentry->d_lru)) {
  		dentry_stat.nr_unused--;
  		list_del_init(&dentry->d_lru);
  	}
  	return dentry;
  }
  
  struct dentry * dget_locked(struct dentry *dentry)
  {
  	return __dget_locked(dentry);
  }
  
  /**
   * d_find_alias - grab a hashed alias of inode
   * @inode: inode in question
   * @want_discon:  flag, used by d_splice_alias, to request
   *          that only a DISCONNECTED alias be returned.
   *
   * If inode has a hashed alias, or is a directory and has any alias,
   * acquire the reference to alias and return it. Otherwise return NULL.
   * Notice that if inode is a directory there can be only one alias and
   * it can be unhashed only if it has no children, or if it is the root
   * of a filesystem.
   *
21c0d8fdd   NeilBrown   [PATCH] knfsd: cl...
296
   * If the inode has an IS_ROOT, DCACHE_DISCONNECTED alias, then prefer
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
297
   * any other hashed alias over that one unless @want_discon is set,
21c0d8fdd   NeilBrown   [PATCH] knfsd: cl...
298
   * in which case only return an IS_ROOT, DCACHE_DISCONNECTED alias.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
   */
  
  static struct dentry * __d_find_alias(struct inode *inode, int want_discon)
  {
  	struct list_head *head, *next, *tmp;
  	struct dentry *alias, *discon_alias=NULL;
  
  	head = &inode->i_dentry;
  	next = inode->i_dentry.next;
  	while (next != head) {
  		tmp = next;
  		next = tmp->next;
  		prefetch(next);
  		alias = list_entry(tmp, struct dentry, d_alias);
   		if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) {
21c0d8fdd   NeilBrown   [PATCH] knfsd: cl...
314
315
  			if (IS_ROOT(alias) &&
  			    (alias->d_flags & DCACHE_DISCONNECTED))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316
317
318
319
320
321
322
323
324
325
326
327
328
329
  				discon_alias = alias;
  			else if (!want_discon) {
  				__dget_locked(alias);
  				return alias;
  			}
  		}
  	}
  	if (discon_alias)
  		__dget_locked(discon_alias);
  	return discon_alias;
  }
  
  struct dentry * d_find_alias(struct inode *inode)
  {
214fda1f6   David Howells   [PATCH] Optimise ...
330
331
332
333
334
335
336
  	struct dentry *de = NULL;
  
  	if (!list_empty(&inode->i_dentry)) {
  		spin_lock(&dcache_lock);
  		de = __d_find_alias(inode, 0);
  		spin_unlock(&dcache_lock);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
337
338
339
340
341
342
343
344
345
  	return de;
  }
  
  /*
   *	Try to kill dentries associated with this inode.
   * WARNING: you must own a reference to inode.
   */
  void d_prune_aliases(struct inode *inode)
  {
0cdca3f98   Domen Puncer   [PATCH] janitor: ...
346
  	struct dentry *dentry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
347
348
  restart:
  	spin_lock(&dcache_lock);
0cdca3f98   Domen Puncer   [PATCH] janitor: ...
349
  	list_for_each_entry(dentry, &inode->i_dentry, d_alias) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
  		spin_lock(&dentry->d_lock);
  		if (!atomic_read(&dentry->d_count)) {
  			__dget_locked(dentry);
  			__d_drop(dentry);
  			spin_unlock(&dentry->d_lock);
  			spin_unlock(&dcache_lock);
  			dput(dentry);
  			goto restart;
  		}
  		spin_unlock(&dentry->d_lock);
  	}
  	spin_unlock(&dcache_lock);
  }
  
  /*
d702ccb34   Andrew Morton   [PATCH] prune_one...
365
366
367
   * Throw away a dentry - free the inode, dput the parent.  This requires that
   * the LRU list has already been removed.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
368
   * Called with dcache_lock, drops it and then regains.
d702ccb34   Andrew Morton   [PATCH] prune_one...
369
   * Called with dentry->d_lock held, drops it.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
370
   */
d702ccb34   Andrew Morton   [PATCH] prune_one...
371
  static void prune_one_dentry(struct dentry * dentry)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
372
373
374
375
  {
  	struct dentry * parent;
  
  	__d_drop(dentry);
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
376
  	list_del(&dentry->d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
377
378
379
380
381
382
383
384
385
386
387
388
  	dentry_stat.nr_dentry--;	/* For d_free, below */
  	dentry_iput(dentry);
  	parent = dentry->d_parent;
  	d_free(dentry);
  	if (parent != dentry)
  		dput(parent);
  	spin_lock(&dcache_lock);
  }
  
  /**
   * prune_dcache - shrink the dcache
   * @count: number of entries to try and free
0feae5c47   NeilBrown   [PATCH] Fix dcach...
389
390
   * @sb: if given, ignore dentries for other superblocks
   *         which are being unmounted.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
391
392
393
394
395
396
397
398
399
400
   *
   * Shrink the dcache. This is done when we need
   * more memory, or simply when we need to unmount
   * something (at which point we need to unuse
   * all dentries).
   *
   * This function may fail to free any resources if
   * all the dentries are in use.
   */
   
0feae5c47   NeilBrown   [PATCH] Fix dcach...
401
  static void prune_dcache(int count, struct super_block *sb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
402
403
404
405
406
  {
  	spin_lock(&dcache_lock);
  	for (; count ; count--) {
  		struct dentry *dentry;
  		struct list_head *tmp;
0feae5c47   NeilBrown   [PATCH] Fix dcach...
407
  		struct rw_semaphore *s_umount;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
408
409
410
411
  
  		cond_resched_lock(&dcache_lock);
  
  		tmp = dentry_unused.prev;
f58a1ebb2   Hua Zhong   [PATCH] remove un...
412
  		if (sb) {
0feae5c47   NeilBrown   [PATCH] Fix dcach...
413
414
415
416
417
418
419
420
421
422
423
  			/* Try to find a dentry for this sb, but don't try
  			 * too hard, if they aren't near the tail they will
  			 * be moved down again soon
  			 */
  			int skip = count;
  			while (skip && tmp != &dentry_unused &&
  			    list_entry(tmp, struct dentry, d_lru)->d_sb != sb) {
  				skip--;
  				tmp = tmp->prev;
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
  		if (tmp == &dentry_unused)
  			break;
  		list_del_init(tmp);
  		prefetch(dentry_unused.prev);
   		dentry_stat.nr_unused--;
  		dentry = list_entry(tmp, struct dentry, d_lru);
  
   		spin_lock(&dentry->d_lock);
  		/*
  		 * We found an inuse dentry which was not removed from
  		 * dentry_unused because of laziness during lookup.  Do not free
  		 * it - just keep it off the dentry_unused list.
  		 */
   		if (atomic_read(&dentry->d_count)) {
   			spin_unlock(&dentry->d_lock);
  			continue;
  		}
  		/* If the dentry was recently referenced, don't free it. */
  		if (dentry->d_flags & DCACHE_REFERENCED) {
  			dentry->d_flags &= ~DCACHE_REFERENCED;
   			list_add(&dentry->d_lru, &dentry_unused);
   			dentry_stat.nr_unused++;
   			spin_unlock(&dentry->d_lock);
  			continue;
  		}
0feae5c47   NeilBrown   [PATCH] Fix dcach...
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
  		/*
  		 * If the dentry is not DCACHED_REFERENCED, it is time
  		 * to remove it from the dcache, provided the super block is
  		 * NULL (which means we are trying to reclaim memory)
  		 * or this dentry belongs to the same super block that
  		 * we want to shrink.
  		 */
  		/*
  		 * If this dentry is for "my" filesystem, then I can prune it
  		 * without taking the s_umount lock (I already hold it).
  		 */
  		if (sb && dentry->d_sb == sb) {
  			prune_one_dentry(dentry);
  			continue;
  		}
  		/*
  		 * ...otherwise we need to be sure this filesystem isn't being
  		 * unmounted, otherwise we could race with
  		 * generic_shutdown_super(), and end up holding a reference to
  		 * an inode while the filesystem is unmounted.
  		 * So we try to get s_umount, and make sure s_root isn't NULL.
  		 * (Take a local copy of s_umount to avoid a use-after-free of
  		 * `dentry').
  		 */
  		s_umount = &dentry->d_sb->s_umount;
  		if (down_read_trylock(s_umount)) {
  			if (dentry->d_sb->s_root != NULL) {
  				prune_one_dentry(dentry);
  				up_read(s_umount);
  				continue;
  			}
  			up_read(s_umount);
  		}
  		spin_unlock(&dentry->d_lock);
6eac3f93f   Vasily Averin   [PATCH] missing u...
483
484
485
  		/*
  		 * Insert dentry at the head of the list as inserting at the
  		 * tail leads to a cycle.
0feae5c47   NeilBrown   [PATCH] Fix dcach...
486
  		 */
6eac3f93f   Vasily Averin   [PATCH] missing u...
487
488
   		list_add(&dentry->d_lru, &dentry_unused);
  		dentry_stat.nr_unused++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
  	}
  	spin_unlock(&dcache_lock);
  }
  
  /*
   * Shrink the dcache for the specified super block.
   * This allows us to unmount a device without disturbing
   * the dcache for the other devices.
   *
   * This implementation makes just two traversals of the
   * unused list.  On the first pass we move the selected
   * dentries to the most recent end, and on the second
   * pass we free them.  The second pass must restart after
   * each dput(), but since the target dentries are all at
   * the end, it's really just a single traversal.
   */
  
  /**
   * shrink_dcache_sb - shrink dcache for a superblock
   * @sb: superblock
   *
   * Shrink the dcache for the specified super block. This
   * is used to free the dcache before unmounting a file
   * system
   */
  
  void shrink_dcache_sb(struct super_block * sb)
  {
  	struct list_head *tmp, *next;
  	struct dentry *dentry;
  
  	/*
  	 * Pass one ... move the dentries for the specified
  	 * superblock to the most recent end of the unused list.
  	 */
  	spin_lock(&dcache_lock);
0cdca3f98   Domen Puncer   [PATCH] janitor: ...
525
  	list_for_each_safe(tmp, next, &dentry_unused) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
526
527
528
  		dentry = list_entry(tmp, struct dentry, d_lru);
  		if (dentry->d_sb != sb)
  			continue;
1bfba4e8e   Akinobu Mita   [PATCH] core: use...
529
  		list_move(tmp, &dentry_unused);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
530
531
532
533
534
535
  	}
  
  	/*
  	 * Pass two ... free the dentries for this superblock.
  	 */
  repeat:
0cdca3f98   Domen Puncer   [PATCH] janitor: ...
536
  	list_for_each_safe(tmp, next, &dentry_unused) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
537
538
539
540
541
542
543
544
545
546
547
  		dentry = list_entry(tmp, struct dentry, d_lru);
  		if (dentry->d_sb != sb)
  			continue;
  		dentry_stat.nr_unused--;
  		list_del_init(tmp);
  		spin_lock(&dentry->d_lock);
  		if (atomic_read(&dentry->d_count)) {
  			spin_unlock(&dentry->d_lock);
  			continue;
  		}
  		prune_one_dentry(dentry);
2ab134608   Kirill Korotaev   [PATCH] Reduce sc...
548
  		cond_resched_lock(&dcache_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
549
550
551
552
553
554
  		goto repeat;
  	}
  	spin_unlock(&dcache_lock);
  }
  
  /*
c636ebdb1   David Howells   [PATCH] VFS: Dest...
555
556
557
558
559
560
561
   * destroy a single subtree of dentries for unmount
   * - see the comments on shrink_dcache_for_umount() for a description of the
   *   locking
   */
  static void shrink_dcache_for_umount_subtree(struct dentry *dentry)
  {
  	struct dentry *parent;
f87135762   David Howells   [PATCH] VFS: Fix ...
562
  	unsigned detached = 0;
c636ebdb1   David Howells   [PATCH] VFS: Dest...
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
  
  	BUG_ON(!IS_ROOT(dentry));
  
  	/* detach this root from the system */
  	spin_lock(&dcache_lock);
  	if (!list_empty(&dentry->d_lru)) {
  		dentry_stat.nr_unused--;
  		list_del_init(&dentry->d_lru);
  	}
  	__d_drop(dentry);
  	spin_unlock(&dcache_lock);
  
  	for (;;) {
  		/* descend to the first leaf in the current subtree */
  		while (!list_empty(&dentry->d_subdirs)) {
  			struct dentry *loop;
  
  			/* this is a branch with children - detach all of them
  			 * from the system in one go */
  			spin_lock(&dcache_lock);
  			list_for_each_entry(loop, &dentry->d_subdirs,
  					    d_u.d_child) {
  				if (!list_empty(&loop->d_lru)) {
  					dentry_stat.nr_unused--;
  					list_del_init(&loop->d_lru);
  				}
  
  				__d_drop(loop);
  				cond_resched_lock(&dcache_lock);
  			}
  			spin_unlock(&dcache_lock);
  
  			/* move to the first child */
  			dentry = list_entry(dentry->d_subdirs.next,
  					    struct dentry, d_u.d_child);
  		}
  
  		/* consume the dentries from this leaf up through its parents
  		 * until we find one with children or run out altogether */
  		do {
  			struct inode *inode;
  
  			if (atomic_read(&dentry->d_count) != 0) {
  				printk(KERN_ERR
  				       "BUG: Dentry %p{i=%lx,n=%s}"
  				       " still in use (%d)"
  				       " [unmount of %s %s]
  ",
  				       dentry,
  				       dentry->d_inode ?
  				       dentry->d_inode->i_ino : 0UL,
  				       dentry->d_name.name,
  				       atomic_read(&dentry->d_count),
  				       dentry->d_sb->s_type->name,
  				       dentry->d_sb->s_id);
  				BUG();
  			}
  
  			parent = dentry->d_parent;
  			if (parent == dentry)
  				parent = NULL;
  			else
  				atomic_dec(&parent->d_count);
  
  			list_del(&dentry->d_u.d_child);
f87135762   David Howells   [PATCH] VFS: Fix ...
628
  			detached++;
c636ebdb1   David Howells   [PATCH] VFS: Dest...
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
  
  			inode = dentry->d_inode;
  			if (inode) {
  				dentry->d_inode = NULL;
  				list_del_init(&dentry->d_alias);
  				if (dentry->d_op && dentry->d_op->d_iput)
  					dentry->d_op->d_iput(dentry, inode);
  				else
  					iput(inode);
  			}
  
  			d_free(dentry);
  
  			/* finished when we fall off the top of the tree,
  			 * otherwise we ascend to the parent and move to the
  			 * next sibling if there is one */
  			if (!parent)
f87135762   David Howells   [PATCH] VFS: Fix ...
646
  				goto out;
c636ebdb1   David Howells   [PATCH] VFS: Dest...
647
648
649
650
651
652
653
654
  
  			dentry = parent;
  
  		} while (list_empty(&dentry->d_subdirs));
  
  		dentry = list_entry(dentry->d_subdirs.next,
  				    struct dentry, d_u.d_child);
  	}
f87135762   David Howells   [PATCH] VFS: Fix ...
655
656
657
658
659
  out:
  	/* several dentries were freed, need to correct nr_dentry */
  	spin_lock(&dcache_lock);
  	dentry_stat.nr_dentry -= detached;
  	spin_unlock(&dcache_lock);
c636ebdb1   David Howells   [PATCH] VFS: Dest...
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
  }
  
  /*
   * destroy the dentries attached to a superblock on unmounting
   * - we don't need to use dentry->d_lock, and only need dcache_lock when
   *   removing the dentry from the system lists and hashes because:
   *   - the superblock is detached from all mountings and open files, so the
   *     dentry trees will not be rearranged by the VFS
   *   - s_umount is write-locked, so the memory pressure shrinker will ignore
   *     any dentries belonging to this superblock that it comes across
   *   - the filesystem itself is no longer permitted to rearrange the dentries
   *     in this superblock
   */
  void shrink_dcache_for_umount(struct super_block *sb)
  {
  	struct dentry *dentry;
  
  	if (down_read_trylock(&sb->s_umount))
  		BUG();
  
  	dentry = sb->s_root;
  	sb->s_root = NULL;
  	atomic_dec(&dentry->d_count);
  	shrink_dcache_for_umount_subtree(dentry);
  
  	while (!hlist_empty(&sb->s_anon)) {
  		dentry = hlist_entry(sb->s_anon.first, struct dentry, d_hash);
  		shrink_dcache_for_umount_subtree(dentry);
  	}
  }
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
   * Search for at least 1 mount point in the dentry's subdirs.
   * We descend to the next level whenever the d_subdirs
   * list is non-empty and continue searching.
   */
   
  /**
   * have_submounts - check for mounts over a dentry
   * @parent: dentry to check.
   *
   * Return true if the parent or its subdirectories contain
   * a mount point
   */
   
  int have_submounts(struct dentry *parent)
  {
  	struct dentry *this_parent = parent;
  	struct list_head *next;
  
  	spin_lock(&dcache_lock);
  	if (d_mountpoint(parent))
  		goto positive;
  repeat:
  	next = this_parent->d_subdirs.next;
  resume:
  	while (next != &this_parent->d_subdirs) {
  		struct list_head *tmp = next;
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
718
  		struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
719
720
721
722
723
724
725
726
727
728
729
730
731
  		next = tmp->next;
  		/* Have we found a mount point ? */
  		if (d_mountpoint(dentry))
  			goto positive;
  		if (!list_empty(&dentry->d_subdirs)) {
  			this_parent = dentry;
  			goto repeat;
  		}
  	}
  	/*
  	 * All done at this level ... ascend and resume the search.
  	 */
  	if (this_parent != parent) {
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
732
  		next = this_parent->d_u.d_child.next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
  		this_parent = this_parent->d_parent;
  		goto resume;
  	}
  	spin_unlock(&dcache_lock);
  	return 0; /* No mount points found in tree */
  positive:
  	spin_unlock(&dcache_lock);
  	return 1;
  }
  
  /*
   * Search the dentry child list for the specified parent,
   * and move any unused dentries to the end of the unused
   * list for prune_dcache(). We descend to the next level
   * whenever the d_subdirs list is non-empty and continue
   * searching.
   *
   * It returns zero iff there are no unused children,
   * otherwise  it returns the number of children moved to
   * the end of the unused list. This may not be the total
   * number of unused children, because select_parent can
   * drop the lock and return early due to latency
   * constraints.
   */
  static int select_parent(struct dentry * parent)
  {
  	struct dentry *this_parent = parent;
  	struct list_head *next;
  	int found = 0;
  
  	spin_lock(&dcache_lock);
  repeat:
  	next = this_parent->d_subdirs.next;
  resume:
  	while (next != &this_parent->d_subdirs) {
  		struct list_head *tmp = next;
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
769
  		struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
770
771
772
773
774
775
776
777
778
779
780
  		next = tmp->next;
  
  		if (!list_empty(&dentry->d_lru)) {
  			dentry_stat.nr_unused--;
  			list_del_init(&dentry->d_lru);
  		}
  		/* 
  		 * move only zero ref count dentries to the end 
  		 * of the unused list for prune_dcache
  		 */
  		if (!atomic_read(&dentry->d_count)) {
8e13059a3   Akinobu Mita   [PATCH] use list_...
781
  			list_add_tail(&dentry->d_lru, &dentry_unused);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
  			dentry_stat.nr_unused++;
  			found++;
  		}
  
  		/*
  		 * We can return to the caller if we have found some (this
  		 * ensures forward progress). We'll be coming back to find
  		 * the rest.
  		 */
  		if (found && need_resched())
  			goto out;
  
  		/*
  		 * Descend a level if the d_subdirs list is non-empty.
  		 */
  		if (!list_empty(&dentry->d_subdirs)) {
  			this_parent = dentry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
799
800
801
802
803
804
805
  			goto repeat;
  		}
  	}
  	/*
  	 * All done at this level ... ascend and resume the search.
  	 */
  	if (this_parent != parent) {
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
806
  		next = this_parent->d_u.d_child.next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
807
  		this_parent = this_parent->d_parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
  		goto resume;
  	}
  out:
  	spin_unlock(&dcache_lock);
  	return found;
  }
  
  /**
   * shrink_dcache_parent - prune dcache
   * @parent: parent of entries to prune
   *
   * Prune the dcache to remove unused children of the parent dentry.
   */
   
  void shrink_dcache_parent(struct dentry * parent)
  {
  	int found;
  
  	while ((found = select_parent(parent)) != 0)
0feae5c47   NeilBrown   [PATCH] Fix dcach...
827
  		prune_dcache(found, parent->d_sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
828
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
829
830
831
832
833
834
835
836
837
838
839
840
  /*
   * Scan `nr' dentries and return the number which remain.
   *
   * We need to avoid reentering the filesystem if the caller is performing a
   * GFP_NOFS allocation attempt.  One example deadlock is:
   *
   * ext2_new_block->getblk->GFP->shrink_dcache_memory->prune_dcache->
   * prune_one_dentry->dput->dentry_iput->iput->inode->i_sb->s_op->put_inode->
   * ext2_discard_prealloc->ext2_free_blocks->lock_super->DEADLOCK.
   *
   * In this case we return -1 to tell the caller that we baled.
   */
27496a8c6   Al Viro   [PATCH] gfp_t: fs/*
841
  static int shrink_dcache_memory(int nr, gfp_t gfp_mask)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
842
843
844
845
  {
  	if (nr) {
  		if (!(gfp_mask & __GFP_FS))
  			return -1;
0feae5c47   NeilBrown   [PATCH] Fix dcach...
846
  		prune_dcache(nr, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
  	}
  	return (dentry_stat.nr_unused / 100) * sysctl_vfs_cache_pressure;
  }
  
  /**
   * d_alloc	-	allocate a dcache entry
   * @parent: parent of entry to allocate
   * @name: qstr of the name
   *
   * Allocates a dentry. It returns %NULL if there is insufficient memory
   * available. On a success the dentry is returned. The name passed in is
   * copied and the copy passed in may be reused after this call.
   */
   
  struct dentry *d_alloc(struct dentry * parent, const struct qstr *name)
  {
  	struct dentry *dentry;
  	char *dname;
  
  	dentry = kmem_cache_alloc(dentry_cache, GFP_KERNEL); 
  	if (!dentry)
  		return NULL;
  
  	if (name->len > DNAME_INLINE_LEN-1) {
  		dname = kmalloc(name->len + 1, GFP_KERNEL);
  		if (!dname) {
  			kmem_cache_free(dentry_cache, dentry); 
  			return NULL;
  		}
  	} else  {
  		dname = dentry->d_iname;
  	}	
  	dentry->d_name.name = dname;
  
  	dentry->d_name.len = name->len;
  	dentry->d_name.hash = name->hash;
  	memcpy(dname, name->name, name->len);
  	dname[name->len] = 0;
  
  	atomic_set(&dentry->d_count, 1);
  	dentry->d_flags = DCACHE_UNHASHED;
  	spin_lock_init(&dentry->d_lock);
  	dentry->d_inode = NULL;
  	dentry->d_parent = NULL;
  	dentry->d_sb = NULL;
  	dentry->d_op = NULL;
  	dentry->d_fsdata = NULL;
  	dentry->d_mounted = 0;
47ba87e0b   Marcelo Tosatti   [PATCH] make "str...
895
  #ifdef CONFIG_PROFILING
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
896
  	dentry->d_cookie = NULL;
47ba87e0b   Marcelo Tosatti   [PATCH] make "str...
897
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
898
899
900
901
902
903
904
905
906
  	INIT_HLIST_NODE(&dentry->d_hash);
  	INIT_LIST_HEAD(&dentry->d_lru);
  	INIT_LIST_HEAD(&dentry->d_subdirs);
  	INIT_LIST_HEAD(&dentry->d_alias);
  
  	if (parent) {
  		dentry->d_parent = dget(parent);
  		dentry->d_sb = parent->d_sb;
  	} else {
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
907
  		INIT_LIST_HEAD(&dentry->d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
908
909
910
911
  	}
  
  	spin_lock(&dcache_lock);
  	if (parent)
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
912
  		list_add(&dentry->d_u.d_child, &parent->d_subdirs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
  	dentry_stat.nr_dentry++;
  	spin_unlock(&dcache_lock);
  
  	return dentry;
  }
  
  struct dentry *d_alloc_name(struct dentry *parent, const char *name)
  {
  	struct qstr q;
  
  	q.name = name;
  	q.len = strlen(name);
  	q.hash = full_name_hash(q.name, q.len);
  	return d_alloc(parent, &q);
  }
  
  /**
   * d_instantiate - fill in inode information for a dentry
   * @entry: dentry to complete
   * @inode: inode to attach to this dentry
   *
   * Fill in inode information in the entry.
   *
   * This turns negative dentries into productive full members
   * of society.
   *
   * NOTE! This assumes that the inode count has been incremented
   * (or otherwise set) by the caller to indicate that it is now
   * in use by the dcache.
   */
   
  void d_instantiate(struct dentry *entry, struct inode * inode)
  {
28133c7b2   Eric Sesterhenn   BUG_ON() Conversi...
946
  	BUG_ON(!list_empty(&entry->d_alias));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
947
948
949
950
  	spin_lock(&dcache_lock);
  	if (inode)
  		list_add(&entry->d_alias, &inode->i_dentry);
  	entry->d_inode = inode;
c32ccd87b   Nick Piggin   [PATCH] inotify: ...
951
  	fsnotify_d_instantiate(entry, inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
952
953
954
955
956
957
958
959
960
961
962
  	spin_unlock(&dcache_lock);
  	security_d_instantiate(entry, inode);
  }
  
  /**
   * d_instantiate_unique - instantiate a non-aliased dentry
   * @entry: dentry to instantiate
   * @inode: inode to attach to this dentry
   *
   * Fill in inode information in the entry. On success, it returns NULL.
   * If an unhashed alias of "entry" already exists, then we return the
e866cfa93   Oleg Drokin   [PATCH] d_instant...
963
   * aliased dentry instead and drop one reference to inode.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
964
965
966
   *
   * Note that in order to avoid conflicts with rename() etc, the caller
   * had better be holding the parent directory semaphore.
e866cfa93   Oleg Drokin   [PATCH] d_instant...
967
968
969
970
   *
   * This also assumes that the inode count has been incremented
   * (or otherwise set) by the caller to indicate that it is now
   * in use by the dcache.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
971
   */
770bfad84   David Howells   NFS: Add dentry m...
972
973
  static struct dentry *__d_instantiate_unique(struct dentry *entry,
  					     struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
974
975
976
977
978
  {
  	struct dentry *alias;
  	int len = entry->d_name.len;
  	const char *name = entry->d_name.name;
  	unsigned int hash = entry->d_name.hash;
770bfad84   David Howells   NFS: Add dentry m...
979
980
981
982
  	if (!inode) {
  		entry->d_inode = NULL;
  		return NULL;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
983
984
985
986
987
988
989
990
991
992
993
994
  	list_for_each_entry(alias, &inode->i_dentry, d_alias) {
  		struct qstr *qstr = &alias->d_name;
  
  		if (qstr->hash != hash)
  			continue;
  		if (alias->d_parent != entry->d_parent)
  			continue;
  		if (qstr->len != len)
  			continue;
  		if (memcmp(qstr->name, name, len))
  			continue;
  		dget_locked(alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
995
996
  		return alias;
  	}
770bfad84   David Howells   NFS: Add dentry m...
997

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
998
  	list_add(&entry->d_alias, &inode->i_dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
999
  	entry->d_inode = inode;
c32ccd87b   Nick Piggin   [PATCH] inotify: ...
1000
  	fsnotify_d_instantiate(entry, inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1001
1002
  	return NULL;
  }
770bfad84   David Howells   NFS: Add dentry m...
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
  
  struct dentry *d_instantiate_unique(struct dentry *entry, struct inode *inode)
  {
  	struct dentry *result;
  
  	BUG_ON(!list_empty(&entry->d_alias));
  
  	spin_lock(&dcache_lock);
  	result = __d_instantiate_unique(entry, inode);
  	spin_unlock(&dcache_lock);
  
  	if (!result) {
  		security_d_instantiate(entry, inode);
  		return NULL;
  	}
  
  	BUG_ON(!d_unhashed(result));
  	iput(inode);
  	return result;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
  EXPORT_SYMBOL(d_instantiate_unique);
  
  /**
   * d_alloc_root - allocate root dentry
   * @root_inode: inode to allocate the root for
   *
   * Allocate a root ("/") dentry for the inode given. The inode is
   * instantiated and returned. %NULL is returned if there is insufficient
   * memory or the inode passed is %NULL.
   */
   
  struct dentry * d_alloc_root(struct inode * root_inode)
  {
  	struct dentry *res = NULL;
  
  	if (root_inode) {
  		static const struct qstr name = { .name = "/", .len = 1 };
  
  		res = d_alloc(NULL, &name);
  		if (res) {
  			res->d_sb = root_inode->i_sb;
  			res->d_parent = res;
  			d_instantiate(res, root_inode);
  		}
  	}
  	return res;
  }
  
  static inline struct hlist_head *d_hash(struct dentry *parent,
  					unsigned long hash)
  {
  	hash += ((unsigned long) parent ^ GOLDEN_RATIO_PRIME) / L1_CACHE_BYTES;
  	hash = hash ^ ((hash ^ GOLDEN_RATIO_PRIME) >> D_HASHBITS);
  	return dentry_hashtable + (hash & D_HASHMASK);
  }
  
  /**
   * d_alloc_anon - allocate an anonymous dentry
   * @inode: inode to allocate the dentry for
   *
   * This is similar to d_alloc_root.  It is used by filesystems when
   * creating a dentry for a given inode, often in the process of 
   * mapping a filehandle to a dentry.  The returned dentry may be
   * anonymous, or may have a full name (if the inode was already
   * in the cache).  The file system may need to make further
   * efforts to connect this dentry into the dcache properly.
   *
   * When called on a directory inode, we must ensure that
   * the inode only ever has one dentry.  If a dentry is
   * found, that is returned instead of allocating a new one.
   *
   * On successful return, the reference to the inode has been transferred
   * to the dentry.  If %NULL is returned (indicating kmalloc failure),
   * the reference on the inode has not been released.
   */
  
  struct dentry * d_alloc_anon(struct inode *inode)
  {
  	static const struct qstr anonstring = { .name = "" };
  	struct dentry *tmp;
  	struct dentry *res;
  
  	if ((res = d_find_alias(inode))) {
  		iput(inode);
  		return res;
  	}
  
  	tmp = d_alloc(NULL, &anonstring);
  	if (!tmp)
  		return NULL;
  
  	tmp->d_parent = tmp; /* make sure dput doesn't croak */
  	
  	spin_lock(&dcache_lock);
  	res = __d_find_alias(inode, 0);
  	if (!res) {
  		/* attach a disconnected dentry */
  		res = tmp;
  		tmp = NULL;
  		spin_lock(&res->d_lock);
  		res->d_sb = inode->i_sb;
  		res->d_parent = res;
  		res->d_inode = inode;
  		res->d_flags |= DCACHE_DISCONNECTED;
  		res->d_flags &= ~DCACHE_UNHASHED;
  		list_add(&res->d_alias, &inode->i_dentry);
  		hlist_add_head(&res->d_hash, &inode->i_sb->s_anon);
  		spin_unlock(&res->d_lock);
  
  		inode = NULL; /* don't drop reference */
  	}
  	spin_unlock(&dcache_lock);
  
  	if (inode)
  		iput(inode);
  	if (tmp)
  		dput(tmp);
  	return res;
  }
  
  
  /**
   * d_splice_alias - splice a disconnected dentry into the tree if one exists
   * @inode:  the inode which may have a disconnected dentry
   * @dentry: a negative dentry which we want to point to the inode.
   *
   * If inode is a directory and has a 'disconnected' dentry (i.e. IS_ROOT and
   * DCACHE_DISCONNECTED), then d_move that in place of the given dentry
   * and return it, else simply d_add the inode to the dentry and return NULL.
   *
   * This is needed in the lookup routine of any filesystem that is exportable
   * (via knfsd) so that we can build dcache paths to directories effectively.
   *
   * If a dentry was found and moved, then it is returned.  Otherwise NULL
   * is returned.  This matches the expected return value of ->lookup.
   *
   */
  struct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry)
  {
  	struct dentry *new = NULL;
21c0d8fdd   NeilBrown   [PATCH] knfsd: cl...
1143
  	if (inode && S_ISDIR(inode->i_mode)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1144
1145
1146
1147
  		spin_lock(&dcache_lock);
  		new = __d_find_alias(inode, 1);
  		if (new) {
  			BUG_ON(!(new->d_flags & DCACHE_DISCONNECTED));
c32ccd87b   Nick Piggin   [PATCH] inotify: ...
1148
  			fsnotify_d_instantiate(new, inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1149
1150
1151
1152
1153
1154
1155
1156
1157
  			spin_unlock(&dcache_lock);
  			security_d_instantiate(new, inode);
  			d_rehash(dentry);
  			d_move(new, dentry);
  			iput(inode);
  		} else {
  			/* d_instantiate takes dcache_lock, so we do it by hand */
  			list_add(&dentry->d_alias, &inode->i_dentry);
  			dentry->d_inode = inode;
c32ccd87b   Nick Piggin   [PATCH] inotify: ...
1158
  			fsnotify_d_instantiate(dentry, inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
  			spin_unlock(&dcache_lock);
  			security_d_instantiate(dentry, inode);
  			d_rehash(dentry);
  		}
  	} else
  		d_add(dentry, inode);
  	return new;
  }
  
  
  /**
   * d_lookup - search for a dentry
   * @parent: parent dentry
   * @name: qstr of name we wish to find
   *
   * Searches the children of the parent dentry for the name in question. If
   * the dentry is found its reference count is incremented and the dentry
   * is returned. The caller must use d_put to free the entry when it has
   * finished using it. %NULL is returned on failure.
   *
   * __d_lookup is dcache_lock free. The hash list is protected using RCU.
   * Memory barriers are used while updating and doing lockless traversal. 
   * To avoid races with d_move while rename is happening, d_lock is used.
   *
   * Overflows in memcmp(), while d_move, are avoided by keeping the length
   * and name pointer in one structure pointed by d_qstr.
   *
   * rcu_read_lock() and rcu_read_unlock() are used to disable preemption while
   * lookup is going on.
   *
   * dentry_unused list is not updated even if lookup finds the required dentry
   * in there. It is updated in places such as prune_dcache, shrink_dcache_sb,
   * select_parent and __dget_locked. This laziness saves lookup from dcache_lock
   * acquisition.
   *
   * d_lookup() is protected against the concurrent renames in some unrelated
   * directory using the seqlockt_t rename_lock.
   */
  
  struct dentry * d_lookup(struct dentry * parent, struct qstr * name)
  {
  	struct dentry * dentry = NULL;
  	unsigned long seq;
  
          do {
                  seq = read_seqbegin(&rename_lock);
                  dentry = __d_lookup(parent, name);
                  if (dentry)
  			break;
  	} while (read_seqretry(&rename_lock, seq));
  	return dentry;
  }
  
  struct dentry * __d_lookup(struct dentry * parent, struct qstr * name)
  {
  	unsigned int len = name->len;
  	unsigned int hash = name->hash;
  	const unsigned char *str = name->name;
  	struct hlist_head *head = d_hash(parent,hash);
  	struct dentry *found = NULL;
  	struct hlist_node *node;
665a7583f   Paul E. McKenney   [PATCH] Remove hl...
1220
  	struct dentry *dentry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1221
1222
1223
  
  	rcu_read_lock();
  	
665a7583f   Paul E. McKenney   [PATCH] Remove hl...
1224
  	hlist_for_each_entry_rcu(dentry, node, head, d_hash) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1225
  		struct qstr *qstr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
  		if (dentry->d_name.hash != hash)
  			continue;
  		if (dentry->d_parent != parent)
  			continue;
  
  		spin_lock(&dentry->d_lock);
  
  		/*
  		 * Recheck the dentry after taking the lock - d_move may have
  		 * changed things.  Don't bother checking the hash because we're
  		 * about to compare the whole name anyway.
  		 */
  		if (dentry->d_parent != parent)
  			goto next;
  
  		/*
  		 * It is safe to compare names since d_move() cannot
  		 * change the qstr (protected by d_lock).
  		 */
  		qstr = &dentry->d_name;
  		if (parent->d_op && parent->d_op->d_compare) {
  			if (parent->d_op->d_compare(parent, qstr, name))
  				goto next;
  		} else {
  			if (qstr->len != len)
  				goto next;
  			if (memcmp(qstr->name, str, len))
  				goto next;
  		}
  
  		if (!d_unhashed(dentry)) {
  			atomic_inc(&dentry->d_count);
  			found = dentry;
  		}
  		spin_unlock(&dentry->d_lock);
  		break;
  next:
  		spin_unlock(&dentry->d_lock);
   	}
   	rcu_read_unlock();
  
   	return found;
  }
  
  /**
3e7e241f8   Eric W. Biederman   [PATCH] dcache: A...
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
   * d_hash_and_lookup - hash the qstr then search for a dentry
   * @dir: Directory to search in
   * @name: qstr of name we wish to find
   *
   * On hash failure or on lookup failure NULL is returned.
   */
  struct dentry *d_hash_and_lookup(struct dentry *dir, struct qstr *name)
  {
  	struct dentry *dentry = NULL;
  
  	/*
  	 * Check for a fs-specific hash function. Note that we must
  	 * calculate the standard hash first, as the d_op->d_hash()
  	 * routine may choose to leave the hash value unchanged.
  	 */
  	name->hash = full_name_hash(name->name, name->len);
  	if (dir->d_op && dir->d_op->d_hash) {
  		if (dir->d_op->d_hash(dir, name) < 0)
  			goto out;
  	}
  	dentry = d_lookup(dir, name);
  out:
  	return dentry;
  }
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
   * d_validate - verify dentry provided from insecure source
   * @dentry: The dentry alleged to be valid child of @dparent
   * @dparent: The parent dentry (known to be valid)
   * @hash: Hash of the dentry
   * @len: Length of the name
   *
   * An insecure source has sent us a dentry, here we verify it and dget() it.
   * This is used by ncpfs in its readdir implementation.
   * Zero is returned in the dentry is invalid.
   */
   
  int d_validate(struct dentry *dentry, struct dentry *dparent)
  {
  	struct hlist_head *base;
  	struct hlist_node *lhp;
  
  	/* Check whether the ptr might be valid at all.. */
  	if (!kmem_ptr_validate(dentry_cache, dentry))
  		goto out;
  
  	if (dentry->d_parent != dparent)
  		goto out;
  
  	spin_lock(&dcache_lock);
  	base = d_hash(dparent, dentry->d_name.hash);
  	hlist_for_each(lhp,base) { 
665a7583f   Paul E. McKenney   [PATCH] Remove hl...
1323
  		/* hlist_for_each_entry_rcu() not required for d_hash list
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
  		 * as it is parsed under dcache_lock
  		 */
  		if (dentry == hlist_entry(lhp, struct dentry, d_hash)) {
  			__dget_locked(dentry);
  			spin_unlock(&dcache_lock);
  			return 1;
  		}
  	}
  	spin_unlock(&dcache_lock);
  out:
  	return 0;
  }
  
  /*
   * When a file is deleted, we have two options:
   * - turn this dentry into a negative dentry
   * - unhash this dentry and free it.
   *
   * Usually, we want to just turn this into
   * a negative dentry, but if anybody else is
   * currently using the dentry or the inode
   * we can't do that and we fall back on removing
   * it from the hash queues and waiting for
   * it to be deleted later when it has no users
   */
   
  /**
   * d_delete - delete a dentry
   * @dentry: The dentry to delete
   *
   * Turn the dentry into a negative dentry if possible, otherwise
   * remove it from the hash queues so it can be deleted later
   */
   
  void d_delete(struct dentry * dentry)
  {
7a91bf7f5   John McCutchan   [PATCH] fsnotify_...
1360
  	int isdir = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1361
1362
1363
1364
1365
  	/*
  	 * Are we the only user?
  	 */
  	spin_lock(&dcache_lock);
  	spin_lock(&dentry->d_lock);
7a91bf7f5   John McCutchan   [PATCH] fsnotify_...
1366
  	isdir = S_ISDIR(dentry->d_inode->i_mode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1367
1368
  	if (atomic_read(&dentry->d_count) == 1) {
  		dentry_iput(dentry);
7a91bf7f5   John McCutchan   [PATCH] fsnotify_...
1369
  		fsnotify_nameremove(dentry, isdir);
7a2bd3f7e   Amy Griffis   [PATCH] inotify: ...
1370
1371
1372
  
  		/* remove this and other inotify debug checks after 2.6.18 */
  		dentry->d_flags &= ~DCACHE_INOTIFY_PARENT_WATCHED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1373
1374
1375
1376
1377
1378
1379
1380
  		return;
  	}
  
  	if (!d_unhashed(dentry))
  		__d_drop(dentry);
  
  	spin_unlock(&dentry->d_lock);
  	spin_unlock(&dcache_lock);
7a91bf7f5   John McCutchan   [PATCH] fsnotify_...
1381
1382
  
  	fsnotify_nameremove(dentry, isdir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1383
1384
1385
1386
1387
1388
1389
1390
  }
  
  static void __d_rehash(struct dentry * entry, struct hlist_head *list)
  {
  
   	entry->d_flags &= ~DCACHE_UNHASHED;
   	hlist_add_head_rcu(&entry->d_hash, list);
  }
770bfad84   David Howells   NFS: Add dentry m...
1391
1392
1393
1394
  static void _d_rehash(struct dentry * entry)
  {
  	__d_rehash(entry, d_hash(entry->d_parent, entry->d_name.hash));
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1395
1396
1397
1398
1399
1400
1401
1402
1403
  /**
   * d_rehash	- add an entry back to the hash
   * @entry: dentry to add to the hash
   *
   * Adds a dentry to the hash according to its name.
   */
   
  void d_rehash(struct dentry * entry)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1404
1405
  	spin_lock(&dcache_lock);
  	spin_lock(&entry->d_lock);
770bfad84   David Howells   NFS: Add dentry m...
1406
  	_d_rehash(entry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
  	spin_unlock(&entry->d_lock);
  	spin_unlock(&dcache_lock);
  }
  
  #define do_switch(x,y) do { \
  	__typeof__ (x) __tmp = x; \
  	x = y; y = __tmp; } while (0)
  
  /*
   * When switching names, the actual string doesn't strictly have to
   * be preserved in the target - because we're dropping the target
   * anyway. As such, we can just do a simple memcpy() to copy over
   * the new name before we switch.
   *
   * Note that we have to be a lot more careful about getting the hash
   * switched - we have to switch the hash value properly even if it
   * then no longer matches the actual (corrupted) string of the target.
   * The hash value has to match the hash queue that the dentry is on..
   */
  static void switch_names(struct dentry *dentry, struct dentry *target)
  {
  	if (dname_external(target)) {
  		if (dname_external(dentry)) {
  			/*
  			 * Both external: swap the pointers
  			 */
  			do_switch(target->d_name.name, dentry->d_name.name);
  		} else {
  			/*
  			 * dentry:internal, target:external.  Steal target's
  			 * storage and make target internal.
  			 */
  			dentry->d_name.name = target->d_name.name;
  			target->d_name.name = target->d_iname;
  		}
  	} else {
  		if (dname_external(dentry)) {
  			/*
  			 * dentry:external, target:internal.  Give dentry's
  			 * storage to target and make dentry internal
  			 */
  			memcpy(dentry->d_iname, target->d_name.name,
  					target->d_name.len + 1);
  			target->d_name.name = dentry->d_name.name;
  			dentry->d_name.name = dentry->d_iname;
  		} else {
  			/*
  			 * Both are internal.  Just copy target to dentry
  			 */
  			memcpy(dentry->d_iname, target->d_name.name,
  					target->d_name.len + 1);
  		}
  	}
  }
  
  /*
   * We cannibalize "target" when moving dentry on top of it,
   * because it's going to be thrown away anyway. We could be more
   * polite about it, though.
   *
   * This forceful removal will result in ugly /proc output if
   * somebody holds a file open that got deleted due to a rename.
   * We could be nicer about the deleted file, and let it show
   * up under the name it got deleted rather than the name that
   * deleted it.
   */
   
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1474
1475
  /*
   * d_move_locked - move a dentry
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1476
1477
1478
1479
1480
1481
   * @dentry: entry to move
   * @target: new dentry
   *
   * Update the dcache to reflect the move of a file name. Negative
   * dcache entries should not be moved in this way.
   */
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1482
  static void d_move_locked(struct dentry * dentry, struct dentry * target)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1483
1484
1485
1486
1487
1488
  {
  	struct hlist_head *list;
  
  	if (!dentry->d_inode)
  		printk(KERN_WARNING "VFS: moving negative dcache entry
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1489
1490
1491
1492
1493
1494
  	write_seqlock(&rename_lock);
  	/*
  	 * XXXX: do we really need to take target->d_lock?
  	 */
  	if (target < dentry) {
  		spin_lock(&target->d_lock);
a90b9c05d   Ingo Molnar   [PATCH] lockdep: ...
1495
  		spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1496
1497
  	} else {
  		spin_lock(&dentry->d_lock);
a90b9c05d   Ingo Molnar   [PATCH] lockdep: ...
1498
  		spin_lock_nested(&target->d_lock, DENTRY_D_LOCK_NESTED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
  	}
  
  	/* Move the dentry to the target hash queue, if on different bucket */
  	if (dentry->d_flags & DCACHE_UNHASHED)
  		goto already_unhashed;
  
  	hlist_del_rcu(&dentry->d_hash);
  
  already_unhashed:
  	list = d_hash(target->d_parent, target->d_name.hash);
  	__d_rehash(dentry, list);
  
  	/* Unhash the target: dput() will then get rid of it */
  	__d_drop(target);
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
1513
1514
  	list_del(&dentry->d_u.d_child);
  	list_del(&target->d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
  
  	/* Switch the names.. */
  	switch_names(dentry, target);
  	do_switch(dentry->d_name.len, target->d_name.len);
  	do_switch(dentry->d_name.hash, target->d_name.hash);
  
  	/* ... and switch the parents */
  	if (IS_ROOT(dentry)) {
  		dentry->d_parent = target->d_parent;
  		target->d_parent = target;
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
1525
  		INIT_LIST_HEAD(&target->d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1526
1527
1528
1529
  	} else {
  		do_switch(dentry->d_parent, target->d_parent);
  
  		/* And add them back to the (new) parent lists */
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
1530
  		list_add(&target->d_u.d_child, &target->d_parent->d_subdirs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1531
  	}
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
1532
  	list_add(&dentry->d_u.d_child, &dentry->d_parent->d_subdirs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1533
  	spin_unlock(&target->d_lock);
c32ccd87b   Nick Piggin   [PATCH] inotify: ...
1534
  	fsnotify_d_move(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1535
1536
  	spin_unlock(&dentry->d_lock);
  	write_sequnlock(&rename_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
  }
  
  /**
   * d_move - move a dentry
   * @dentry: entry to move
   * @target: new dentry
   *
   * Update the dcache to reflect the move of a file name. Negative
   * dcache entries should not be moved in this way.
   */
  
  void d_move(struct dentry * dentry, struct dentry * target)
  {
  	spin_lock(&dcache_lock);
  	d_move_locked(dentry, target);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1552
1553
  	spin_unlock(&dcache_lock);
  }
770bfad84   David Howells   NFS: Add dentry m...
1554
  /*
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
   * Helper that returns 1 if p1 is a parent of p2, else 0
   */
  static int d_isparent(struct dentry *p1, struct dentry *p2)
  {
  	struct dentry *p;
  
  	for (p = p2; p->d_parent != p; p = p->d_parent) {
  		if (p->d_parent == p1)
  			return 1;
  	}
  	return 0;
  }
  
  /*
   * This helper attempts to cope with remotely renamed directories
   *
   * It assumes that the caller is already holding
   * dentry->d_parent->d_inode->i_mutex and the dcache_lock
   *
   * Note: If ever the locking in lock_rename() changes, then please
   * remember to update this too...
   *
   * On return, dcache_lock will have been unlocked.
   */
  static struct dentry *__d_unalias(struct dentry *dentry, struct dentry *alias)
  {
  	struct mutex *m1 = NULL, *m2 = NULL;
  	struct dentry *ret;
  
  	/* If alias and dentry share a parent, then no extra locks required */
  	if (alias->d_parent == dentry->d_parent)
  		goto out_unalias;
  
  	/* Check for loops */
  	ret = ERR_PTR(-ELOOP);
  	if (d_isparent(alias, dentry))
  		goto out_err;
  
  	/* See lock_rename() */
  	ret = ERR_PTR(-EBUSY);
  	if (!mutex_trylock(&dentry->d_sb->s_vfs_rename_mutex))
  		goto out_err;
  	m1 = &dentry->d_sb->s_vfs_rename_mutex;
  	if (!mutex_trylock(&alias->d_parent->d_inode->i_mutex))
  		goto out_err;
  	m2 = &alias->d_parent->d_inode->i_mutex;
  out_unalias:
  	d_move_locked(alias, dentry);
  	ret = alias;
  out_err:
  	spin_unlock(&dcache_lock);
  	if (m2)
  		mutex_unlock(m2);
  	if (m1)
  		mutex_unlock(m1);
  	return ret;
  }
  
  /*
770bfad84   David Howells   NFS: Add dentry m...
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
   * Prepare an anonymous dentry for life in the superblock's dentry tree as a
   * named dentry in place of the dentry to be replaced.
   */
  static void __d_materialise_dentry(struct dentry *dentry, struct dentry *anon)
  {
  	struct dentry *dparent, *aparent;
  
  	switch_names(dentry, anon);
  	do_switch(dentry->d_name.len, anon->d_name.len);
  	do_switch(dentry->d_name.hash, anon->d_name.hash);
  
  	dparent = dentry->d_parent;
  	aparent = anon->d_parent;
  
  	dentry->d_parent = (aparent == anon) ? dentry : aparent;
  	list_del(&dentry->d_u.d_child);
  	if (!IS_ROOT(dentry))
  		list_add(&dentry->d_u.d_child, &dentry->d_parent->d_subdirs);
  	else
  		INIT_LIST_HEAD(&dentry->d_u.d_child);
  
  	anon->d_parent = (dparent == dentry) ? anon : dparent;
  	list_del(&anon->d_u.d_child);
  	if (!IS_ROOT(anon))
  		list_add(&anon->d_u.d_child, &anon->d_parent->d_subdirs);
  	else
  		INIT_LIST_HEAD(&anon->d_u.d_child);
  
  	anon->d_flags &= ~DCACHE_DISCONNECTED;
  }
  
  /**
   * d_materialise_unique - introduce an inode into the tree
   * @dentry: candidate dentry
   * @inode: inode to bind to the dentry, to which aliases may be attached
   *
   * Introduces an dentry into the tree, substituting an extant disconnected
   * root directory alias in its place if there is one
   */
  struct dentry *d_materialise_unique(struct dentry *dentry, struct inode *inode)
  {
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1655
  	struct dentry *actual;
770bfad84   David Howells   NFS: Add dentry m...
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
  
  	BUG_ON(!d_unhashed(dentry));
  
  	spin_lock(&dcache_lock);
  
  	if (!inode) {
  		actual = dentry;
  		dentry->d_inode = NULL;
  		goto found_lock;
  	}
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
  	if (S_ISDIR(inode->i_mode)) {
  		struct dentry *alias;
  
  		/* Does an aliased dentry already exist? */
  		alias = __d_find_alias(inode, 0);
  		if (alias) {
  			actual = alias;
  			/* Is this an anonymous mountpoint that we could splice
  			 * into our tree? */
  			if (IS_ROOT(alias)) {
  				spin_lock(&alias->d_lock);
  				__d_materialise_dentry(dentry, alias);
  				__d_drop(alias);
  				goto found;
  			}
  			/* Nope, but we must(!) avoid directory aliasing */
  			actual = __d_unalias(dentry, alias);
  			if (IS_ERR(actual))
  				dput(alias);
  			goto out_nolock;
  		}
770bfad84   David Howells   NFS: Add dentry m...
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
  	}
  
  	/* Add a unique reference */
  	actual = __d_instantiate_unique(dentry, inode);
  	if (!actual)
  		actual = dentry;
  	else if (unlikely(!d_unhashed(actual)))
  		goto shouldnt_be_hashed;
  
  found_lock:
  	spin_lock(&actual->d_lock);
  found:
  	_d_rehash(actual);
  	spin_unlock(&actual->d_lock);
  	spin_unlock(&dcache_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1702
  out_nolock:
770bfad84   David Howells   NFS: Add dentry m...
1703
1704
1705
1706
1707
1708
1709
  	if (actual == dentry) {
  		security_d_instantiate(dentry, inode);
  		return NULL;
  	}
  
  	iput(inode);
  	return actual;
770bfad84   David Howells   NFS: Add dentry m...
1710
1711
1712
1713
1714
  shouldnt_be_hashed:
  	spin_unlock(&dcache_lock);
  	BUG();
  	goto shouldnt_be_hashed;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1715
1716
1717
1718
1719
1720
1721
1722
1723
  /**
   * d_path - return the path of a dentry
   * @dentry: dentry to report
   * @vfsmnt: vfsmnt to which the dentry belongs
   * @root: root dentry
   * @rootmnt: vfsmnt to which the root dentry belongs
   * @buffer: buffer to return value in
   * @buflen: buffer length
   *
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1724
1725
   * Convert a dentry into an ASCII path name. If the entry has been deleted
   * the string " (deleted)" is appended. Note that this is ambiguous.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1726
   *
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1727
1728
1729
   * Returns the buffer or an error code if the path was too long.
   *
   * "buflen" should be positive. Caller holds the dcache_lock.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1730
   */
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1731
1732
1733
  static char * __d_path( struct dentry *dentry, struct vfsmount *vfsmnt,
  			struct dentry *root, struct vfsmount *rootmnt,
  			char *buffer, int buflen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1734
  {
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1735
1736
1737
  	char * end = buffer+buflen;
  	char * retval;
  	int namelen;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1738

552ce544e   Linus Torvalds   Revert "[PATCH] F...
1739
1740
  	*--end = '\0';
  	buflen--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1741
  	if (!IS_ROOT(dentry) && d_unhashed(dentry)) {
eb3dfb0cb   Andreas Gruenbacher   [PATCH] Fix d_pat...
1742
  		buflen -= 10;
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1743
1744
1745
1746
  		end -= 10;
  		if (buflen < 0)
  			goto Elong;
  		memcpy(end, " (deleted)", 10);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1747
  	}
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1748
1749
1750
1751
1752
1753
1754
1755
  
  	if (buflen < 1)
  		goto Elong;
  	/* Get '/' right */
  	retval = end-1;
  	*retval = '/';
  
  	for (;;) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1756
  		struct dentry * parent;
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1757
1758
  		if (dentry == root && vfsmnt == rootmnt)
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1759
  		if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) {
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1760
  			/* Global root? */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
  			spin_lock(&vfsmount_lock);
  			if (vfsmnt->mnt_parent == vfsmnt) {
  				spin_unlock(&vfsmount_lock);
  				goto global_root;
  			}
  			dentry = vfsmnt->mnt_mountpoint;
  			vfsmnt = vfsmnt->mnt_parent;
  			spin_unlock(&vfsmount_lock);
  			continue;
  		}
  		parent = dentry->d_parent;
  		prefetch(parent);
  		namelen = dentry->d_name.len;
eb3dfb0cb   Andreas Gruenbacher   [PATCH] Fix d_pat...
1774
  		buflen -= namelen + 1;
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1775
1776
1777
1778
1779
1780
  		if (buflen < 0)
  			goto Elong;
  		end -= namelen;
  		memcpy(end, dentry->d_name.name, namelen);
  		*--end = '/';
  		retval = end;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1781
1782
  		dentry = parent;
  	}
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1783
  	return retval;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1784
1785
1786
  
  global_root:
  	namelen = dentry->d_name.len;
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1787
1788
  	buflen -= namelen;
  	if (buflen < 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1789
  		goto Elong;
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1790
1791
1792
  	retval -= namelen-1;	/* hit the slash */
  	memcpy(retval, dentry->d_name.name, namelen);
  	return retval;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1793
  Elong:
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1794
  	return ERR_PTR(-ENAMETOOLONG);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1795
1796
1797
  }
  
  /* write full pathname into buffer and return start of pathname */
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1798
1799
  char * d_path(struct dentry *dentry, struct vfsmount *vfsmnt,
  				char *buf, int buflen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1800
1801
1802
1803
1804
1805
1806
1807
1808
  {
  	char *res;
  	struct vfsmount *rootmnt;
  	struct dentry *root;
  
  	read_lock(&current->fs->lock);
  	rootmnt = mntget(current->fs->rootmnt);
  	root = dget(current->fs->root);
  	read_unlock(&current->fs->lock);
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1809
1810
1811
  	spin_lock(&dcache_lock);
  	res = __d_path(dentry, vfsmnt, root, rootmnt, buf, buflen);
  	spin_unlock(&dcache_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
  	dput(root);
  	mntput(rootmnt);
  	return res;
  }
  
  /*
   * NOTE! The user-level library version returns a
   * character pointer. The kernel system call just
   * returns the length of the buffer filled (which
   * includes the ending '\0' character), or a negative
   * error value. So libc would do something like
   *
   *	char *getcwd(char * buf, size_t size)
   *	{
   *		int retval;
   *
   *		retval = sys_getcwd(buf, size);
   *		if (retval >= 0)
   *			return buf;
   *		errno = -retval;
   *		return NULL;
   *	}
   */
  asmlinkage long sys_getcwd(char __user *buf, unsigned long size)
  {
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1837
  	int error;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1838
1839
  	struct vfsmount *pwdmnt, *rootmnt;
  	struct dentry *pwd, *root;
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1840
  	char *page = (char *) __get_free_page(GFP_USER);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
  
  	if (!page)
  		return -ENOMEM;
  
  	read_lock(&current->fs->lock);
  	pwdmnt = mntget(current->fs->pwdmnt);
  	pwd = dget(current->fs->pwd);
  	rootmnt = mntget(current->fs->rootmnt);
  	root = dget(current->fs->root);
  	read_unlock(&current->fs->lock);
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1851
1852
1853
1854
1855
1856
  	error = -ENOENT;
  	/* Has the current directory has been unlinked? */
  	spin_lock(&dcache_lock);
  	if (pwd->d_parent == pwd || !d_unhashed(pwd)) {
  		unsigned long len;
  		char * cwd;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1857

552ce544e   Linus Torvalds   Revert "[PATCH] F...
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
  		cwd = __d_path(pwd, pwdmnt, root, rootmnt, page, PAGE_SIZE);
  		spin_unlock(&dcache_lock);
  
  		error = PTR_ERR(cwd);
  		if (IS_ERR(cwd))
  			goto out;
  
  		error = -ERANGE;
  		len = PAGE_SIZE + page - cwd;
  		if (len <= size) {
  			error = len;
  			if (copy_to_user(buf, cwd, len))
  				error = -EFAULT;
  		}
  	} else
  		spin_unlock(&dcache_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
  
  out:
  	dput(pwd);
  	mntput(pwdmnt);
  	dput(root);
  	mntput(rootmnt);
  	free_page((unsigned long) page);
  	return error;
  }
  
  /*
   * Test whether new_dentry is a subdirectory of old_dentry.
   *
   * Trivially implemented using the dcache structure
   */
  
  /**
   * is_subdir - is new dentry a subdirectory of old_dentry
   * @new_dentry: new dentry
   * @old_dentry: old dentry
   *
   * Returns 1 if new_dentry is a subdirectory of the parent (at any depth).
   * Returns 0 otherwise.
   * Caller must ensure that "new_dentry" is pinned before calling is_subdir()
   */
    
  int is_subdir(struct dentry * new_dentry, struct dentry * old_dentry)
  {
  	int result;
  	struct dentry * saved = new_dentry;
  	unsigned long seq;
  
  	/* need rcu_readlock to protect against the d_parent trashing due to
  	 * d_move
  	 */
  	rcu_read_lock();
          do {
  		/* for restarting inner loop in case of seq retry */
  		new_dentry = saved;
  		result = 0;
  		seq = read_seqbegin(&rename_lock);
  		for (;;) {
  			if (new_dentry != old_dentry) {
  				struct dentry * parent = new_dentry->d_parent;
  				if (parent == new_dentry)
  					break;
  				new_dentry = parent;
  				continue;
  			}
  			result = 1;
  			break;
  		}
  	} while (read_seqretry(&rename_lock, seq));
  	rcu_read_unlock();
  
  	return result;
  }
  
  void d_genocide(struct dentry *root)
  {
  	struct dentry *this_parent = root;
  	struct list_head *next;
  
  	spin_lock(&dcache_lock);
  repeat:
  	next = this_parent->d_subdirs.next;
  resume:
  	while (next != &this_parent->d_subdirs) {
  		struct list_head *tmp = next;
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
1943
  		struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
  		next = tmp->next;
  		if (d_unhashed(dentry)||!dentry->d_inode)
  			continue;
  		if (!list_empty(&dentry->d_subdirs)) {
  			this_parent = dentry;
  			goto repeat;
  		}
  		atomic_dec(&dentry->d_count);
  	}
  	if (this_parent != root) {
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
1954
  		next = this_parent->d_u.d_child.next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
  		atomic_dec(&this_parent->d_count);
  		this_parent = this_parent->d_parent;
  		goto resume;
  	}
  	spin_unlock(&dcache_lock);
  }
  
  /**
   * find_inode_number - check for dentry with name
   * @dir: directory to check
   * @name: Name to find.
   *
   * Check whether a dentry already exists for the given name,
   * and return the inode number if it has an inode. Otherwise
   * 0 is returned.
   *
   * This routine is used to post-process directory listings for
   * filesystems using synthetic inode numbers, and is necessary
   * to keep getcwd() working.
   */
   
  ino_t find_inode_number(struct dentry *dir, struct qstr *name)
  {
  	struct dentry * dentry;
  	ino_t ino = 0;
3e7e241f8   Eric W. Biederman   [PATCH] dcache: A...
1980
1981
  	dentry = d_hash_and_lookup(dir, name);
  	if (dentry) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1982
1983
1984
1985
  		if (dentry->d_inode)
  			ino = dentry->d_inode->i_ino;
  		dput(dentry);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
  	return ino;
  }
  
  static __initdata unsigned long dhash_entries;
  static int __init set_dhash_entries(char *str)
  {
  	if (!str)
  		return 0;
  	dhash_entries = simple_strtoul(str, &str, 0);
  	return 1;
  }
  __setup("dhash_entries=", set_dhash_entries);
  
  static void __init dcache_init_early(void)
  {
  	int loop;
  
  	/* If hashes are distributed across NUMA nodes, defer
  	 * hash allocation until vmalloc space is available.
  	 */
  	if (hashdist)
  		return;
  
  	dentry_hashtable =
  		alloc_large_system_hash("Dentry cache",
  					sizeof(struct hlist_head),
  					dhash_entries,
  					13,
  					HASH_EARLY,
  					&d_hash_shift,
  					&d_hash_mask,
  					0);
  
  	for (loop = 0; loop < (1 << d_hash_shift); loop++)
  		INIT_HLIST_HEAD(&dentry_hashtable[loop]);
  }
  
  static void __init dcache_init(unsigned long mempages)
  {
  	int loop;
  
  	/* 
  	 * A constructor could be added for stable state like the lists,
  	 * but it is probably not worth it because of the cache nature
  	 * of the dcache. 
  	 */
  	dentry_cache = kmem_cache_create("dentry_cache",
  					 sizeof(struct dentry),
  					 0,
b0196009d   Paul Jackson   [PATCH] cpuset me...
2035
2036
  					 (SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|
  					 SLAB_MEM_SPREAD),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
  					 NULL, NULL);
  	
  	set_shrinker(DEFAULT_SEEKS, shrink_dcache_memory);
  
  	/* Hash may have been set up in dcache_init_early */
  	if (!hashdist)
  		return;
  
  	dentry_hashtable =
  		alloc_large_system_hash("Dentry cache",
  					sizeof(struct hlist_head),
  					dhash_entries,
  					13,
  					0,
  					&d_hash_shift,
  					&d_hash_mask,
  					0);
  
  	for (loop = 0; loop < (1 << d_hash_shift); loop++)
  		INIT_HLIST_HEAD(&dentry_hashtable[loop]);
  }
  
  /* SLAB cache for __getname() consumers */
e18b890bb   Christoph Lameter   [PATCH] slab: rem...
2060
  struct kmem_cache *names_cachep __read_mostly;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2061
2062
  
  /* SLAB cache for file structures */
e18b890bb   Christoph Lameter   [PATCH] slab: rem...
2063
  struct kmem_cache *filp_cachep __read_mostly;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2064
2065
  
  EXPORT_SYMBOL(d_genocide);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
  void __init vfs_caches_init_early(void)
  {
  	dcache_init_early();
  	inode_init_early();
  }
  
  void __init vfs_caches_init(unsigned long mempages)
  {
  	unsigned long reserve;
  
  	/* Base hash sizes on available memory, with a reserve equal to
             150% of current kernel size */
  
  	reserve = min((mempages - nr_free_pages()) * 3/2, mempages - 1);
  	mempages -= reserve;
  
  	names_cachep = kmem_cache_create("names_cache", PATH_MAX, 0,
  			SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);
  
  	filp_cachep = kmem_cache_create("filp", sizeof(struct file), 0,
529bf6be5   Dipankar Sarma   [PATCH] fix file ...
2086
  			SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
  
  	dcache_init(mempages);
  	inode_init(mempages);
  	files_init(mempages);
  	mnt_init(mempages);
  	bdev_cache_init();
  	chrdev_init();
  }
  
  EXPORT_SYMBOL(d_alloc);
  EXPORT_SYMBOL(d_alloc_anon);
  EXPORT_SYMBOL(d_alloc_root);
  EXPORT_SYMBOL(d_delete);
  EXPORT_SYMBOL(d_find_alias);
  EXPORT_SYMBOL(d_instantiate);
  EXPORT_SYMBOL(d_invalidate);
  EXPORT_SYMBOL(d_lookup);
  EXPORT_SYMBOL(d_move);
770bfad84   David Howells   NFS: Add dentry m...
2105
  EXPORT_SYMBOL_GPL(d_materialise_unique);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
  EXPORT_SYMBOL(d_path);
  EXPORT_SYMBOL(d_prune_aliases);
  EXPORT_SYMBOL(d_rehash);
  EXPORT_SYMBOL(d_splice_alias);
  EXPORT_SYMBOL(d_validate);
  EXPORT_SYMBOL(dget_locked);
  EXPORT_SYMBOL(dput);
  EXPORT_SYMBOL(find_inode_number);
  EXPORT_SYMBOL(have_submounts);
  EXPORT_SYMBOL(names_cachep);
  EXPORT_SYMBOL(shrink_dcache_parent);
  EXPORT_SYMBOL(shrink_dcache_sb);