Blame view

fs/dcache.c 62.1 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
  #include <linux/slab.h>
  #include <linux/init.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
24
25
26
27
28
29
30
31
32
  #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>
5ad4e53bd   Al Viro   Get rid of indire...
33
  #include <linux/fs_struct.h>
613afbf83   Frederic Weisbecker   sched: Pull up th...
34
  #include <linux/hardirq.h>
07f3f05c1   David Howells   [PATCH] BLOCK: Mo...
35
  #include "internal.h"
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);
74c3cbe33   Al Viro   [PATCH] audit: wa...
41
  __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
  
  /* Statistics gathering. */
  struct dentry_stat_t dentry_stat = {
  	.age_limit = 45,
  };
b3423415f   Eric Dumazet   [PATCH] dcache: a...
66
  static void __d_free(struct dentry *dentry)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67
  {
fd217f4d7   Arjan van de Ven   [PATCH] fs: add a...
68
  	WARN_ON(!list_empty(&dentry->d_alias));
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
  	/* if dentry was never inserted into hash, immediate free is OK */
e8462caa9   Akinobu Mita   fs: use hlist_unh...
87
  	if (hlist_unhashed(&dentry->d_hash))
b3423415f   Eric Dumazet   [PATCH] dcache: a...
88
89
90
  		__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
  }
  
  /*
   * Release the dentry's inode, using the filesystem
   * d_iput() operation if defined.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
   */
858119e15   Arjan van de Ven   [PATCH] Unlinline...
97
  static void dentry_iput(struct dentry * dentry)
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
98
99
  	__releases(dentry->d_lock)
  	__releases(dcache_lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
101
102
103
104
105
106
  {
  	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...
107
108
  		if (!inode->i_nlink)
  			fsnotify_inoderemove(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
109
110
111
112
113
114
115
116
117
  		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);
  	}
  }
da3bbdd46   Kentaro Makita   fix soft lock up ...
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
  /*
   * dentry_lru_(add|add_tail|del|del_init) must be called with dcache_lock held.
   */
  static void dentry_lru_add(struct dentry *dentry)
  {
  	list_add(&dentry->d_lru, &dentry->d_sb->s_dentry_lru);
  	dentry->d_sb->s_nr_dentry_unused++;
  	dentry_stat.nr_unused++;
  }
  
  static void dentry_lru_add_tail(struct dentry *dentry)
  {
  	list_add_tail(&dentry->d_lru, &dentry->d_sb->s_dentry_lru);
  	dentry->d_sb->s_nr_dentry_unused++;
  	dentry_stat.nr_unused++;
  }
  
  static void dentry_lru_del(struct dentry *dentry)
  {
  	if (!list_empty(&dentry->d_lru)) {
  		list_del(&dentry->d_lru);
  		dentry->d_sb->s_nr_dentry_unused--;
  		dentry_stat.nr_unused--;
  	}
  }
  
  static void dentry_lru_del_init(struct dentry *dentry)
  {
  	if (likely(!list_empty(&dentry->d_lru))) {
  		list_del_init(&dentry->d_lru);
  		dentry->d_sb->s_nr_dentry_unused--;
  		dentry_stat.nr_unused--;
  	}
  }
d52b90864   Miklos Szeredi   fix quadratic beh...
152
153
154
155
  /**
   * d_kill - kill dentry and return parent
   * @dentry: dentry to kill
   *
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
156
   * The dentry must already be unhashed and removed from the LRU.
d52b90864   Miklos Szeredi   fix quadratic beh...
157
158
159
160
   *
   * If this is the root of the dentry tree, return NULL.
   */
  static struct dentry *d_kill(struct dentry *dentry)
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
161
162
  	__releases(dentry->d_lock)
  	__releases(dcache_lock)
d52b90864   Miklos Szeredi   fix quadratic beh...
163
164
165
166
167
168
169
  {
  	struct dentry *parent;
  
  	list_del(&dentry->d_u.d_child);
  	dentry_stat.nr_dentry--;	/* For d_free, below */
  	/*drops the locks, at that point nobody can reach this dentry */
  	dentry_iput(dentry);
871c0067d   OGAWA Hirofumi   [PATCH vfs-2.6 1/...
170
171
172
173
  	if (IS_ROOT(dentry))
  		parent = NULL;
  	else
  		parent = dentry->d_parent;
d52b90864   Miklos Szeredi   fix quadratic beh...
174
  	d_free(dentry);
871c0067d   OGAWA Hirofumi   [PATCH vfs-2.6 1/...
175
  	return parent;
d52b90864   Miklos Szeredi   fix quadratic beh...
176
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
177
178
179
180
181
182
183
184
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
229
230
231
232
233
234
235
  /* 
   * 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;
da3bbdd46   Kentaro Makita   fix soft lock up ...
236
  		dentry_lru_add(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
237
238
239
240
241
242
243
    	}
   	spin_unlock(&dentry->d_lock);
  	spin_unlock(&dcache_lock);
  	return;
  
  unhash_it:
  	__d_drop(dentry);
d52b90864   Miklos Szeredi   fix quadratic beh...
244
  kill_it:
da3bbdd46   Kentaro Makita   fix soft lock up ...
245
246
  	/* if dentry was on the d_lru list delete it from there */
  	dentry_lru_del(dentry);
d52b90864   Miklos Szeredi   fix quadratic beh...
247
248
249
  	dentry = d_kill(dentry);
  	if (dentry)
  		goto repeat;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
250
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
251
  EXPORT_SYMBOL(dput);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
296
297
298
299
300
301
302
303
304
305
306
307
308
  
  /**
   * 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;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
309
  EXPORT_SYMBOL(d_invalidate);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
310
311
312
313
314
315
  
  /* This should be called _only_ with dcache_lock held */
  
  static inline struct dentry * __dget_locked(struct dentry *dentry)
  {
  	atomic_inc(&dentry->d_count);
da3bbdd46   Kentaro Makita   fix soft lock up ...
316
  	dentry_lru_del_init(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
317
318
319
320
321
322
323
  	return dentry;
  }
  
  struct dentry * dget_locked(struct dentry *dentry)
  {
  	return __dget_locked(dentry);
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
324
  EXPORT_SYMBOL(dget_locked);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
325
326
327
328
329
330
331
332
333
334
335
336
337
  
  /**
   * 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...
338
   * If the inode has an IS_ROOT, DCACHE_DISCONNECTED alias, then prefer
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
339
   * any other hashed alias over that one unless @want_discon is set,
21c0d8fdd   NeilBrown   [PATCH] knfsd: cl...
340
   * in which case only return an IS_ROOT, DCACHE_DISCONNECTED alias.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
   */
  
  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...
356
357
  			if (IS_ROOT(alias) &&
  			    (alias->d_flags & DCACHE_DISCONNECTED))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
358
359
360
361
362
363
364
365
366
367
368
369
370
371
  				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 ...
372
373
374
375
376
377
378
  	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
379
380
  	return de;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
381
  EXPORT_SYMBOL(d_find_alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
382
383
384
385
386
387
388
  
  /*
   *	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: ...
389
  	struct dentry *dentry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
390
391
  restart:
  	spin_lock(&dcache_lock);
0cdca3f98   Domen Puncer   [PATCH] janitor: ...
392
  	list_for_each_entry(dentry, &inode->i_dentry, d_alias) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
393
394
395
396
397
398
399
400
401
402
403
404
405
  		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);
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
406
  EXPORT_SYMBOL(d_prune_aliases);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
407
408
  
  /*
d702ccb34   Andrew Morton   [PATCH] prune_one...
409
410
411
   * Throw away a dentry - free the inode, dput the parent.  This requires that
   * the LRU list has already been removed.
   *
85864e103   Miklos Szeredi   clean out unused ...
412
413
414
   * Try to prune ancestors as well.  This is necessary to prevent
   * quadratic behavior of shrink_dcache_parent(), but is also expected
   * to be beneficial in reducing dentry cache fragmentation.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
415
   */
85864e103   Miklos Szeredi   clean out unused ...
416
  static void prune_one_dentry(struct dentry * dentry)
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
417
418
419
  	__releases(dentry->d_lock)
  	__releases(dcache_lock)
  	__acquires(dcache_lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
420
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
421
  	__d_drop(dentry);
d52b90864   Miklos Szeredi   fix quadratic beh...
422
  	dentry = d_kill(dentry);
d52b90864   Miklos Szeredi   fix quadratic beh...
423
424
425
426
427
  
  	/*
  	 * Prune ancestors.  Locking is simpler than in dput(),
  	 * because dcache_lock needs to be taken anyway.
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
428
  	spin_lock(&dcache_lock);
d52b90864   Miklos Szeredi   fix quadratic beh...
429
430
431
432
433
434
  	while (dentry) {
  		if (!atomic_dec_and_lock(&dentry->d_count, &dentry->d_lock))
  			return;
  
  		if (dentry->d_op && dentry->d_op->d_delete)
  			dentry->d_op->d_delete(dentry);
da3bbdd46   Kentaro Makita   fix soft lock up ...
435
  		dentry_lru_del_init(dentry);
d52b90864   Miklos Szeredi   fix quadratic beh...
436
437
438
439
  		__d_drop(dentry);
  		dentry = d_kill(dentry);
  		spin_lock(&dcache_lock);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
440
  }
da3bbdd46   Kentaro Makita   fix soft lock up ...
441
442
443
444
445
446
447
  /*
   * Shrink the dentry LRU on a given superblock.
   * @sb   : superblock to shrink dentry LRU.
   * @count: If count is NULL, we prune all dentries on superblock.
   * @flags: If flags is non-zero, we need to do special processing based on
   * which flags are set. This means we don't need to maintain multiple
   * similar copies of this loop.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
448
   */
da3bbdd46   Kentaro Makita   fix soft lock up ...
449
  static void __shrink_dcache_sb(struct super_block *sb, int *count, int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
450
  {
da3bbdd46   Kentaro Makita   fix soft lock up ...
451
452
453
454
  	LIST_HEAD(referenced);
  	LIST_HEAD(tmp);
  	struct dentry *dentry;
  	int cnt = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
455

da3bbdd46   Kentaro Makita   fix soft lock up ...
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
  	BUG_ON(!sb);
  	BUG_ON((flags & DCACHE_REFERENCED) && count == NULL);
  	spin_lock(&dcache_lock);
  	if (count != NULL)
  		/* called from prune_dcache() and shrink_dcache_parent() */
  		cnt = *count;
  restart:
  	if (count == NULL)
  		list_splice_init(&sb->s_dentry_lru, &tmp);
  	else {
  		while (!list_empty(&sb->s_dentry_lru)) {
  			dentry = list_entry(sb->s_dentry_lru.prev,
  					struct dentry, d_lru);
  			BUG_ON(dentry->d_sb != sb);
  
  			spin_lock(&dentry->d_lock);
  			/*
  			 * If we are honouring the DCACHE_REFERENCED flag and
  			 * the dentry has this flag set, don't free it. Clear
  			 * the flag and put it back on the LRU.
0feae5c47   NeilBrown   [PATCH] Fix dcach...
476
  			 */
da3bbdd46   Kentaro Makita   fix soft lock up ...
477
478
479
  			if ((flags & DCACHE_REFERENCED)
  				&& (dentry->d_flags & DCACHE_REFERENCED)) {
  				dentry->d_flags &= ~DCACHE_REFERENCED;
c490d79bb   npiggin@suse.de   fs: dcache fix LR...
480
  				list_move(&dentry->d_lru, &referenced);
da3bbdd46   Kentaro Makita   fix soft lock up ...
481
482
483
484
485
486
487
  				spin_unlock(&dentry->d_lock);
  			} else {
  				list_move_tail(&dentry->d_lru, &tmp);
  				spin_unlock(&dentry->d_lock);
  				cnt--;
  				if (!cnt)
  					break;
0feae5c47   NeilBrown   [PATCH] Fix dcach...
488
  			}
f3c6ba986   Kentaro Makita   vfs: add cond_res...
489
  			cond_resched_lock(&dcache_lock);
0feae5c47   NeilBrown   [PATCH] Fix dcach...
490
  		}
da3bbdd46   Kentaro Makita   fix soft lock up ...
491
492
493
494
495
  	}
  	while (!list_empty(&tmp)) {
  		dentry = list_entry(tmp.prev, struct dentry, d_lru);
  		dentry_lru_del_init(dentry);
  		spin_lock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
496
497
  		/*
  		 * We found an inuse dentry which was not removed from
da3bbdd46   Kentaro Makita   fix soft lock up ...
498
499
  		 * the LRU because of laziness during lookup.  Do not free
  		 * it - just keep it off the LRU list.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
500
  		 */
da3bbdd46   Kentaro Makita   fix soft lock up ...
501
502
  		if (atomic_read(&dentry->d_count)) {
  			spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
503
504
  			continue;
  		}
da3bbdd46   Kentaro Makita   fix soft lock up ...
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
  		prune_one_dentry(dentry);
  		/* dentry->d_lock was dropped in prune_one_dentry() */
  		cond_resched_lock(&dcache_lock);
  	}
  	if (count == NULL && !list_empty(&sb->s_dentry_lru))
  		goto restart;
  	if (count != NULL)
  		*count = cnt;
  	if (!list_empty(&referenced))
  		list_splice(&referenced, &sb->s_dentry_lru);
  	spin_unlock(&dcache_lock);
  }
  
  /**
   * prune_dcache - shrink the dcache
   * @count: number of entries to try to free
   *
   * 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.
   */
  static void prune_dcache(int count)
  {
dca332528   Al Viro   no need for list_...
529
  	struct super_block *sb, *p = NULL;
da3bbdd46   Kentaro Makita   fix soft lock up ...
530
531
532
533
534
535
536
537
  	int w_count;
  	int unused = dentry_stat.nr_unused;
  	int prune_ratio;
  	int pruned;
  
  	if (unused == 0 || count == 0)
  		return;
  	spin_lock(&dcache_lock);
da3bbdd46   Kentaro Makita   fix soft lock up ...
538
539
540
541
542
  	if (count >= unused)
  		prune_ratio = 1;
  	else
  		prune_ratio = unused / count;
  	spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
543
  	list_for_each_entry(sb, &super_blocks, s_list) {
551de6f34   Al Viro   Leave superblocks...
544
545
  		if (list_empty(&sb->s_instances))
  			continue;
da3bbdd46   Kentaro Makita   fix soft lock up ...
546
  		if (sb->s_nr_dentry_unused == 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
547
  			continue;
da3bbdd46   Kentaro Makita   fix soft lock up ...
548
549
550
551
552
553
554
555
556
  		sb->s_count++;
  		/* Now, we reclaim unused dentrins with fairness.
  		 * We reclaim them same percentage from each superblock.
  		 * We calculate number of dentries to scan on this sb
  		 * as follows, but the implementation is arranged to avoid
  		 * overflows:
  		 * number of dentries to scan on this sb =
  		 * count * (number of dentries on this sb /
  		 * number of dentries in the machine)
0feae5c47   NeilBrown   [PATCH] Fix dcach...
557
  		 */
da3bbdd46   Kentaro Makita   fix soft lock up ...
558
559
560
561
562
563
  		spin_unlock(&sb_lock);
  		if (prune_ratio != 1)
  			w_count = (sb->s_nr_dentry_unused / prune_ratio) + 1;
  		else
  			w_count = sb->s_nr_dentry_unused;
  		pruned = w_count;
0feae5c47   NeilBrown   [PATCH] Fix dcach...
564
  		/*
da3bbdd46   Kentaro Makita   fix soft lock up ...
565
566
567
568
569
  		 * 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.
0feae5c47   NeilBrown   [PATCH] Fix dcach...
570
  		 */
da3bbdd46   Kentaro Makita   fix soft lock up ...
571
572
573
574
575
576
577
578
  		if (down_read_trylock(&sb->s_umount)) {
  			if ((sb->s_root != NULL) &&
  			    (!list_empty(&sb->s_dentry_lru))) {
  				spin_unlock(&dcache_lock);
  				__shrink_dcache_sb(sb, &w_count,
  						DCACHE_REFERENCED);
  				pruned -= w_count;
  				spin_lock(&dcache_lock);
0feae5c47   NeilBrown   [PATCH] Fix dcach...
579
  			}
da3bbdd46   Kentaro Makita   fix soft lock up ...
580
  			up_read(&sb->s_umount);
0feae5c47   NeilBrown   [PATCH] Fix dcach...
581
  		}
da3bbdd46   Kentaro Makita   fix soft lock up ...
582
  		spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
583
584
  		if (p)
  			__put_super(p);
da3bbdd46   Kentaro Makita   fix soft lock up ...
585
  		count -= pruned;
dca332528   Al Viro   no need for list_...
586
  		p = sb;
79893c17b   Al Viro   fix prune_dcache(...
587
588
589
  		/* more work left to do? */
  		if (count <= 0)
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
590
  	}
dca332528   Al Viro   no need for list_...
591
592
  	if (p)
  		__put_super(p);
da3bbdd46   Kentaro Makita   fix soft lock up ...
593
  	spin_unlock(&sb_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
594
595
  	spin_unlock(&dcache_lock);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
596
597
598
599
600
601
602
603
  /**
   * 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
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
604
605
  void shrink_dcache_sb(struct super_block * sb)
  {
da3bbdd46   Kentaro Makita   fix soft lock up ...
606
  	__shrink_dcache_sb(sb, NULL, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
607
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
608
  EXPORT_SYMBOL(shrink_dcache_sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
609
610
  
  /*
c636ebdb1   David Howells   [PATCH] VFS: Dest...
611
612
613
614
615
616
617
   * 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 ...
618
  	unsigned detached = 0;
c636ebdb1   David Howells   [PATCH] VFS: Dest...
619
620
621
622
623
  
  	BUG_ON(!IS_ROOT(dentry));
  
  	/* detach this root from the system */
  	spin_lock(&dcache_lock);
da3bbdd46   Kentaro Makita   fix soft lock up ...
624
  	dentry_lru_del_init(dentry);
c636ebdb1   David Howells   [PATCH] VFS: Dest...
625
626
627
628
629
630
631
632
633
634
635
636
637
  	__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) {
da3bbdd46   Kentaro Makita   fix soft lock up ...
638
  				dentry_lru_del_init(loop);
c636ebdb1   David Howells   [PATCH] VFS: Dest...
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
  				__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();
  			}
871c0067d   OGAWA Hirofumi   [PATCH vfs-2.6 1/...
669
  			if (IS_ROOT(dentry))
c636ebdb1   David Howells   [PATCH] VFS: Dest...
670
  				parent = NULL;
871c0067d   OGAWA Hirofumi   [PATCH vfs-2.6 1/...
671
672
  			else {
  				parent = dentry->d_parent;
c636ebdb1   David Howells   [PATCH] VFS: Dest...
673
  				atomic_dec(&parent->d_count);
871c0067d   OGAWA Hirofumi   [PATCH vfs-2.6 1/...
674
  			}
c636ebdb1   David Howells   [PATCH] VFS: Dest...
675
676
  
  			list_del(&dentry->d_u.d_child);
f87135762   David Howells   [PATCH] VFS: Fix ...
677
  			detached++;
c636ebdb1   David Howells   [PATCH] VFS: Dest...
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
  
  			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 ...
695
  				goto out;
c636ebdb1   David Howells   [PATCH] VFS: Dest...
696
697
698
699
700
701
702
703
  
  			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 ...
704
705
706
707
708
  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...
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
  }
  
  /*
   * 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
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
   * 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...
767
  		struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
768
769
770
771
772
773
774
775
776
777
778
779
780
  		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...
781
  		next = this_parent->d_u.d_child.next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
782
783
784
785
786
787
788
789
790
  		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;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
791
  EXPORT_SYMBOL(have_submounts);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
  
  /*
   * 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...
819
  		struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
820
  		next = tmp->next;
da3bbdd46   Kentaro Makita   fix soft lock up ...
821
  		dentry_lru_del_init(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
822
823
824
825
826
  		/* 
  		 * move only zero ref count dentries to the end 
  		 * of the unused list for prune_dcache
  		 */
  		if (!atomic_read(&dentry->d_count)) {
da3bbdd46   Kentaro Makita   fix soft lock up ...
827
  			dentry_lru_add_tail(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
  			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
844
845
846
847
848
849
850
  			goto repeat;
  		}
  	}
  	/*
  	 * All done at this level ... ascend and resume the search.
  	 */
  	if (this_parent != parent) {
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
851
  		next = this_parent->d_u.d_child.next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
852
  		this_parent = this_parent->d_parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
  		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)
  {
da3bbdd46   Kentaro Makita   fix soft lock up ...
869
  	struct super_block *sb = parent->d_sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
870
871
872
  	int found;
  
  	while ((found = select_parent(parent)) != 0)
da3bbdd46   Kentaro Makita   fix soft lock up ...
873
  		__shrink_dcache_sb(sb, &found, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
874
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
875
  EXPORT_SYMBOL(shrink_dcache_parent);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
876

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
877
878
879
880
881
882
883
884
885
886
887
888
  /*
   * 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.
   */
7f8275d0d   Dave Chinner   mm: add context a...
889
  static int shrink_dcache_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
890
891
892
893
  {
  	if (nr) {
  		if (!(gfp_mask & __GFP_FS))
  			return -1;
da3bbdd46   Kentaro Makita   fix soft lock up ...
894
  		prune_dcache(nr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
895
896
897
  	}
  	return (dentry_stat.nr_unused / 100) * sysctl_vfs_cache_pressure;
  }
8e1f936b7   Rusty Russell   mm: clean up and ...
898
899
900
901
  static struct shrinker dcache_shrinker = {
  	.shrink = shrink_dcache_memory,
  	.seeks = DEFAULT_SEEKS,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
902
903
904
905
906
907
908
909
910
911
912
913
914
915
  /**
   * 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;
e12ba74d8   Mel Gorman   Group short-lived...
916
  	dentry = kmem_cache_alloc(dentry_cache, GFP_KERNEL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
  	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;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
945
946
947
948
949
950
951
952
953
  	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...
954
  		INIT_LIST_HEAD(&dentry->d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
955
956
957
958
  	}
  
  	spin_lock(&dcache_lock);
  	if (parent)
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
959
  		list_add(&dentry->d_u.d_child, &parent->d_subdirs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
960
961
962
963
964
  	dentry_stat.nr_dentry++;
  	spin_unlock(&dcache_lock);
  
  	return dentry;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
965
  EXPORT_SYMBOL(d_alloc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
966
967
968
969
970
971
972
973
974
975
  
  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);
  }
ef26ca97e   H Hartley Sweeten   libfs: move EXPOR...
976
  EXPORT_SYMBOL(d_alloc_name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
977

360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
978
979
980
981
982
983
984
985
  /* the caller must hold dcache_lock */
  static void __d_instantiate(struct dentry *dentry, struct inode *inode)
  {
  	if (inode)
  		list_add(&dentry->d_alias, &inode->i_dentry);
  	dentry->d_inode = inode;
  	fsnotify_d_instantiate(dentry, inode);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
  /**
   * 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...
1003
  	BUG_ON(!list_empty(&entry->d_alias));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1004
  	spin_lock(&dcache_lock);
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1005
  	__d_instantiate(entry, inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1006
1007
1008
  	spin_unlock(&dcache_lock);
  	security_d_instantiate(entry, inode);
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1009
  EXPORT_SYMBOL(d_instantiate);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1010
1011
1012
1013
1014
1015
1016
1017
  
  /**
   * 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...
1018
   * aliased dentry instead and drop one reference to inode.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1019
1020
1021
   *
   * 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...
1022
1023
1024
1025
   *
   * 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
1026
   */
770bfad84   David Howells   NFS: Add dentry m...
1027
1028
  static struct dentry *__d_instantiate_unique(struct dentry *entry,
  					     struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1029
1030
1031
1032
1033
  {
  	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...
1034
  	if (!inode) {
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1035
  		__d_instantiate(entry, NULL);
770bfad84   David Howells   NFS: Add dentry m...
1036
1037
  		return NULL;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
  	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
1050
1051
  		return alias;
  	}
770bfad84   David Howells   NFS: Add dentry m...
1052

360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1053
  	__d_instantiate(entry, inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1054
1055
  	return NULL;
  }
770bfad84   David Howells   NFS: Add dentry m...
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
  
  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
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
  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;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1103
  EXPORT_SYMBOL(d_alloc_root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
  
  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);
  }
  
  /**
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
   * d_obtain_alias - find or allocate a dentry for a given inode
   * @inode: inode to allocate the dentry for
   *
   * Obtain a dentry for an inode resulting from NFS filehandle conversion or
   * similar open by handle operations.  The returned dentry may be anonymous,
   * or may have a full name (if the inode was already in the cache).
   *
   * 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
440037287   Christoph Hellwig   [PATCH] switch al...
1126
1127
1128
1129
   * to the dentry.  In case of an error the reference on the inode is released.
   * To make it easier to use in export operations a %NULL or IS_ERR inode may
   * be passed in and will be the error will be propagate to the return value,
   * with a %NULL @inode replaced by ERR_PTR(-ESTALE).
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1130
1131
1132
   */
  struct dentry *d_obtain_alias(struct inode *inode)
  {
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1133
1134
1135
  	static const struct qstr anonstring = { .name = "" };
  	struct dentry *tmp;
  	struct dentry *res;
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1136
1137
  
  	if (!inode)
440037287   Christoph Hellwig   [PATCH] switch al...
1138
  		return ERR_PTR(-ESTALE);
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1139
1140
  	if (IS_ERR(inode))
  		return ERR_CAST(inode);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1141
1142
1143
1144
1145
1146
1147
1148
  	res = d_find_alias(inode);
  	if (res)
  		goto out_iput;
  
  	tmp = d_alloc(NULL, &anonstring);
  	if (!tmp) {
  		res = ERR_PTR(-ENOMEM);
  		goto out_iput;
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1149
  	}
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
  	tmp->d_parent = tmp; /* make sure dput doesn't croak */
  
  	spin_lock(&dcache_lock);
  	res = __d_find_alias(inode, 0);
  	if (res) {
  		spin_unlock(&dcache_lock);
  		dput(tmp);
  		goto out_iput;
  	}
  
  	/* attach a disconnected dentry */
  	spin_lock(&tmp->d_lock);
  	tmp->d_sb = inode->i_sb;
  	tmp->d_inode = inode;
  	tmp->d_flags |= DCACHE_DISCONNECTED;
  	tmp->d_flags &= ~DCACHE_UNHASHED;
  	list_add(&tmp->d_alias, &inode->i_dentry);
  	hlist_add_head(&tmp->d_hash, &inode->i_sb->s_anon);
  	spin_unlock(&tmp->d_lock);
  
  	spin_unlock(&dcache_lock);
  	return tmp;
  
   out_iput:
  	iput(inode);
  	return res;
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1176
  }
adc487204   Benny Halevy   EXPORT_SYMBOL(d_o...
1177
  EXPORT_SYMBOL(d_obtain_alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
  
  /**
   * 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...
1198
  	if (inode && S_ISDIR(inode->i_mode)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1199
1200
1201
1202
1203
1204
  		spin_lock(&dcache_lock);
  		new = __d_find_alias(inode, 1);
  		if (new) {
  			BUG_ON(!(new->d_flags & DCACHE_DISCONNECTED));
  			spin_unlock(&dcache_lock);
  			security_d_instantiate(new, inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1205
1206
1207
  			d_move(new, dentry);
  			iput(inode);
  		} else {
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1208
1209
  			/* already taking dcache_lock, so d_add() by hand */
  			__d_instantiate(dentry, inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1210
1211
1212
1213
1214
1215
1216
1217
  			spin_unlock(&dcache_lock);
  			security_d_instantiate(dentry, inode);
  			d_rehash(dentry);
  		}
  	} else
  		d_add(dentry, inode);
  	return new;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1218
  EXPORT_SYMBOL(d_splice_alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1219

9403540c0   Barry Naujok   dcache: Add case-...
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
  /**
   * d_add_ci - lookup or allocate new dentry with case-exact name
   * @inode:  the inode case-insensitive lookup has found
   * @dentry: the negative dentry that was passed to the parent's lookup func
   * @name:   the case-exact name to be associated with the returned dentry
   *
   * This is to avoid filling the dcache with case-insensitive names to the
   * same inode, only the actual correct case is stored in the dcache for
   * case-insensitive filesystems.
   *
   * For a case-insensitive lookup match and if the the case-exact dentry
   * already exists in in the dcache, use it and return it.
   *
   * If no entry exists with the exact case name, allocate new dentry with
   * the exact case, and return the spliced entry.
   */
e45b590b9   Christoph Hellwig   [PATCH] change d_...
1236
  struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode,
9403540c0   Barry Naujok   dcache: Add case-...
1237
1238
1239
1240
1241
  			struct qstr *name)
  {
  	int error;
  	struct dentry *found;
  	struct dentry *new;
b6520c819   Christoph Hellwig   cleanup d_add_ci
1242
1243
1244
1245
  	/*
  	 * First check if a dentry matching the name already exists,
  	 * if not go ahead and create it now.
  	 */
9403540c0   Barry Naujok   dcache: Add case-...
1246
  	found = d_hash_and_lookup(dentry->d_parent, name);
9403540c0   Barry Naujok   dcache: Add case-...
1247
1248
1249
1250
1251
1252
  	if (!found) {
  		new = d_alloc(dentry->d_parent, name);
  		if (!new) {
  			error = -ENOMEM;
  			goto err_out;
  		}
b6520c819   Christoph Hellwig   cleanup d_add_ci
1253

9403540c0   Barry Naujok   dcache: Add case-...
1254
1255
1256
1257
1258
1259
1260
  		found = d_splice_alias(inode, new);
  		if (found) {
  			dput(new);
  			return found;
  		}
  		return new;
  	}
b6520c819   Christoph Hellwig   cleanup d_add_ci
1261
1262
1263
1264
1265
1266
1267
  
  	/*
  	 * If a matching dentry exists, and it's not negative use it.
  	 *
  	 * Decrement the reference count to balance the iget() done
  	 * earlier on.
  	 */
9403540c0   Barry Naujok   dcache: Add case-...
1268
1269
1270
1271
1272
1273
  	if (found->d_inode) {
  		if (unlikely(found->d_inode != inode)) {
  			/* This can't happen because bad inodes are unhashed. */
  			BUG_ON(!is_bad_inode(inode));
  			BUG_ON(!is_bad_inode(found->d_inode));
  		}
9403540c0   Barry Naujok   dcache: Add case-...
1274
1275
1276
  		iput(inode);
  		return found;
  	}
b6520c819   Christoph Hellwig   cleanup d_add_ci
1277

9403540c0   Barry Naujok   dcache: Add case-...
1278
1279
  	/*
  	 * Negative dentry: instantiate it unless the inode is a directory and
b6520c819   Christoph Hellwig   cleanup d_add_ci
1280
  	 * already has a dentry.
9403540c0   Barry Naujok   dcache: Add case-...
1281
  	 */
9403540c0   Barry Naujok   dcache: Add case-...
1282
  	spin_lock(&dcache_lock);
b6520c819   Christoph Hellwig   cleanup d_add_ci
1283
  	if (!S_ISDIR(inode->i_mode) || list_empty(&inode->i_dentry)) {
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1284
  		__d_instantiate(found, inode);
9403540c0   Barry Naujok   dcache: Add case-...
1285
1286
1287
1288
  		spin_unlock(&dcache_lock);
  		security_d_instantiate(found, inode);
  		return found;
  	}
b6520c819   Christoph Hellwig   cleanup d_add_ci
1289

9403540c0   Barry Naujok   dcache: Add case-...
1290
  	/*
b6520c819   Christoph Hellwig   cleanup d_add_ci
1291
1292
  	 * In case a directory already has a (disconnected) entry grab a
  	 * reference to it, move it in place and use it.
9403540c0   Barry Naujok   dcache: Add case-...
1293
1294
1295
1296
  	 */
  	new = list_entry(inode->i_dentry.next, struct dentry, d_alias);
  	dget_locked(new);
  	spin_unlock(&dcache_lock);
9403540c0   Barry Naujok   dcache: Add case-...
1297
  	security_d_instantiate(found, inode);
9403540c0   Barry Naujok   dcache: Add case-...
1298
  	d_move(new, found);
9403540c0   Barry Naujok   dcache: Add case-...
1299
  	iput(inode);
9403540c0   Barry Naujok   dcache: Add case-...
1300
  	dput(found);
9403540c0   Barry Naujok   dcache: Add case-...
1301
1302
1303
1304
1305
1306
  	return new;
  
  err_out:
  	iput(inode);
  	return ERR_PTR(error);
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1307
  EXPORT_SYMBOL(d_add_ci);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1308
1309
1310
1311
1312
  
  /**
   * d_lookup - search for a dentry
   * @parent: parent dentry
   * @name: qstr of name we wish to find
b04f784e5   Nick Piggin   fs: remove extra ...
1313
   * Returns: dentry, or NULL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1314
   *
b04f784e5   Nick Piggin   fs: remove extra ...
1315
1316
1317
1318
   * d_lookup 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 dput to free the entry when it has
   * finished using it. %NULL is returned if the dentry does not exist.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1319
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
  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;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1333
  EXPORT_SYMBOL(d_lookup);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1334

b04f784e5   Nick Piggin   fs: remove extra ...
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
  /*
   * __d_lookup - search for a dentry (racy)
   * @parent: parent dentry
   * @name: qstr of name we wish to find
   * Returns: dentry, or NULL
   *
   * __d_lookup is like d_lookup, however it may (rarely) return a
   * false-negative result due to unrelated rename activity.
   *
   * __d_lookup is slightly faster by avoiding rename_lock read seqlock,
   * however it must be used carefully, eg. with a following d_lookup in
   * the case of failure.
   *
   * __d_lookup callers must be commented.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1350
1351
1352
1353
1354
1355
1356
1357
  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...
1358
  	struct dentry *dentry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1359

b04f784e5   Nick Piggin   fs: remove extra ...
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
  	/*
  	 * The hash list is protected using RCU.
  	 *
  	 * Take d_lock when comparing a candidate dentry, to avoid races
  	 * with d_move().
  	 *
  	 * It is possible that concurrent renames can mess up our list
  	 * walk here and result in missing our dentry, resulting in the
  	 * false-negative result. d_lookup() protects against concurrent
  	 * renames using rename_lock seqlock.
  	 *
  	 * See Documentation/vfs/dcache-locking.txt for more details.
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1373
1374
  	rcu_read_lock();
  	
665a7583f   Paul E. McKenney   [PATCH] Remove hl...
1375
  	hlist_for_each_entry_rcu(dentry, node, head, d_hash) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1376
  		struct qstr *qstr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1377
1378
1379
1380
1381
1382
1383
1384
1385
  		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
b04f784e5   Nick Piggin   fs: remove extra ...
1386
1387
  		 * changed things. Don't bother checking the hash because
  		 * we're about to compare the whole name anyway.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1388
1389
1390
  		 */
  		if (dentry->d_parent != parent)
  			goto next;
d0185c088   Linus Torvalds   Fix NULL pointer ...
1391
1392
1393
  		/* non-existing due to RCU? */
  		if (d_unhashed(dentry))
  			goto next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
  		/*
  		 * 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;
  		}
d0185c088   Linus Torvalds   Fix NULL pointer ...
1408
1409
  		atomic_inc(&dentry->d_count);
  		found = dentry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
  		spin_unlock(&dentry->d_lock);
  		break;
  next:
  		spin_unlock(&dentry->d_lock);
   	}
   	rcu_read_unlock();
  
   	return found;
  }
  
  /**
3e7e241f8   Eric W. Biederman   [PATCH] dcache: A...
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
   * 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
1447
1448
1449
   * 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)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
   *
   * 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...
1471
  		/* hlist_for_each_entry_rcu() not required for d_hash list
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
  		 * 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;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1484
  EXPORT_SYMBOL(d_validate);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
  
  /*
   * 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_...
1509
  	int isdir = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1510
1511
1512
1513
1514
  	/*
  	 * Are we the only user?
  	 */
  	spin_lock(&dcache_lock);
  	spin_lock(&dentry->d_lock);
7a91bf7f5   John McCutchan   [PATCH] fsnotify_...
1515
  	isdir = S_ISDIR(dentry->d_inode->i_mode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1516
  	if (atomic_read(&dentry->d_count) == 1) {
13e3c5e5b   Al Viro   clean DCACHE_CANT...
1517
  		dentry->d_flags &= ~DCACHE_CANT_MOUNT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1518
  		dentry_iput(dentry);
7a91bf7f5   John McCutchan   [PATCH] fsnotify_...
1519
  		fsnotify_nameremove(dentry, isdir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1520
1521
1522
1523
1524
1525
1526
1527
  		return;
  	}
  
  	if (!d_unhashed(dentry))
  		__d_drop(dentry);
  
  	spin_unlock(&dentry->d_lock);
  	spin_unlock(&dcache_lock);
7a91bf7f5   John McCutchan   [PATCH] fsnotify_...
1528
1529
  
  	fsnotify_nameremove(dentry, isdir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1530
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1531
  EXPORT_SYMBOL(d_delete);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1532
1533
1534
1535
1536
1537
1538
  
  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...
1539
1540
1541
1542
  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
1543
1544
1545
1546
1547
1548
1549
1550
1551
  /**
   * 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
1552
1553
  	spin_lock(&dcache_lock);
  	spin_lock(&entry->d_lock);
770bfad84   David Howells   NFS: Add dentry m...
1554
  	_d_rehash(entry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1555
1556
1557
  	spin_unlock(&entry->d_lock);
  	spin_unlock(&dcache_lock);
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1558
  EXPORT_SYMBOL(d_rehash);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1559

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
  /*
   * 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
  			 */
9a8d5bb4a   Wu Fengguang   generic swap(): d...
1578
  			swap(target->d_name.name, dentry->d_name.name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1579
1580
1581
1582
1583
  		} else {
  			/*
  			 * dentry:internal, target:external.  Steal target's
  			 * storage and make target internal.
  			 */
321bcf921   J. Bruce Fields   dcache: don't exp...
1584
1585
  			memcpy(target->d_iname, dentry->d_name.name,
  					dentry->d_name.len + 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
  			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);
dc711ca35   Al Viro   fix switch_names(...
1605
1606
  			dentry->d_name.len = target->d_name.len;
  			return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1607
1608
  		}
  	}
9a8d5bb4a   Wu Fengguang   generic swap(): d...
1609
  	swap(dentry->d_name.len, target->d_name.len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
  }
  
  /*
   * 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
bc154b1ef   J. Bruce Fields   dcache: trivial c...
1620
1621
   * up under the name it had before it was deleted rather than
   * under the original name of the file that was moved on top of it.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1622
1623
   */
   
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1624
1625
  /*
   * d_move_locked - move a dentry
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1626
1627
1628
1629
1630
1631
   * @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...
1632
  static void d_move_locked(struct dentry * dentry, struct dentry * target)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1633
1634
1635
1636
1637
1638
  {
  	struct hlist_head *list;
  
  	if (!dentry->d_inode)
  		printk(KERN_WARNING "VFS: moving negative dcache entry
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1639
1640
1641
1642
1643
1644
  	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: ...
1645
  		spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1646
1647
  	} else {
  		spin_lock(&dentry->d_lock);
a90b9c05d   Ingo Molnar   [PATCH] lockdep: ...
1648
  		spin_lock_nested(&target->d_lock, DENTRY_D_LOCK_NESTED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1649
1650
1651
  	}
  
  	/* Move the dentry to the target hash queue, if on different bucket */
f77e34987   Denis Cheng   vfs: use the pred...
1652
  	if (d_unhashed(dentry))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
  		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...
1663
1664
  	list_del(&dentry->d_u.d_child);
  	list_del(&target->d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1665
1666
1667
  
  	/* Switch the names.. */
  	switch_names(dentry, target);
9a8d5bb4a   Wu Fengguang   generic swap(): d...
1668
  	swap(dentry->d_name.hash, target->d_name.hash);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1669
1670
1671
1672
1673
  
  	/* ... and switch the parents */
  	if (IS_ROOT(dentry)) {
  		dentry->d_parent = target->d_parent;
  		target->d_parent = target;
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
1674
  		INIT_LIST_HEAD(&target->d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1675
  	} else {
9a8d5bb4a   Wu Fengguang   generic swap(): d...
1676
  		swap(dentry->d_parent, target->d_parent);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1677
1678
  
  		/* And add them back to the (new) parent lists */
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
1679
  		list_add(&target->d_u.d_child, &target->d_parent->d_subdirs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1680
  	}
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
1681
  	list_add(&dentry->d_u.d_child, &dentry->d_parent->d_subdirs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1682
  	spin_unlock(&target->d_lock);
c32ccd87b   Nick Piggin   [PATCH] inotify: ...
1683
  	fsnotify_d_move(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1684
1685
  	spin_unlock(&dentry->d_lock);
  	write_sequnlock(&rename_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
  }
  
  /**
   * 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
1701
1702
  	spin_unlock(&dcache_lock);
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1703
  EXPORT_SYMBOL(d_move);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1704

e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
1705
1706
1707
1708
1709
1710
1711
  /**
   * d_ancestor - search for an ancestor
   * @p1: ancestor dentry
   * @p2: child dentry
   *
   * Returns the ancestor dentry of p2 which is a child of p1, if p1 is
   * an ancestor of p2, else NULL.
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1712
   */
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
1713
  struct dentry *d_ancestor(struct dentry *p1, struct dentry *p2)
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1714
1715
  {
  	struct dentry *p;
871c0067d   OGAWA Hirofumi   [PATCH vfs-2.6 1/...
1716
  	for (p = p2; !IS_ROOT(p); p = p->d_parent) {
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1717
  		if (p->d_parent == p1)
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
1718
  			return p;
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1719
  	}
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
1720
  	return NULL;
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
  }
  
  /*
   * 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...
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1731
1732
   */
  static struct dentry *__d_unalias(struct dentry *dentry, struct dentry *alias)
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
1733
  	__releases(dcache_lock)
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
  {
  	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);
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
1744
  	if (d_ancestor(alias, dentry))
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
  		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...
1768
1769
1770
1771
1772
1773
1774
1775
   * 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);
9a8d5bb4a   Wu Fengguang   generic swap(): d...
1776
  	swap(dentry->d_name.hash, anon->d_name.hash);
770bfad84   David Howells   NFS: Add dentry m...
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
  
  	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...
1808
  	struct dentry *actual;
770bfad84   David Howells   NFS: Add dentry m...
1809
1810
1811
1812
1813
1814
1815
  
  	BUG_ON(!d_unhashed(dentry));
  
  	spin_lock(&dcache_lock);
  
  	if (!inode) {
  		actual = dentry;
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1816
  		__d_instantiate(dentry, NULL);
770bfad84   David Howells   NFS: Add dentry m...
1817
1818
  		goto found_lock;
  	}
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
  	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...
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
  	}
  
  	/* 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...
1855
  out_nolock:
770bfad84   David Howells   NFS: Add dentry m...
1856
1857
1858
1859
1860
1861
1862
  	if (actual == dentry) {
  		security_d_instantiate(dentry, inode);
  		return NULL;
  	}
  
  	iput(inode);
  	return actual;
770bfad84   David Howells   NFS: Add dentry m...
1863
1864
1865
  shouldnt_be_hashed:
  	spin_unlock(&dcache_lock);
  	BUG();
770bfad84   David Howells   NFS: Add dentry m...
1866
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1867
  EXPORT_SYMBOL_GPL(d_materialise_unique);
770bfad84   David Howells   NFS: Add dentry m...
1868

cdd16d026   Miklos Szeredi   [patch 2/3] vfs: ...
1869
  static int prepend(char **buffer, int *buflen, const char *str, int namelen)
6092d0481   Ram Pai   [patch 1/7] vfs: ...
1870
1871
1872
1873
1874
1875
1876
1877
  {
  	*buflen -= namelen;
  	if (*buflen < 0)
  		return -ENAMETOOLONG;
  	*buffer -= namelen;
  	memcpy(*buffer, str, namelen);
  	return 0;
  }
cdd16d026   Miklos Szeredi   [patch 2/3] vfs: ...
1878
1879
1880
1881
  static int prepend_name(char **buffer, int *buflen, struct qstr *name)
  {
  	return prepend(buffer, buflen, name->name, name->len);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1882
  /**
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
1883
1884
   * Prepend path string to a buffer
   *
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
1885
1886
   * @path: the dentry/vfsmount to report
   * @root: root vfsmnt/dentry (may be modified by this function)
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
1887
1888
   * @buffer: pointer to the end of the buffer
   * @buflen: pointer to buffer length
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1889
   *
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
1890
   * Caller holds the dcache_lock.
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
1891
1892
1893
   *
   * If path is not reachable from the supplied root, then the value of
   * root is changed (without modifying refcounts).
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1894
   */
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
1895
1896
  static int prepend_path(const struct path *path, struct path *root,
  			char **buffer, int *buflen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1897
  {
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
1898
1899
  	struct dentry *dentry = path->dentry;
  	struct vfsmount *vfsmnt = path->mnt;
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
1900
1901
  	bool slash = false;
  	int error = 0;
6092d0481   Ram Pai   [patch 1/7] vfs: ...
1902

99b7db7b8   Nick Piggin   fs: brlock vfsmou...
1903
  	br_read_lock(vfsmount_lock);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
1904
  	while (dentry != root->dentry || vfsmnt != root->mnt) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1905
  		struct dentry * parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1906
  		if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) {
552ce544e   Linus Torvalds   Revert "[PATCH] F...
1907
  			/* Global root? */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1908
  			if (vfsmnt->mnt_parent == vfsmnt) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1909
1910
1911
1912
  				goto global_root;
  			}
  			dentry = vfsmnt->mnt_mountpoint;
  			vfsmnt = vfsmnt->mnt_parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1913
1914
1915
1916
  			continue;
  		}
  		parent = dentry->d_parent;
  		prefetch(parent);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
1917
1918
1919
1920
1921
1922
1923
  		error = prepend_name(buffer, buflen, &dentry->d_name);
  		if (!error)
  			error = prepend(buffer, buflen, "/", 1);
  		if (error)
  			break;
  
  		slash = true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1924
1925
  		dentry = parent;
  	}
be285c712   Andreas Gruenbacher   [patch 3/3] vfs: ...
1926
  out:
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
1927
1928
  	if (!error && !slash)
  		error = prepend(buffer, buflen, "/", 1);
99b7db7b8   Nick Piggin   fs: brlock vfsmou...
1929
  	br_read_unlock(vfsmount_lock);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
1930
  	return error;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1931
1932
  
  global_root:
98dc568bc   Miklos Szeredi   vfs: __d_path: do...
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
  	/*
  	 * Filesystems needing to implement special "root names"
  	 * should do so with ->d_dname()
  	 */
  	if (IS_ROOT(dentry) &&
  	    (dentry->d_name.len != 1 || dentry->d_name.name[0] != '/')) {
  		WARN(1, "Root dentry has weird name <%.*s>
  ",
  		     (int) dentry->d_name.len, dentry->d_name.name);
  	}
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
1943
1944
  	root->mnt = vfsmnt;
  	root->dentry = dentry;
be285c712   Andreas Gruenbacher   [patch 3/3] vfs: ...
1945
  	goto out;
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
1946
  }
be285c712   Andreas Gruenbacher   [patch 3/3] vfs: ...
1947

f2eb6575d   Miklos Szeredi   vfs: add prepend_...
1948
1949
1950
1951
  /**
   * __d_path - return the path of a dentry
   * @path: the dentry/vfsmount to report
   * @root: root vfsmnt/dentry (may be modified by this function)
cd956a1c0   Randy Dunlap   fs/dcache: fix fu...
1952
   * @buf: buffer to return value in
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
1953
1954
   * @buflen: buffer length
   *
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
1955
   * Convert a dentry into an ASCII path name.
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
   *
   * Returns a pointer into the buffer or an error code if the
   * path was too long.
   *
   * "buflen" should be positive. Caller holds the dcache_lock.
   *
   * If path is not reachable from the supplied root, then the value of
   * root is changed (without modifying refcounts).
   */
  char *__d_path(const struct path *path, struct path *root,
  	       char *buf, int buflen)
  {
  	char *res = buf + buflen;
  	int error;
  
  	prepend(&res, &buflen, "\0", 1);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
1972
1973
1974
1975
1976
  	error = prepend_path(path, root, &res, &buflen);
  	if (error)
  		return ERR_PTR(error);
  
  	return res;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1977
  }
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
  /*
   * same as __d_path but appends "(deleted)" for unlinked files.
   */
  static int path_with_deleted(const struct path *path, struct path *root,
  				 char **buf, int *buflen)
  {
  	prepend(buf, buflen, "\0", 1);
  	if (d_unlinked(path->dentry)) {
  		int error = prepend(buf, buflen, " (deleted)", 10);
  		if (error)
  			return error;
  	}
  
  	return prepend_path(path, root, buf, buflen);
  }
8df9d1a41   Miklos Szeredi   vfs: show unreach...
1993
1994
1995
1996
  static int prepend_unreachable(char **buffer, int *buflen)
  {
  	return prepend(buffer, buflen, "(unreachable)", 13);
  }
a03a8a709   Jan Blunck   d_path: kerneldoc...
1997
1998
  /**
   * d_path - return the path of a dentry
cf28b4863   Jan Blunck   d_path: Make d_pa...
1999
   * @path: path to report
a03a8a709   Jan Blunck   d_path: kerneldoc...
2000
2001
2002
2003
2004
2005
   * @buf: buffer to return value in
   * @buflen: buffer length
   *
   * Convert a dentry into an ASCII path name. If the entry has been deleted
   * the string " (deleted)" is appended. Note that this is ambiguous.
   *
52afeefb9   Arjan van de Ven   expand some comme...
2006
2007
2008
2009
   * Returns a pointer into the buffer or an error code if the path was
   * too long. Note: Callers should use the returned pointer, not the passed
   * in buffer, to use the name! The implementation often starts at an offset
   * into the buffer, and may leave 0 bytes at the start.
a03a8a709   Jan Blunck   d_path: kerneldoc...
2010
   *
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
2011
   * "buflen" should be positive.
a03a8a709   Jan Blunck   d_path: kerneldoc...
2012
   */
20d4fdc1a   Jan Engelhardt   [patch 2/4] fs: m...
2013
  char *d_path(const struct path *path, char *buf, int buflen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2014
  {
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2015
  	char *res = buf + buflen;
6ac08c39a   Jan Blunck   Use struct path i...
2016
  	struct path root;
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
2017
  	struct path tmp;
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2018
  	int error;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2019

c23fbb6bc   Eric Dumazet   VFS: delay the de...
2020
2021
2022
2023
2024
2025
2026
  	/*
  	 * We have various synthetic filesystems that never get mounted.  On
  	 * these filesystems dentries are never used for lookup purposes, and
  	 * thus don't need to be hashed.  They also don't need a name until a
  	 * user wants to identify the object in /proc/pid/fd/.  The little hack
  	 * below allows us to generate a name for these objects on demand:
  	 */
cf28b4863   Jan Blunck   d_path: Make d_pa...
2027
2028
  	if (path->dentry->d_op && path->dentry->d_op->d_dname)
  		return path->dentry->d_op->d_dname(path->dentry, buf, buflen);
c23fbb6bc   Eric Dumazet   VFS: delay the de...
2029

f7ad3c6be   Miklos Szeredi   vfs: add helpers ...
2030
  	get_fs_root(current->fs, &root);
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2031
  	spin_lock(&dcache_lock);
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
2032
  	tmp = root;
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2033
2034
2035
  	error = path_with_deleted(path, &tmp, &res, &buflen);
  	if (error)
  		res = ERR_PTR(error);
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2036
  	spin_unlock(&dcache_lock);
6ac08c39a   Jan Blunck   Use struct path i...
2037
  	path_put(&root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2038
2039
  	return res;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2040
  EXPORT_SYMBOL(d_path);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2041

8df9d1a41   Miklos Szeredi   vfs: show unreach...
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
  /**
   * d_path_with_unreachable - return the path of a dentry
   * @path: path to report
   * @buf: buffer to return value in
   * @buflen: buffer length
   *
   * The difference from d_path() is that this prepends "(unreachable)"
   * to paths which are unreachable from the current process' root.
   */
  char *d_path_with_unreachable(const struct path *path, char *buf, int buflen)
  {
  	char *res = buf + buflen;
  	struct path root;
  	struct path tmp;
  	int error;
  
  	if (path->dentry->d_op && path->dentry->d_op->d_dname)
  		return path->dentry->d_op->d_dname(path->dentry, buf, buflen);
  
  	get_fs_root(current->fs, &root);
  	spin_lock(&dcache_lock);
  	tmp = root;
  	error = path_with_deleted(path, &tmp, &res, &buflen);
  	if (!error && !path_equal(&tmp, &root))
  		error = prepend_unreachable(&res, &buflen);
  	spin_unlock(&dcache_lock);
  	path_put(&root);
  	if (error)
  		res =  ERR_PTR(error);
  
  	return res;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2074
  /*
c23fbb6bc   Eric Dumazet   VFS: delay the de...
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
   * Helper function for dentry_operations.d_dname() members
   */
  char *dynamic_dname(struct dentry *dentry, char *buffer, int buflen,
  			const char *fmt, ...)
  {
  	va_list args;
  	char temp[64];
  	int sz;
  
  	va_start(args, fmt);
  	sz = vsnprintf(temp, sizeof(temp), fmt, args) + 1;
  	va_end(args);
  
  	if (sz > sizeof(temp) || sz > buflen)
  		return ERR_PTR(-ENAMETOOLONG);
  
  	buffer += buflen - sz;
  	return memcpy(buffer, temp, sz);
  }
  
  /*
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2096
2097
   * Write full pathname from the root of the filesystem into the buffer.
   */
c103135c1   Al Viro   new helper: __den...
2098
  char *__dentry_path(struct dentry *dentry, char *buf, int buflen)
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2099
2100
2101
  {
  	char *end = buf + buflen;
  	char *retval;
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2102
  	prepend(&end, &buflen, "\0", 1);
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2103
2104
2105
2106
2107
  	if (buflen < 1)
  		goto Elong;
  	/* Get '/' right */
  	retval = end-1;
  	*retval = '/';
cdd16d026   Miklos Szeredi   [patch 2/3] vfs: ...
2108
2109
  	while (!IS_ROOT(dentry)) {
  		struct dentry *parent = dentry->d_parent;
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2110

6092d0481   Ram Pai   [patch 1/7] vfs: ...
2111
  		prefetch(parent);
cdd16d026   Miklos Szeredi   [patch 2/3] vfs: ...
2112
  		if ((prepend_name(&end, &buflen, &dentry->d_name) != 0) ||
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2113
2114
2115
2116
2117
2118
  		    (prepend(&end, &buflen, "/", 1) != 0))
  			goto Elong;
  
  		retval = end;
  		dentry = parent;
  	}
c103135c1   Al Viro   new helper: __den...
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
  	return retval;
  Elong:
  	return ERR_PTR(-ENAMETOOLONG);
  }
  EXPORT_SYMBOL(__dentry_path);
  
  char *dentry_path(struct dentry *dentry, char *buf, int buflen)
  {
  	char *p = NULL;
  	char *retval;
  
  	spin_lock(&dcache_lock);
  	if (d_unlinked(dentry)) {
  		p = buf + buflen;
  		if (prepend(&p, &buflen, "//deleted", 10) != 0)
  			goto Elong;
  		buflen++;
  	}
  	retval = __dentry_path(dentry, buf, buflen);
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2138
  	spin_unlock(&dcache_lock);
c103135c1   Al Viro   new helper: __den...
2139
2140
  	if (!IS_ERR(retval) && p)
  		*p = '/';	/* restore '/' overriden with '\0' */
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2141
2142
2143
2144
2145
2146
2147
  	return retval;
  Elong:
  	spin_unlock(&dcache_lock);
  	return ERR_PTR(-ENAMETOOLONG);
  }
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
   * 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;
   *	}
   */
3cdad4288   Heiko Carstens   [CVE-2009-0029] S...
2165
  SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2166
  {
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2167
  	int error;
6ac08c39a   Jan Blunck   Use struct path i...
2168
  	struct path pwd, root;
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2169
  	char *page = (char *) __get_free_page(GFP_USER);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2170
2171
2172
  
  	if (!page)
  		return -ENOMEM;
f7ad3c6be   Miklos Szeredi   vfs: add helpers ...
2173
  	get_fs_root_and_pwd(current->fs, &root, &pwd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2174

552ce544e   Linus Torvalds   Revert "[PATCH] F...
2175
  	error = -ENOENT;
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2176
  	spin_lock(&dcache_lock);
f3da392e9   Alexey Dobriyan   dcache: extrace a...
2177
  	if (!d_unlinked(pwd.dentry)) {
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2178
  		unsigned long len;
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
2179
  		struct path tmp = root;
8df9d1a41   Miklos Szeredi   vfs: show unreach...
2180
2181
  		char *cwd = page + PAGE_SIZE;
  		int buflen = PAGE_SIZE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2182

8df9d1a41   Miklos Szeredi   vfs: show unreach...
2183
2184
  		prepend(&cwd, &buflen, "\0", 1);
  		error = prepend_path(&pwd, &tmp, &cwd, &buflen);
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2185
  		spin_unlock(&dcache_lock);
8df9d1a41   Miklos Szeredi   vfs: show unreach...
2186
  		if (error)
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2187
  			goto out;
8df9d1a41   Miklos Szeredi   vfs: show unreach...
2188
2189
2190
2191
2192
2193
  		/* Unreachable from current root */
  		if (!path_equal(&tmp, &root)) {
  			error = prepend_unreachable(&cwd, &buflen);
  			if (error)
  				goto out;
  		}
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2194
2195
2196
2197
2198
2199
2200
2201
2202
  		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
2203
2204
  
  out:
6ac08c39a   Jan Blunck   Use struct path i...
2205
2206
  	path_put(&pwd);
  	path_put(&root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
  	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()
   */
    
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2227
  int is_subdir(struct dentry *new_dentry, struct dentry *old_dentry)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2228
2229
  {
  	int result;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2230
  	unsigned long seq;
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2231
2232
2233
2234
2235
2236
  	if (new_dentry == old_dentry)
  		return 1;
  
  	/*
  	 * Need rcu_readlock to protect against the d_parent trashing
  	 * due to d_move
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2237
2238
  	 */
  	rcu_read_lock();
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2239
  	do {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2240
  		/* for restarting inner loop in case of seq retry */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2241
  		seq = read_seqbegin(&rename_lock);
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2242
  		if (d_ancestor(old_dentry, new_dentry))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2243
  			result = 1;
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2244
2245
  		else
  			result = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2246
2247
2248
2249
2250
  	} while (read_seqretry(&rename_lock, seq));
  	rcu_read_unlock();
  
  	return result;
  }
2096f759a   Al Viro   New helper: path_...
2251
2252
2253
2254
2255
  int path_is_under(struct path *path1, struct path *path2)
  {
  	struct vfsmount *mnt = path1->mnt;
  	struct dentry *dentry = path1->dentry;
  	int res;
99b7db7b8   Nick Piggin   fs: brlock vfsmou...
2256
2257
  
  	br_read_lock(vfsmount_lock);
2096f759a   Al Viro   New helper: path_...
2258
2259
2260
  	if (mnt != path2->mnt) {
  		for (;;) {
  			if (mnt->mnt_parent == mnt) {
99b7db7b8   Nick Piggin   fs: brlock vfsmou...
2261
  				br_read_unlock(vfsmount_lock);
2096f759a   Al Viro   New helper: path_...
2262
2263
2264
2265
2266
2267
2268
2269
2270
  				return 0;
  			}
  			if (mnt->mnt_parent == path2->mnt)
  				break;
  			mnt = mnt->mnt_parent;
  		}
  		dentry = mnt->mnt_mountpoint;
  	}
  	res = is_subdir(dentry, path2->dentry);
99b7db7b8   Nick Piggin   fs: brlock vfsmou...
2271
  	br_read_unlock(vfsmount_lock);
2096f759a   Al Viro   New helper: path_...
2272
2273
2274
  	return res;
  }
  EXPORT_SYMBOL(path_is_under);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
  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...
2286
  		struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
  		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...
2297
  		next = this_parent->d_u.d_child.next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
  		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...
2323
2324
  	dentry = d_hash_and_lookup(dir, name);
  	if (dentry) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2325
2326
2327
2328
  		if (dentry->d_inode)
  			ino = dentry->d_inode->i_ino;
  		dput(dentry);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2329
2330
  	return ino;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2331
  EXPORT_SYMBOL(find_inode_number);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
  
  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]);
  }
74bf17cff   Denis Cheng   fs: remove the un...
2366
  static void __init dcache_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2367
2368
2369
2370
2371
2372
2373
2374
  {
  	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. 
  	 */
0a31bd5f2   Christoph Lameter   KMEM_CACHE(): sim...
2375
2376
  	dentry_cache = KMEM_CACHE(dentry,
  		SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_MEM_SPREAD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2377
  	
8e1f936b7   Rusty Russell   mm: clean up and ...
2378
  	register_shrinker(&dcache_shrinker);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
  
  	/* 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...
2399
  struct kmem_cache *names_cachep __read_mostly;
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2400
  EXPORT_SYMBOL(names_cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2401

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2402
  EXPORT_SYMBOL(d_genocide);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
  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,
20c2df83d   Paul Mundt   mm: Remove slab d...
2420
  			SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2421

74bf17cff   Denis Cheng   fs: remove the un...
2422
2423
  	dcache_init();
  	inode_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2424
  	files_init(mempages);
74bf17cff   Denis Cheng   fs: remove the un...
2425
  	mnt_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2426
2427
2428
  	bdev_cache_init();
  	chrdev_init();
  }