Blame view

fs/dcache.c 77.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>
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
35
36
  #include <linux/bit_spinlock.h>
  #include <linux/rculist_bl.h>
268bb0ce3   Linus Torvalds   sanitize <linux/p...
37
  #include <linux/prefetch.h>
dd179946d   David Howells   VFS: Log the fact...
38
  #include <linux/ratelimit.h>
07f3f05c1   David Howells   [PATCH] BLOCK: Mo...
39
  #include "internal.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40

789680d1e   Nick Piggin   fs: dcache scale ...
41
42
  /*
   * Usage:
873feea09   Nick Piggin   fs: dcache per-in...
43
44
   * dcache->d_inode->i_lock protects:
   *   - i_dentry, d_alias, d_inode of aliases
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
45
46
47
48
   * dcache_hash_bucket lock protects:
   *   - the dcache hash table
   * s_anon bl list spinlock protects:
   *   - the s_anon list (see __d_drop)
230445078   Nick Piggin   fs: dcache scale lru
49
50
51
52
53
54
   * dcache_lru_lock protects:
   *   - the dcache lru lists and counters
   * d_lock protects:
   *   - d_flags
   *   - d_name
   *   - d_lru
b7ab39f63   Nick Piggin   fs: dcache scale ...
55
   *   - d_count
da5029563   Nick Piggin   fs: dcache scale ...
56
   *   - d_unhashed()
2fd6b7f50   Nick Piggin   fs: dcache scale ...
57
58
   *   - d_parent and d_subdirs
   *   - childrens' d_child and d_parent
b23fb0a60   Nick Piggin   fs: scale inode a...
59
   *   - d_alias, d_inode
789680d1e   Nick Piggin   fs: dcache scale ...
60
61
   *
   * Ordering:
873feea09   Nick Piggin   fs: dcache per-in...
62
   * dentry->d_inode->i_lock
b5c84bf6f   Nick Piggin   fs: dcache remove...
63
64
   *   dentry->d_lock
   *     dcache_lru_lock
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
65
66
   *     dcache_hash_bucket lock
   *     s_anon lock
789680d1e   Nick Piggin   fs: dcache scale ...
67
   *
da5029563   Nick Piggin   fs: dcache scale ...
68
69
70
71
72
73
74
   * If there is an ancestor relationship:
   * dentry->d_parent->...->d_parent->d_lock
   *   ...
   *     dentry->d_parent->d_lock
   *       dentry->d_lock
   *
   * If no ancestor relationship:
789680d1e   Nick Piggin   fs: dcache scale ...
75
76
77
78
   * if (dentry1 < dentry2)
   *   dentry1->d_lock
   *     dentry2->d_lock
   */
fa3536cc1   Eric Dumazet   [PATCH] Use __rea...
79
  int sysctl_vfs_cache_pressure __read_mostly = 100;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
  EXPORT_SYMBOL_GPL(sysctl_vfs_cache_pressure);
230445078   Nick Piggin   fs: dcache scale lru
81
  static __cacheline_aligned_in_smp DEFINE_SPINLOCK(dcache_lru_lock);
74c3cbe33   Al Viro   [PATCH] audit: wa...
82
  __cacheline_aligned_in_smp DEFINE_SEQLOCK(rename_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83

949854d02   Nick Piggin   fs: Use rename lo...
84
  EXPORT_SYMBOL(rename_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85

e18b890bb   Christoph Lameter   [PATCH] slab: rem...
86
  static struct kmem_cache *dentry_cache __read_mostly;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
87

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88
89
90
91
92
93
94
95
96
97
  /*
   * 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...
98
99
  static unsigned int d_hash_mask __read_mostly;
  static unsigned int d_hash_shift __read_mostly;
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
100

b07ad9967   Linus Torvalds   vfs: get rid of '...
101
  static struct hlist_bl_head *dentry_hashtable __read_mostly;
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
102

b07ad9967   Linus Torvalds   vfs: get rid of '...
103
  static inline struct hlist_bl_head *d_hash(struct dentry *parent,
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
104
105
106
107
108
109
  					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);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
111
112
113
  /* Statistics gathering. */
  struct dentry_stat_t dentry_stat = {
  	.age_limit = 45,
  };
3e880fb5e   Nick Piggin   fs: use fast coun...
114
  static DEFINE_PER_CPU(unsigned int, nr_dentry);
312d3ca85   Christoph Hellwig   fs: use percpu co...
115
116
  
  #if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS)
3e880fb5e   Nick Piggin   fs: use fast coun...
117
118
119
120
121
122
123
124
  static int get_nr_dentry(void)
  {
  	int i;
  	int sum = 0;
  	for_each_possible_cpu(i)
  		sum += per_cpu(nr_dentry, i);
  	return sum < 0 ? 0 : sum;
  }
312d3ca85   Christoph Hellwig   fs: use percpu co...
125
126
127
  int proc_nr_dentry(ctl_table *table, int write, void __user *buffer,
  		   size_t *lenp, loff_t *ppos)
  {
3e880fb5e   Nick Piggin   fs: use fast coun...
128
  	dentry_stat.nr_dentry = get_nr_dentry();
312d3ca85   Christoph Hellwig   fs: use percpu co...
129
130
131
  	return proc_dointvec(table, write, buffer, lenp, ppos);
  }
  #endif
9c82ab9c9   Christoph Hellwig   fs: simplify __d_...
132
  static void __d_free(struct rcu_head *head)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133
  {
9c82ab9c9   Christoph Hellwig   fs: simplify __d_...
134
  	struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu);
fd217f4d7   Arjan van de Ven   [PATCH] fs: add a...
135
  	WARN_ON(!list_empty(&dentry->d_alias));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
136
137
138
139
140
141
  	if (dname_external(dentry))
  		kfree(dentry->d_name.name);
  	kmem_cache_free(dentry_cache, dentry); 
  }
  
  /*
b5c84bf6f   Nick Piggin   fs: dcache remove...
142
   * no locks, please.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
143
144
145
   */
  static void d_free(struct dentry *dentry)
  {
b7ab39f63   Nick Piggin   fs: dcache scale ...
146
  	BUG_ON(dentry->d_count);
3e880fb5e   Nick Piggin   fs: use fast coun...
147
  	this_cpu_dec(nr_dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
148
149
  	if (dentry->d_op && dentry->d_op->d_release)
  		dentry->d_op->d_release(dentry);
312d3ca85   Christoph Hellwig   fs: use percpu co...
150

dea3667bc   Linus Torvalds   vfs: get rid of i...
151
152
  	/* if dentry was never visible to RCU, immediate free is OK */
  	if (!(dentry->d_flags & DCACHE_RCUACCESS))
9c82ab9c9   Christoph Hellwig   fs: simplify __d_...
153
  		__d_free(&dentry->d_u.d_rcu);
b3423415f   Eric Dumazet   [PATCH] dcache: a...
154
  	else
9c82ab9c9   Christoph Hellwig   fs: simplify __d_...
155
  		call_rcu(&dentry->d_u.d_rcu, __d_free);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
156
  }
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
157
158
  /**
   * dentry_rcuwalk_barrier - invalidate in-progress rcu-walk lookups
ff5fdb614   Randy Dunlap   fs: fix new dcach...
159
   * @dentry: the target dentry
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
160
161
162
163
164
165
166
167
168
169
   * After this call, in-progress rcu-walk path lookup will fail. This
   * should be called after unhashing, and after changing d_inode (if
   * the dentry has not already been unhashed).
   */
  static inline void dentry_rcuwalk_barrier(struct dentry *dentry)
  {
  	assert_spin_locked(&dentry->d_lock);
  	/* Go through a barrier */
  	write_seqcount_barrier(&dentry->d_seq);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
170
171
  /*
   * Release the dentry's inode, using the filesystem
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
172
173
   * d_iput() operation if defined. Dentry has no refcount
   * and is unhashed.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174
   */
858119e15   Arjan van de Ven   [PATCH] Unlinline...
175
  static void dentry_iput(struct dentry * dentry)
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
176
  	__releases(dentry->d_lock)
873feea09   Nick Piggin   fs: dcache per-in...
177
  	__releases(dentry->d_inode->i_lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
178
179
180
181
182
183
  {
  	struct inode *inode = dentry->d_inode;
  	if (inode) {
  		dentry->d_inode = NULL;
  		list_del_init(&dentry->d_alias);
  		spin_unlock(&dentry->d_lock);
873feea09   Nick Piggin   fs: dcache per-in...
184
  		spin_unlock(&inode->i_lock);
f805fbdaa   Linus Torvalds   Make fsnotify pos...
185
186
  		if (!inode->i_nlink)
  			fsnotify_inoderemove(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
187
188
189
190
191
192
  		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);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
193
194
  	}
  }
da3bbdd46   Kentaro Makita   fix soft lock up ...
195
  /*
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
196
197
198
199
200
   * Release the dentry's inode, using the filesystem
   * d_iput() operation if defined. dentry remains in-use.
   */
  static void dentry_unlink_inode(struct dentry * dentry)
  	__releases(dentry->d_lock)
873feea09   Nick Piggin   fs: dcache per-in...
201
  	__releases(dentry->d_inode->i_lock)
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
202
203
204
205
206
207
  {
  	struct inode *inode = dentry->d_inode;
  	dentry->d_inode = NULL;
  	list_del_init(&dentry->d_alias);
  	dentry_rcuwalk_barrier(dentry);
  	spin_unlock(&dentry->d_lock);
873feea09   Nick Piggin   fs: dcache per-in...
208
  	spin_unlock(&inode->i_lock);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
209
210
211
212
213
214
215
216
217
  	if (!inode->i_nlink)
  		fsnotify_inoderemove(inode);
  	if (dentry->d_op && dentry->d_op->d_iput)
  		dentry->d_op->d_iput(dentry, inode);
  	else
  		iput(inode);
  }
  
  /*
f0023bc61   Sage Weil   vfs: add d_prune ...
218
   * dentry_lru_(add|del|prune|move_tail) must be called with d_lock held.
da3bbdd46   Kentaro Makita   fix soft lock up ...
219
220
221
   */
  static void dentry_lru_add(struct dentry *dentry)
  {
a4633357a   Christoph Hellwig   fs: clean up dent...
222
  	if (list_empty(&dentry->d_lru)) {
230445078   Nick Piggin   fs: dcache scale lru
223
  		spin_lock(&dcache_lru_lock);
a4633357a   Christoph Hellwig   fs: clean up dent...
224
225
  		list_add(&dentry->d_lru, &dentry->d_sb->s_dentry_lru);
  		dentry->d_sb->s_nr_dentry_unused++;
86c8749ed   Nick Piggin   vfs: revert per-c...
226
  		dentry_stat.nr_unused++;
230445078   Nick Piggin   fs: dcache scale lru
227
  		spin_unlock(&dcache_lru_lock);
a4633357a   Christoph Hellwig   fs: clean up dent...
228
  	}
da3bbdd46   Kentaro Makita   fix soft lock up ...
229
  }
230445078   Nick Piggin   fs: dcache scale lru
230
231
232
233
234
235
  static void __dentry_lru_del(struct dentry *dentry)
  {
  	list_del_init(&dentry->d_lru);
  	dentry->d_sb->s_nr_dentry_unused--;
  	dentry_stat.nr_unused--;
  }
f0023bc61   Sage Weil   vfs: add d_prune ...
236
237
238
  /*
   * Remove a dentry with references from the LRU.
   */
da3bbdd46   Kentaro Makita   fix soft lock up ...
239
240
241
  static void dentry_lru_del(struct dentry *dentry)
  {
  	if (!list_empty(&dentry->d_lru)) {
230445078   Nick Piggin   fs: dcache scale lru
242
243
244
  		spin_lock(&dcache_lru_lock);
  		__dentry_lru_del(dentry);
  		spin_unlock(&dcache_lru_lock);
da3bbdd46   Kentaro Makita   fix soft lock up ...
245
246
  	}
  }
f0023bc61   Sage Weil   vfs: add d_prune ...
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
  /*
   * Remove a dentry that is unreferenced and about to be pruned
   * (unhashed and destroyed) from the LRU, and inform the file system.
   * This wrapper should be called _prior_ to unhashing a victim dentry.
   */
  static void dentry_lru_prune(struct dentry *dentry)
  {
  	if (!list_empty(&dentry->d_lru)) {
  		if (dentry->d_flags & DCACHE_OP_PRUNE)
  			dentry->d_op->d_prune(dentry);
  
  		spin_lock(&dcache_lru_lock);
  		__dentry_lru_del(dentry);
  		spin_unlock(&dcache_lru_lock);
  	}
  }
a4633357a   Christoph Hellwig   fs: clean up dent...
263
  static void dentry_lru_move_tail(struct dentry *dentry)
da3bbdd46   Kentaro Makita   fix soft lock up ...
264
  {
230445078   Nick Piggin   fs: dcache scale lru
265
  	spin_lock(&dcache_lru_lock);
a4633357a   Christoph Hellwig   fs: clean up dent...
266
267
268
  	if (list_empty(&dentry->d_lru)) {
  		list_add_tail(&dentry->d_lru, &dentry->d_sb->s_dentry_lru);
  		dentry->d_sb->s_nr_dentry_unused++;
86c8749ed   Nick Piggin   vfs: revert per-c...
269
  		dentry_stat.nr_unused++;
a4633357a   Christoph Hellwig   fs: clean up dent...
270
271
  	} else {
  		list_move_tail(&dentry->d_lru, &dentry->d_sb->s_dentry_lru);
da3bbdd46   Kentaro Makita   fix soft lock up ...
272
  	}
230445078   Nick Piggin   fs: dcache scale lru
273
  	spin_unlock(&dcache_lru_lock);
da3bbdd46   Kentaro Makita   fix soft lock up ...
274
  }
d52b90864   Miklos Szeredi   fix quadratic beh...
275
276
277
  /**
   * d_kill - kill dentry and return parent
   * @dentry: dentry to kill
ff5fdb614   Randy Dunlap   fs: fix new dcach...
278
   * @parent: parent dentry
d52b90864   Miklos Szeredi   fix quadratic beh...
279
   *
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
280
   * The dentry must already be unhashed and removed from the LRU.
d52b90864   Miklos Szeredi   fix quadratic beh...
281
282
   *
   * If this is the root of the dentry tree, return NULL.
230445078   Nick Piggin   fs: dcache scale lru
283
   *
b5c84bf6f   Nick Piggin   fs: dcache remove...
284
285
   * dentry->d_lock and parent->d_lock must be held by caller, and are dropped by
   * d_kill.
d52b90864   Miklos Szeredi   fix quadratic beh...
286
   */
2fd6b7f50   Nick Piggin   fs: dcache scale ...
287
  static struct dentry *d_kill(struct dentry *dentry, struct dentry *parent)
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
288
  	__releases(dentry->d_lock)
2fd6b7f50   Nick Piggin   fs: dcache scale ...
289
  	__releases(parent->d_lock)
873feea09   Nick Piggin   fs: dcache per-in...
290
  	__releases(dentry->d_inode->i_lock)
d52b90864   Miklos Szeredi   fix quadratic beh...
291
  {
d52b90864   Miklos Szeredi   fix quadratic beh...
292
  	list_del(&dentry->d_u.d_child);
c83ce989c   Trond Myklebust   VFS: Fix the nfs ...
293
294
295
296
297
  	/*
  	 * Inform try_to_ascend() that we are no longer attached to the
  	 * dentry tree
  	 */
  	dentry->d_flags |= DCACHE_DISCONNECTED;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
298
299
  	if (parent)
  		spin_unlock(&parent->d_lock);
d52b90864   Miklos Szeredi   fix quadratic beh...
300
  	dentry_iput(dentry);
b7ab39f63   Nick Piggin   fs: dcache scale ...
301
302
303
304
  	/*
  	 * dentry_iput drops the locks, at which point nobody (except
  	 * transient RCU lookups) can reach this dentry.
  	 */
d52b90864   Miklos Szeredi   fix quadratic beh...
305
  	d_free(dentry);
871c0067d   OGAWA Hirofumi   [PATCH vfs-2.6 1/...
306
  	return parent;
d52b90864   Miklos Szeredi   fix quadratic beh...
307
  }
c6627c60c   David Howells   VFS: Remove dentr...
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
  /*
   * Unhash a dentry without inserting an RCU walk barrier or checking that
   * dentry->d_lock is locked.  The caller must take care of that, if
   * appropriate.
   */
  static void __d_shrink(struct dentry *dentry)
  {
  	if (!d_unhashed(dentry)) {
  		struct hlist_bl_head *b;
  		if (unlikely(dentry->d_flags & DCACHE_DISCONNECTED))
  			b = &dentry->d_sb->s_anon;
  		else
  			b = d_hash(dentry->d_parent, dentry->d_name.hash);
  
  		hlist_bl_lock(b);
  		__hlist_bl_del(&dentry->d_hash);
  		dentry->d_hash.pprev = NULL;
  		hlist_bl_unlock(b);
  	}
  }
789680d1e   Nick Piggin   fs: dcache scale ...
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
  /**
   * d_drop - drop a dentry
   * @dentry: dentry to drop
   *
   * d_drop() unhashes the entry from the parent dentry hashes, so that it won't
   * be found through a VFS lookup any more. Note that this is different from
   * deleting the dentry - d_delete will try to mark the dentry negative if
   * possible, giving a successful _negative_ lookup, while d_drop will
   * just make the cache lookup fail.
   *
   * d_drop() is used mainly for stuff that wants to invalidate a dentry for some
   * reason (NFS timeouts or autofs deletes).
   *
   * __d_drop requires dentry->d_lock.
   */
  void __d_drop(struct dentry *dentry)
  {
dea3667bc   Linus Torvalds   vfs: get rid of i...
345
  	if (!d_unhashed(dentry)) {
c6627c60c   David Howells   VFS: Remove dentr...
346
  		__d_shrink(dentry);
dea3667bc   Linus Torvalds   vfs: get rid of i...
347
  		dentry_rcuwalk_barrier(dentry);
789680d1e   Nick Piggin   fs: dcache scale ...
348
349
350
351
352
353
  	}
  }
  EXPORT_SYMBOL(__d_drop);
  
  void d_drop(struct dentry *dentry)
  {
789680d1e   Nick Piggin   fs: dcache scale ...
354
355
356
  	spin_lock(&dentry->d_lock);
  	__d_drop(dentry);
  	spin_unlock(&dentry->d_lock);
789680d1e   Nick Piggin   fs: dcache scale ...
357
358
  }
  EXPORT_SYMBOL(d_drop);
77812a1ef   Nick Piggin   fs: consolidate d...
359
  /*
44396f4b5   Josef Bacik   fs: add a DCACHE_...
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
   * d_clear_need_lookup - drop a dentry from cache and clear the need lookup flag
   * @dentry: dentry to drop
   *
   * This is called when we do a lookup on a placeholder dentry that needed to be
   * looked up.  The dentry should have been hashed in order for it to be found by
   * the lookup code, but now needs to be unhashed while we do the actual lookup
   * and clear the DCACHE_NEED_LOOKUP flag.
   */
  void d_clear_need_lookup(struct dentry *dentry)
  {
  	spin_lock(&dentry->d_lock);
  	__d_drop(dentry);
  	dentry->d_flags &= ~DCACHE_NEED_LOOKUP;
  	spin_unlock(&dentry->d_lock);
  }
  EXPORT_SYMBOL(d_clear_need_lookup);
  
  /*
77812a1ef   Nick Piggin   fs: consolidate d...
378
379
380
381
382
383
384
385
   * Finish off a dentry we've decided to kill.
   * dentry->d_lock must be held, returns with it unlocked.
   * If ref is non-zero, then decrement the refcount too.
   * Returns dentry requiring refcount drop, or NULL if we're done.
   */
  static inline struct dentry *dentry_kill(struct dentry *dentry, int ref)
  	__releases(dentry->d_lock)
  {
873feea09   Nick Piggin   fs: dcache per-in...
386
  	struct inode *inode;
77812a1ef   Nick Piggin   fs: consolidate d...
387
  	struct dentry *parent;
873feea09   Nick Piggin   fs: dcache per-in...
388
389
  	inode = dentry->d_inode;
  	if (inode && !spin_trylock(&inode->i_lock)) {
77812a1ef   Nick Piggin   fs: consolidate d...
390
391
392
393
394
395
396
397
398
399
  relock:
  		spin_unlock(&dentry->d_lock);
  		cpu_relax();
  		return dentry; /* try again with same dentry */
  	}
  	if (IS_ROOT(dentry))
  		parent = NULL;
  	else
  		parent = dentry->d_parent;
  	if (parent && !spin_trylock(&parent->d_lock)) {
873feea09   Nick Piggin   fs: dcache per-in...
400
401
  		if (inode)
  			spin_unlock(&inode->i_lock);
77812a1ef   Nick Piggin   fs: consolidate d...
402
403
  		goto relock;
  	}
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
404

77812a1ef   Nick Piggin   fs: consolidate d...
405
406
  	if (ref)
  		dentry->d_count--;
f0023bc61   Sage Weil   vfs: add d_prune ...
407
408
409
410
411
412
  	/*
  	 * if dentry was on the d_lru list delete it from there.
  	 * inform the fs via d_prune that this dentry is about to be
  	 * unhashed and destroyed.
  	 */
  	dentry_lru_prune(dentry);
77812a1ef   Nick Piggin   fs: consolidate d...
413
414
415
416
  	/* if it was on the hash then remove it */
  	__d_drop(dentry);
  	return d_kill(dentry, parent);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
  /* 
   * 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.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
442
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
443
444
445
446
447
448
  void dput(struct dentry *dentry)
  {
  	if (!dentry)
  		return;
  
  repeat:
b7ab39f63   Nick Piggin   fs: dcache scale ...
449
  	if (dentry->d_count == 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
450
  		might_sleep();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
451
  	spin_lock(&dentry->d_lock);
61f3dee4a   Nick Piggin   fs: dcache reduce...
452
453
454
  	BUG_ON(!dentry->d_count);
  	if (dentry->d_count > 1) {
  		dentry->d_count--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
455
  		spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
456
457
  		return;
  	}
fb045adb9   Nick Piggin   fs: dcache reduce...
458
  	if (dentry->d_flags & DCACHE_OP_DELETE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
459
  		if (dentry->d_op->d_delete(dentry))
61f3dee4a   Nick Piggin   fs: dcache reduce...
460
  			goto kill_it;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
461
  	}
265ac9023   Nick Piggin   fs: improve DCACH...
462

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
463
464
465
  	/* Unreachable? Get rid of it */
   	if (d_unhashed(dentry))
  		goto kill_it;
265ac9023   Nick Piggin   fs: improve DCACH...
466

44396f4b5   Josef Bacik   fs: add a DCACHE_...
467
468
469
470
471
472
473
  	/*
  	 * If this dentry needs lookup, don't set the referenced flag so that it
  	 * is more likely to be cleaned up by the dcache shrinker in case of
  	 * memory pressure.
  	 */
  	if (!d_need_lookup(dentry))
  		dentry->d_flags |= DCACHE_REFERENCED;
a4633357a   Christoph Hellwig   fs: clean up dent...
474
  	dentry_lru_add(dentry);
265ac9023   Nick Piggin   fs: improve DCACH...
475

61f3dee4a   Nick Piggin   fs: dcache reduce...
476
477
  	dentry->d_count--;
  	spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
478
  	return;
d52b90864   Miklos Szeredi   fix quadratic beh...
479
  kill_it:
77812a1ef   Nick Piggin   fs: consolidate d...
480
  	dentry = dentry_kill(dentry, 1);
d52b90864   Miklos Szeredi   fix quadratic beh...
481
482
  	if (dentry)
  		goto repeat;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
483
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
484
  EXPORT_SYMBOL(dput);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
  
  /**
   * 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.
  	 */
da5029563   Nick Piggin   fs: dcache scale ...
503
  	spin_lock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
504
  	if (d_unhashed(dentry)) {
da5029563   Nick Piggin   fs: dcache scale ...
505
  		spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
506
507
508
509
510
511
512
  		return 0;
  	}
  	/*
  	 * Check whether to do a partial shrink_dcache
  	 * to get rid of unused child entries.
  	 */
  	if (!list_empty(&dentry->d_subdirs)) {
da5029563   Nick Piggin   fs: dcache scale ...
513
  		spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
514
  		shrink_dcache_parent(dentry);
da5029563   Nick Piggin   fs: dcache scale ...
515
  		spin_lock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
516
517
518
519
520
521
522
523
524
525
526
  	}
  
  	/*
  	 * 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).
50e696308   Al Viro   vfs: d_invalidate...
527
528
  	 * We also need to leave mountpoints alone,
  	 * directory or not.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
529
  	 */
50e696308   Al Viro   vfs: d_invalidate...
530
531
  	if (dentry->d_count > 1 && dentry->d_inode) {
  		if (S_ISDIR(dentry->d_inode->i_mode) || d_mountpoint(dentry)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
532
  			spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
533
534
535
536
537
538
  			return -EBUSY;
  		}
  	}
  
  	__d_drop(dentry);
  	spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
539
540
  	return 0;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
541
  EXPORT_SYMBOL(d_invalidate);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
542

b5c84bf6f   Nick Piggin   fs: dcache remove...
543
  /* This must be called with d_lock held */
dc0474be3   Nick Piggin   fs: dcache ration...
544
  static inline void __dget_dlock(struct dentry *dentry)
230445078   Nick Piggin   fs: dcache scale lru
545
  {
b7ab39f63   Nick Piggin   fs: dcache scale ...
546
  	dentry->d_count++;
230445078   Nick Piggin   fs: dcache scale lru
547
  }
dc0474be3   Nick Piggin   fs: dcache ration...
548
  static inline void __dget(struct dentry *dentry)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
549
  {
230445078   Nick Piggin   fs: dcache scale lru
550
  	spin_lock(&dentry->d_lock);
dc0474be3   Nick Piggin   fs: dcache ration...
551
  	__dget_dlock(dentry);
230445078   Nick Piggin   fs: dcache scale lru
552
  	spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
553
  }
b7ab39f63   Nick Piggin   fs: dcache scale ...
554
555
556
557
558
  struct dentry *dget_parent(struct dentry *dentry)
  {
  	struct dentry *ret;
  
  repeat:
a734eb458   Nick Piggin   fs: dcache reduce...
559
560
561
562
563
  	/*
  	 * Don't need rcu_dereference because we re-check it was correct under
  	 * the lock.
  	 */
  	rcu_read_lock();
b7ab39f63   Nick Piggin   fs: dcache scale ...
564
  	ret = dentry->d_parent;
a734eb458   Nick Piggin   fs: dcache reduce...
565
566
567
568
  	spin_lock(&ret->d_lock);
  	if (unlikely(ret != dentry->d_parent)) {
  		spin_unlock(&ret->d_lock);
  		rcu_read_unlock();
b7ab39f63   Nick Piggin   fs: dcache scale ...
569
570
  		goto repeat;
  	}
a734eb458   Nick Piggin   fs: dcache reduce...
571
  	rcu_read_unlock();
b7ab39f63   Nick Piggin   fs: dcache scale ...
572
573
574
  	BUG_ON(!ret->d_count);
  	ret->d_count++;
  	spin_unlock(&ret->d_lock);
b7ab39f63   Nick Piggin   fs: dcache scale ...
575
576
577
  	return ret;
  }
  EXPORT_SYMBOL(dget_parent);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
578
579
580
581
582
583
584
585
586
587
588
589
  /**
   * 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...
590
   * If the inode has an IS_ROOT, DCACHE_DISCONNECTED alias, then prefer
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
591
   * any other hashed alias over that one unless @want_discon is set,
21c0d8fdd   NeilBrown   [PATCH] knfsd: cl...
592
   * in which case only return an IS_ROOT, DCACHE_DISCONNECTED alias.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
593
   */
da5029563   Nick Piggin   fs: dcache scale ...
594
  static struct dentry *__d_find_alias(struct inode *inode, int want_discon)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
595
  {
da5029563   Nick Piggin   fs: dcache scale ...
596
  	struct dentry *alias, *discon_alias;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
597

da5029563   Nick Piggin   fs: dcache scale ...
598
599
600
601
  again:
  	discon_alias = NULL;
  	list_for_each_entry(alias, &inode->i_dentry, d_alias) {
  		spin_lock(&alias->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
602
   		if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) {
21c0d8fdd   NeilBrown   [PATCH] knfsd: cl...
603
  			if (IS_ROOT(alias) &&
da5029563   Nick Piggin   fs: dcache scale ...
604
  			    (alias->d_flags & DCACHE_DISCONNECTED)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
605
  				discon_alias = alias;
da5029563   Nick Piggin   fs: dcache scale ...
606
  			} else if (!want_discon) {
dc0474be3   Nick Piggin   fs: dcache ration...
607
  				__dget_dlock(alias);
da5029563   Nick Piggin   fs: dcache scale ...
608
609
610
611
612
613
614
615
616
617
618
619
  				spin_unlock(&alias->d_lock);
  				return alias;
  			}
  		}
  		spin_unlock(&alias->d_lock);
  	}
  	if (discon_alias) {
  		alias = discon_alias;
  		spin_lock(&alias->d_lock);
  		if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) {
  			if (IS_ROOT(alias) &&
  			    (alias->d_flags & DCACHE_DISCONNECTED)) {
dc0474be3   Nick Piggin   fs: dcache ration...
620
  				__dget_dlock(alias);
da5029563   Nick Piggin   fs: dcache scale ...
621
  				spin_unlock(&alias->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
622
623
624
  				return alias;
  			}
  		}
da5029563   Nick Piggin   fs: dcache scale ...
625
626
  		spin_unlock(&alias->d_lock);
  		goto again;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
627
  	}
da5029563   Nick Piggin   fs: dcache scale ...
628
  	return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
629
  }
da5029563   Nick Piggin   fs: dcache scale ...
630
  struct dentry *d_find_alias(struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
631
  {
214fda1f6   David Howells   [PATCH] Optimise ...
632
633
634
  	struct dentry *de = NULL;
  
  	if (!list_empty(&inode->i_dentry)) {
873feea09   Nick Piggin   fs: dcache per-in...
635
  		spin_lock(&inode->i_lock);
214fda1f6   David Howells   [PATCH] Optimise ...
636
  		de = __d_find_alias(inode, 0);
873feea09   Nick Piggin   fs: dcache per-in...
637
  		spin_unlock(&inode->i_lock);
214fda1f6   David Howells   [PATCH] Optimise ...
638
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
639
640
  	return de;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
641
  EXPORT_SYMBOL(d_find_alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
642
643
644
645
646
647
648
  
  /*
   *	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: ...
649
  	struct dentry *dentry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
650
  restart:
873feea09   Nick Piggin   fs: dcache per-in...
651
  	spin_lock(&inode->i_lock);
0cdca3f98   Domen Puncer   [PATCH] janitor: ...
652
  	list_for_each_entry(dentry, &inode->i_dentry, d_alias) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
653
  		spin_lock(&dentry->d_lock);
b7ab39f63   Nick Piggin   fs: dcache scale ...
654
  		if (!dentry->d_count) {
dc0474be3   Nick Piggin   fs: dcache ration...
655
  			__dget_dlock(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
656
657
  			__d_drop(dentry);
  			spin_unlock(&dentry->d_lock);
873feea09   Nick Piggin   fs: dcache per-in...
658
  			spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
659
660
661
662
663
  			dput(dentry);
  			goto restart;
  		}
  		spin_unlock(&dentry->d_lock);
  	}
873feea09   Nick Piggin   fs: dcache per-in...
664
  	spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
665
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
666
  EXPORT_SYMBOL(d_prune_aliases);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
667
668
  
  /*
77812a1ef   Nick Piggin   fs: consolidate d...
669
670
671
   * Try to throw away a dentry - free the inode, dput the parent.
   * Requires dentry->d_lock is held, and dentry->d_count == 0.
   * Releases dentry->d_lock.
d702ccb34   Andrew Morton   [PATCH] prune_one...
672
   *
77812a1ef   Nick Piggin   fs: consolidate d...
673
   * This may fail if locks cannot be acquired no problem, just try again.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
674
   */
77812a1ef   Nick Piggin   fs: consolidate d...
675
  static void try_prune_one_dentry(struct dentry *dentry)
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
676
  	__releases(dentry->d_lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
677
  {
77812a1ef   Nick Piggin   fs: consolidate d...
678
  	struct dentry *parent;
d52b90864   Miklos Szeredi   fix quadratic beh...
679

77812a1ef   Nick Piggin   fs: consolidate d...
680
  	parent = dentry_kill(dentry, 0);
d52b90864   Miklos Szeredi   fix quadratic beh...
681
  	/*
77812a1ef   Nick Piggin   fs: consolidate d...
682
683
684
685
686
687
688
689
  	 * If dentry_kill returns NULL, we have nothing more to do.
  	 * if it returns the same dentry, trylocks failed. In either
  	 * case, just loop again.
  	 *
  	 * Otherwise, we need to prune ancestors too. This is necessary
  	 * to prevent quadratic behavior of shrink_dcache_parent(), but
  	 * is also expected to be beneficial in reducing dentry cache
  	 * fragmentation.
d52b90864   Miklos Szeredi   fix quadratic beh...
690
  	 */
77812a1ef   Nick Piggin   fs: consolidate d...
691
692
693
694
695
696
697
  	if (!parent)
  		return;
  	if (parent == dentry)
  		return;
  
  	/* Prune ancestors. */
  	dentry = parent;
d52b90864   Miklos Szeredi   fix quadratic beh...
698
  	while (dentry) {
b7ab39f63   Nick Piggin   fs: dcache scale ...
699
  		spin_lock(&dentry->d_lock);
89e605483   Nick Piggin   fs: dcache reduce...
700
701
702
703
704
  		if (dentry->d_count > 1) {
  			dentry->d_count--;
  			spin_unlock(&dentry->d_lock);
  			return;
  		}
77812a1ef   Nick Piggin   fs: consolidate d...
705
  		dentry = dentry_kill(dentry, 1);
d52b90864   Miklos Szeredi   fix quadratic beh...
706
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
707
  }
3049cfe24   Christoph Hellwig   fs: split __shrin...
708
  static void shrink_dentry_list(struct list_head *list)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
709
  {
da3bbdd46   Kentaro Makita   fix soft lock up ...
710
  	struct dentry *dentry;
da3bbdd46   Kentaro Makita   fix soft lock up ...
711

ec33679d7   Nick Piggin   fs: use RCU in sh...
712
713
  	rcu_read_lock();
  	for (;;) {
ec33679d7   Nick Piggin   fs: use RCU in sh...
714
715
716
717
718
719
  		dentry = list_entry_rcu(list->prev, struct dentry, d_lru);
  		if (&dentry->d_lru == list)
  			break; /* empty */
  		spin_lock(&dentry->d_lock);
  		if (dentry != list_entry(list->prev, struct dentry, d_lru)) {
  			spin_unlock(&dentry->d_lock);
230445078   Nick Piggin   fs: dcache scale lru
720
721
  			continue;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
722
723
  		/*
  		 * We found an inuse dentry which was not removed from
da3bbdd46   Kentaro Makita   fix soft lock up ...
724
725
  		 * 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
726
  		 */
b7ab39f63   Nick Piggin   fs: dcache scale ...
727
  		if (dentry->d_count) {
ec33679d7   Nick Piggin   fs: use RCU in sh...
728
  			dentry_lru_del(dentry);
da3bbdd46   Kentaro Makita   fix soft lock up ...
729
  			spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
730
731
  			continue;
  		}
ec33679d7   Nick Piggin   fs: use RCU in sh...
732

ec33679d7   Nick Piggin   fs: use RCU in sh...
733
  		rcu_read_unlock();
77812a1ef   Nick Piggin   fs: consolidate d...
734
735
  
  		try_prune_one_dentry(dentry);
ec33679d7   Nick Piggin   fs: use RCU in sh...
736
  		rcu_read_lock();
da3bbdd46   Kentaro Makita   fix soft lock up ...
737
  	}
ec33679d7   Nick Piggin   fs: use RCU in sh...
738
  	rcu_read_unlock();
3049cfe24   Christoph Hellwig   fs: split __shrin...
739
740
741
742
743
744
745
746
747
748
  }
  
  /**
   * __shrink_dcache_sb - shrink the dentry LRU on a given superblock
   * @sb:		superblock to shrink dentry LRU.
   * @count:	number of entries to prune
   * @flags:	flags to control the dentry processing
   *
   * If flags contains DCACHE_REFERENCED reference dentries will not be pruned.
   */
b0d40c92a   Dave Chinner   superblock: intro...
749
  static void __shrink_dcache_sb(struct super_block *sb, int count, int flags)
3049cfe24   Christoph Hellwig   fs: split __shrin...
750
  {
3049cfe24   Christoph Hellwig   fs: split __shrin...
751
752
753
  	struct dentry *dentry;
  	LIST_HEAD(referenced);
  	LIST_HEAD(tmp);
3049cfe24   Christoph Hellwig   fs: split __shrin...
754

230445078   Nick Piggin   fs: dcache scale lru
755
756
  relock:
  	spin_lock(&dcache_lru_lock);
3049cfe24   Christoph Hellwig   fs: split __shrin...
757
758
759
760
  	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);
230445078   Nick Piggin   fs: dcache scale lru
761
762
763
764
765
  		if (!spin_trylock(&dentry->d_lock)) {
  			spin_unlock(&dcache_lru_lock);
  			cpu_relax();
  			goto relock;
  		}
3049cfe24   Christoph Hellwig   fs: split __shrin...
766
767
768
769
770
  		/*
  		 * 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.
  		 */
230445078   Nick Piggin   fs: dcache scale lru
771
772
773
774
  		if (flags & DCACHE_REFERENCED &&
  				dentry->d_flags & DCACHE_REFERENCED) {
  			dentry->d_flags &= ~DCACHE_REFERENCED;
  			list_move(&dentry->d_lru, &referenced);
3049cfe24   Christoph Hellwig   fs: split __shrin...
775
  			spin_unlock(&dentry->d_lock);
230445078   Nick Piggin   fs: dcache scale lru
776
777
778
  		} else {
  			list_move_tail(&dentry->d_lru, &tmp);
  			spin_unlock(&dentry->d_lock);
b0d40c92a   Dave Chinner   superblock: intro...
779
  			if (!--count)
230445078   Nick Piggin   fs: dcache scale lru
780
  				break;
3049cfe24   Christoph Hellwig   fs: split __shrin...
781
  		}
ec33679d7   Nick Piggin   fs: use RCU in sh...
782
  		cond_resched_lock(&dcache_lru_lock);
3049cfe24   Christoph Hellwig   fs: split __shrin...
783
  	}
da3bbdd46   Kentaro Makita   fix soft lock up ...
784
785
  	if (!list_empty(&referenced))
  		list_splice(&referenced, &sb->s_dentry_lru);
230445078   Nick Piggin   fs: dcache scale lru
786
  	spin_unlock(&dcache_lru_lock);
ec33679d7   Nick Piggin   fs: use RCU in sh...
787
788
  
  	shrink_dentry_list(&tmp);
da3bbdd46   Kentaro Makita   fix soft lock up ...
789
790
791
  }
  
  /**
b0d40c92a   Dave Chinner   superblock: intro...
792
   * prune_dcache_sb - shrink the dcache
2af141626   Randy Dunlap   fs/dcache.c: fix ...
793
   * @sb: superblock
b0d40c92a   Dave Chinner   superblock: intro...
794
   * @nr_to_scan: number of entries to try to free
da3bbdd46   Kentaro Makita   fix soft lock up ...
795
   *
b0d40c92a   Dave Chinner   superblock: intro...
796
797
798
   * Attempt to shrink the superblock dcache LRU by @nr_to_scan entries. This is
   * done when we need more memory an called from the superblock shrinker
   * function.
da3bbdd46   Kentaro Makita   fix soft lock up ...
799
   *
b0d40c92a   Dave Chinner   superblock: intro...
800
801
   * This function may fail to free any resources if all the dentries are in
   * use.
da3bbdd46   Kentaro Makita   fix soft lock up ...
802
   */
b0d40c92a   Dave Chinner   superblock: intro...
803
  void prune_dcache_sb(struct super_block *sb, int nr_to_scan)
da3bbdd46   Kentaro Makita   fix soft lock up ...
804
  {
b0d40c92a   Dave Chinner   superblock: intro...
805
  	__shrink_dcache_sb(sb, nr_to_scan, DCACHE_REFERENCED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
806
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
807
808
809
810
  /**
   * shrink_dcache_sb - shrink dcache for a superblock
   * @sb: superblock
   *
3049cfe24   Christoph Hellwig   fs: split __shrin...
811
812
   * 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
813
   */
3049cfe24   Christoph Hellwig   fs: split __shrin...
814
  void shrink_dcache_sb(struct super_block *sb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
815
  {
3049cfe24   Christoph Hellwig   fs: split __shrin...
816
  	LIST_HEAD(tmp);
230445078   Nick Piggin   fs: dcache scale lru
817
  	spin_lock(&dcache_lru_lock);
3049cfe24   Christoph Hellwig   fs: split __shrin...
818
819
  	while (!list_empty(&sb->s_dentry_lru)) {
  		list_splice_init(&sb->s_dentry_lru, &tmp);
ec33679d7   Nick Piggin   fs: use RCU in sh...
820
  		spin_unlock(&dcache_lru_lock);
3049cfe24   Christoph Hellwig   fs: split __shrin...
821
  		shrink_dentry_list(&tmp);
ec33679d7   Nick Piggin   fs: use RCU in sh...
822
  		spin_lock(&dcache_lru_lock);
3049cfe24   Christoph Hellwig   fs: split __shrin...
823
  	}
230445078   Nick Piggin   fs: dcache scale lru
824
  	spin_unlock(&dcache_lru_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
825
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
826
  EXPORT_SYMBOL(shrink_dcache_sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
827
828
  
  /*
c636ebdb1   David Howells   [PATCH] VFS: Dest...
829
830
831
832
833
834
835
836
837
   * 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;
  
  	BUG_ON(!IS_ROOT(dentry));
c636ebdb1   David Howells   [PATCH] VFS: Dest...
838
839
  	for (;;) {
  		/* descend to the first leaf in the current subtree */
43c1c9cd2   David Howells   VFS: Reorganise s...
840
  		while (!list_empty(&dentry->d_subdirs))
c636ebdb1   David Howells   [PATCH] VFS: Dest...
841
842
  			dentry = list_entry(dentry->d_subdirs.next,
  					    struct dentry, d_u.d_child);
c636ebdb1   David Howells   [PATCH] VFS: Dest...
843
844
845
846
847
  
  		/* consume the dentries from this leaf up through its parents
  		 * until we find one with children or run out altogether */
  		do {
  			struct inode *inode;
f0023bc61   Sage Weil   vfs: add d_prune ...
848
849
850
851
852
853
  			/*
  			 * remove the dentry from the lru, and inform
  			 * the fs that this dentry is about to be
  			 * unhashed and destroyed.
  			 */
  			dentry_lru_prune(dentry);
43c1c9cd2   David Howells   VFS: Reorganise s...
854
  			__d_shrink(dentry);
b7ab39f63   Nick Piggin   fs: dcache scale ...
855
  			if (dentry->d_count != 0) {
c636ebdb1   David Howells   [PATCH] VFS: Dest...
856
857
858
859
860
861
862
863
864
  				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,
b7ab39f63   Nick Piggin   fs: dcache scale ...
865
  				       dentry->d_count,
c636ebdb1   David Howells   [PATCH] VFS: Dest...
866
867
868
869
  				       dentry->d_sb->s_type->name,
  				       dentry->d_sb->s_id);
  				BUG();
  			}
2fd6b7f50   Nick Piggin   fs: dcache scale ...
870
  			if (IS_ROOT(dentry)) {
c636ebdb1   David Howells   [PATCH] VFS: Dest...
871
  				parent = NULL;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
872
873
  				list_del(&dentry->d_u.d_child);
  			} else {
871c0067d   OGAWA Hirofumi   [PATCH vfs-2.6 1/...
874
  				parent = dentry->d_parent;
b7ab39f63   Nick Piggin   fs: dcache scale ...
875
  				parent->d_count--;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
876
  				list_del(&dentry->d_u.d_child);
871c0067d   OGAWA Hirofumi   [PATCH vfs-2.6 1/...
877
  			}
c636ebdb1   David Howells   [PATCH] VFS: Dest...
878

c636ebdb1   David Howells   [PATCH] VFS: Dest...
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
  			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)
312d3ca85   Christoph Hellwig   fs: use percpu co...
895
  				return;
c636ebdb1   David Howells   [PATCH] VFS: Dest...
896
  			dentry = parent;
c636ebdb1   David Howells   [PATCH] VFS: Dest...
897
898
899
900
901
902
903
904
905
  		} while (list_empty(&dentry->d_subdirs));
  
  		dentry = list_entry(dentry->d_subdirs.next,
  				    struct dentry, d_u.d_child);
  	}
  }
  
  /*
   * destroy the dentries attached to a superblock on unmounting
b5c84bf6f   Nick Piggin   fs: dcache remove...
906
   * - we don't need to use dentry->d_lock because:
c636ebdb1   David Howells   [PATCH] VFS: Dest...
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
   *   - 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;
b7ab39f63   Nick Piggin   fs: dcache scale ...
923
  	dentry->d_count--;
c636ebdb1   David Howells   [PATCH] VFS: Dest...
924
  	shrink_dcache_for_umount_subtree(dentry);
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
925
926
  	while (!hlist_bl_empty(&sb->s_anon)) {
  		dentry = hlist_bl_entry(hlist_bl_first(&sb->s_anon), struct dentry, d_hash);
c636ebdb1   David Howells   [PATCH] VFS: Dest...
927
928
929
930
931
  		shrink_dcache_for_umount_subtree(dentry);
  	}
  }
  
  /*
c826cb7df   Linus Torvalds   dcache.c: create ...
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
   * This tries to ascend one level of parenthood, but
   * we can race with renaming, so we need to re-check
   * the parenthood after dropping the lock and check
   * that the sequence number still matches.
   */
  static struct dentry *try_to_ascend(struct dentry *old, int locked, unsigned seq)
  {
  	struct dentry *new = old->d_parent;
  
  	rcu_read_lock();
  	spin_unlock(&old->d_lock);
  	spin_lock(&new->d_lock);
  
  	/*
  	 * might go back up the wrong parent if we have had a rename
  	 * or deletion
  	 */
  	if (new != old->d_parent ||
c83ce989c   Trond Myklebust   VFS: Fix the nfs ...
950
  		 (old->d_flags & DCACHE_DISCONNECTED) ||
c826cb7df   Linus Torvalds   dcache.c: create ...
951
952
953
954
955
956
957
958
959
960
  		 (!locked && read_seqretry(&rename_lock, seq))) {
  		spin_unlock(&new->d_lock);
  		new = NULL;
  	}
  	rcu_read_unlock();
  	return new;
  }
  
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
961
962
963
964
965
966
967
968
969
970
971
972
   * 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
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
973
974
  int have_submounts(struct dentry *parent)
  {
949854d02   Nick Piggin   fs: Use rename lo...
975
  	struct dentry *this_parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
976
  	struct list_head *next;
949854d02   Nick Piggin   fs: Use rename lo...
977
  	unsigned seq;
58db63d08   Nick Piggin   fs: dcache avoid ...
978
  	int locked = 0;
949854d02   Nick Piggin   fs: Use rename lo...
979

949854d02   Nick Piggin   fs: Use rename lo...
980
  	seq = read_seqbegin(&rename_lock);
58db63d08   Nick Piggin   fs: dcache avoid ...
981
982
  again:
  	this_parent = parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
983

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
984
985
  	if (d_mountpoint(parent))
  		goto positive;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
986
  	spin_lock(&this_parent->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
987
988
989
990
991
  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...
992
  		struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
993
  		next = tmp->next;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
994
995
  
  		spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
996
  		/* Have we found a mount point ? */
2fd6b7f50   Nick Piggin   fs: dcache scale ...
997
998
999
  		if (d_mountpoint(dentry)) {
  			spin_unlock(&dentry->d_lock);
  			spin_unlock(&this_parent->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1000
  			goto positive;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1001
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1002
  		if (!list_empty(&dentry->d_subdirs)) {
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1003
1004
  			spin_unlock(&this_parent->d_lock);
  			spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1005
  			this_parent = dentry;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1006
  			spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1007
1008
  			goto repeat;
  		}
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1009
  		spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1010
1011
1012
1013
1014
  	}
  	/*
  	 * All done at this level ... ascend and resume the search.
  	 */
  	if (this_parent != parent) {
c826cb7df   Linus Torvalds   dcache.c: create ...
1015
1016
1017
  		struct dentry *child = this_parent;
  		this_parent = try_to_ascend(this_parent, locked, seq);
  		if (!this_parent)
949854d02   Nick Piggin   fs: Use rename lo...
1018
  			goto rename_retry;
949854d02   Nick Piggin   fs: Use rename lo...
1019
  		next = child->d_u.d_child.next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1020
1021
  		goto resume;
  	}
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1022
  	spin_unlock(&this_parent->d_lock);
58db63d08   Nick Piggin   fs: dcache avoid ...
1023
  	if (!locked && read_seqretry(&rename_lock, seq))
949854d02   Nick Piggin   fs: Use rename lo...
1024
  		goto rename_retry;
58db63d08   Nick Piggin   fs: dcache avoid ...
1025
1026
  	if (locked)
  		write_sequnlock(&rename_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1027
1028
  	return 0; /* No mount points found in tree */
  positive:
58db63d08   Nick Piggin   fs: dcache avoid ...
1029
  	if (!locked && read_seqretry(&rename_lock, seq))
949854d02   Nick Piggin   fs: Use rename lo...
1030
  		goto rename_retry;
58db63d08   Nick Piggin   fs: dcache avoid ...
1031
1032
  	if (locked)
  		write_sequnlock(&rename_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1033
  	return 1;
58db63d08   Nick Piggin   fs: dcache avoid ...
1034
1035
1036
1037
1038
  
  rename_retry:
  	locked = 1;
  	write_seqlock(&rename_lock);
  	goto again;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1039
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1040
  EXPORT_SYMBOL(have_submounts);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
  
  /*
   * 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)
  {
949854d02   Nick Piggin   fs: Use rename lo...
1058
  	struct dentry *this_parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1059
  	struct list_head *next;
949854d02   Nick Piggin   fs: Use rename lo...
1060
  	unsigned seq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1061
  	int found = 0;
58db63d08   Nick Piggin   fs: dcache avoid ...
1062
  	int locked = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1063

949854d02   Nick Piggin   fs: Use rename lo...
1064
  	seq = read_seqbegin(&rename_lock);
58db63d08   Nick Piggin   fs: dcache avoid ...
1065
1066
  again:
  	this_parent = parent;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1067
  	spin_lock(&this_parent->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1068
1069
1070
1071
1072
  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...
1073
  		struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1074
  		next = tmp->next;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1075
  		spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
230445078   Nick Piggin   fs: dcache scale lru
1076

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1077
1078
1079
1080
  		/* 
  		 * move only zero ref count dentries to the end 
  		 * of the unused list for prune_dcache
  		 */
b7ab39f63   Nick Piggin   fs: dcache scale ...
1081
  		if (!dentry->d_count) {
a4633357a   Christoph Hellwig   fs: clean up dent...
1082
  			dentry_lru_move_tail(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1083
  			found++;
a4633357a   Christoph Hellwig   fs: clean up dent...
1084
1085
  		} else {
  			dentry_lru_del(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1086
1087
1088
1089
1090
1091
1092
  		}
  
  		/*
  		 * We can return to the caller if we have found some (this
  		 * ensures forward progress). We'll be coming back to find
  		 * the rest.
  		 */
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1093
1094
  		if (found && need_resched()) {
  			spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1095
  			goto out;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1096
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1097
1098
1099
1100
1101
  
  		/*
  		 * Descend a level if the d_subdirs list is non-empty.
  		 */
  		if (!list_empty(&dentry->d_subdirs)) {
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1102
1103
  			spin_unlock(&this_parent->d_lock);
  			spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1104
  			this_parent = dentry;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1105
  			spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1106
1107
  			goto repeat;
  		}
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1108
1109
  
  		spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1110
1111
1112
1113
1114
  	}
  	/*
  	 * All done at this level ... ascend and resume the search.
  	 */
  	if (this_parent != parent) {
c826cb7df   Linus Torvalds   dcache.c: create ...
1115
1116
1117
  		struct dentry *child = this_parent;
  		this_parent = try_to_ascend(this_parent, locked, seq);
  		if (!this_parent)
949854d02   Nick Piggin   fs: Use rename lo...
1118
  			goto rename_retry;
949854d02   Nick Piggin   fs: Use rename lo...
1119
  		next = child->d_u.d_child.next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1120
1121
1122
  		goto resume;
  	}
  out:
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1123
  	spin_unlock(&this_parent->d_lock);
58db63d08   Nick Piggin   fs: dcache avoid ...
1124
  	if (!locked && read_seqretry(&rename_lock, seq))
949854d02   Nick Piggin   fs: Use rename lo...
1125
  		goto rename_retry;
58db63d08   Nick Piggin   fs: dcache avoid ...
1126
1127
  	if (locked)
  		write_sequnlock(&rename_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1128
  	return found;
58db63d08   Nick Piggin   fs: dcache avoid ...
1129
1130
1131
1132
1133
1134
1135
  
  rename_retry:
  	if (found)
  		return found;
  	locked = 1;
  	write_seqlock(&rename_lock);
  	goto again;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
  }
  
  /**
   * 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 ...
1147
  	struct super_block *sb = parent->d_sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1148
1149
1150
  	int found;
  
  	while ((found = select_parent(parent)) != 0)
b0d40c92a   Dave Chinner   superblock: intro...
1151
  		__shrink_dcache_sb(sb, found, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1152
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1153
  EXPORT_SYMBOL(shrink_dcache_parent);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1154

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1155
  /**
a4464dbc0   Al Viro   Make ->d_sb assig...
1156
1157
   * __d_alloc	-	allocate a dcache entry
   * @sb: filesystem it will belong to
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1158
1159
1160
1161
1162
1163
1164
   * @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.
   */
   
a4464dbc0   Al Viro   Make ->d_sb assig...
1165
  struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1166
1167
1168
  {
  	struct dentry *dentry;
  	char *dname;
e12ba74d8   Mel Gorman   Group short-lived...
1169
  	dentry = kmem_cache_alloc(dentry_cache, GFP_KERNEL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
  	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;
b7ab39f63   Nick Piggin   fs: dcache scale ...
1188
  	dentry->d_count = 1;
dea3667bc   Linus Torvalds   vfs: get rid of i...
1189
  	dentry->d_flags = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1190
  	spin_lock_init(&dentry->d_lock);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1191
  	seqcount_init(&dentry->d_seq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1192
  	dentry->d_inode = NULL;
a4464dbc0   Al Viro   Make ->d_sb assig...
1193
1194
  	dentry->d_parent = dentry;
  	dentry->d_sb = sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1195
1196
  	dentry->d_op = NULL;
  	dentry->d_fsdata = NULL;
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
1197
  	INIT_HLIST_BL_NODE(&dentry->d_hash);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1198
1199
1200
  	INIT_LIST_HEAD(&dentry->d_lru);
  	INIT_LIST_HEAD(&dentry->d_subdirs);
  	INIT_LIST_HEAD(&dentry->d_alias);
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1201
  	INIT_LIST_HEAD(&dentry->d_u.d_child);
a4464dbc0   Al Viro   Make ->d_sb assig...
1202
  	d_set_d_op(dentry, dentry->d_sb->s_d_op);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1203

3e880fb5e   Nick Piggin   fs: use fast coun...
1204
  	this_cpu_inc(nr_dentry);
312d3ca85   Christoph Hellwig   fs: use percpu co...
1205

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1206
1207
  	return dentry;
  }
a4464dbc0   Al Viro   Make ->d_sb assig...
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
  
  /**
   * 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 = __d_alloc(parent->d_sb, name);
  	if (!dentry)
  		return NULL;
  
  	spin_lock(&parent->d_lock);
  	/*
  	 * don't need child lock because it is not subject
  	 * to concurrency here
  	 */
  	__dget_dlock(parent);
  	dentry->d_parent = parent;
  	list_add(&dentry->d_u.d_child, &parent->d_subdirs);
  	spin_unlock(&parent->d_lock);
  
  	return dentry;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1236
  EXPORT_SYMBOL(d_alloc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1237

4b936885a   Nick Piggin   fs: improve scala...
1238
1239
  struct dentry *d_alloc_pseudo(struct super_block *sb, const struct qstr *name)
  {
a4464dbc0   Al Viro   Make ->d_sb assig...
1240
1241
  	struct dentry *dentry = __d_alloc(sb, name);
  	if (dentry)
4b936885a   Nick Piggin   fs: improve scala...
1242
  		dentry->d_flags |= DCACHE_DISCONNECTED;
4b936885a   Nick Piggin   fs: improve scala...
1243
1244
1245
  	return dentry;
  }
  EXPORT_SYMBOL(d_alloc_pseudo);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1246
1247
1248
1249
1250
1251
1252
1253
1254
  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...
1255
  EXPORT_SYMBOL(d_alloc_name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1256

fb045adb9   Nick Piggin   fs: dcache reduce...
1257
1258
  void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op)
  {
6f7f7caab   Linus Torvalds   Turn d_set_d_op()...
1259
1260
  	WARN_ON_ONCE(dentry->d_op);
  	WARN_ON_ONCE(dentry->d_flags & (DCACHE_OP_HASH	|
fb045adb9   Nick Piggin   fs: dcache reduce...
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
  				DCACHE_OP_COMPARE	|
  				DCACHE_OP_REVALIDATE	|
  				DCACHE_OP_DELETE ));
  	dentry->d_op = op;
  	if (!op)
  		return;
  	if (op->d_hash)
  		dentry->d_flags |= DCACHE_OP_HASH;
  	if (op->d_compare)
  		dentry->d_flags |= DCACHE_OP_COMPARE;
  	if (op->d_revalidate)
  		dentry->d_flags |= DCACHE_OP_REVALIDATE;
  	if (op->d_delete)
  		dentry->d_flags |= DCACHE_OP_DELETE;
f0023bc61   Sage Weil   vfs: add d_prune ...
1275
1276
  	if (op->d_prune)
  		dentry->d_flags |= DCACHE_OP_PRUNE;
fb045adb9   Nick Piggin   fs: dcache reduce...
1277
1278
1279
  
  }
  EXPORT_SYMBOL(d_set_d_op);
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1280
1281
  static void __d_instantiate(struct dentry *dentry, struct inode *inode)
  {
b23fb0a60   Nick Piggin   fs: scale inode a...
1282
  	spin_lock(&dentry->d_lock);
9875cf806   David Howells   Add a dentry op t...
1283
1284
1285
  	if (inode) {
  		if (unlikely(IS_AUTOMOUNT(inode)))
  			dentry->d_flags |= DCACHE_NEED_AUTOMOUNT;
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1286
  		list_add(&dentry->d_alias, &inode->i_dentry);
9875cf806   David Howells   Add a dentry op t...
1287
  	}
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1288
  	dentry->d_inode = inode;
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1289
  	dentry_rcuwalk_barrier(dentry);
b23fb0a60   Nick Piggin   fs: scale inode a...
1290
  	spin_unlock(&dentry->d_lock);
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1291
1292
  	fsnotify_d_instantiate(dentry, inode);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
  /**
   * 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...
1310
  	BUG_ON(!list_empty(&entry->d_alias));
873feea09   Nick Piggin   fs: dcache per-in...
1311
1312
  	if (inode)
  		spin_lock(&inode->i_lock);
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1313
  	__d_instantiate(entry, inode);
873feea09   Nick Piggin   fs: dcache per-in...
1314
1315
  	if (inode)
  		spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1316
1317
  	security_d_instantiate(entry, inode);
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1318
  EXPORT_SYMBOL(d_instantiate);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1319
1320
1321
1322
1323
1324
1325
1326
  
  /**
   * 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...
1327
   * aliased dentry instead and drop one reference to inode.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1328
1329
1330
   *
   * 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...
1331
1332
1333
1334
   *
   * 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
1335
   */
770bfad84   David Howells   NFS: Add dentry m...
1336
1337
  static struct dentry *__d_instantiate_unique(struct dentry *entry,
  					     struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1338
1339
1340
1341
1342
  {
  	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...
1343
  	if (!inode) {
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1344
  		__d_instantiate(entry, NULL);
770bfad84   David Howells   NFS: Add dentry m...
1345
1346
  		return NULL;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1347
1348
  	list_for_each_entry(alias, &inode->i_dentry, d_alias) {
  		struct qstr *qstr = &alias->d_name;
9abca3608   Nick Piggin   fs: increase d_na...
1349
1350
1351
1352
1353
  		/*
  		 * Don't need alias->d_lock here, because aliases with
  		 * d_parent == entry->d_parent are not subject to name or
  		 * parent changes, because the parent inode i_mutex is held.
  		 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1354
1355
1356
1357
  		if (qstr->hash != hash)
  			continue;
  		if (alias->d_parent != entry->d_parent)
  			continue;
9d55c369b   Nick Piggin   fs: implement fas...
1358
  		if (dentry_cmp(qstr->name, qstr->len, name, len))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1359
  			continue;
dc0474be3   Nick Piggin   fs: dcache ration...
1360
  		__dget(alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1361
1362
  		return alias;
  	}
770bfad84   David Howells   NFS: Add dentry m...
1363

360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1364
  	__d_instantiate(entry, inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1365
1366
  	return NULL;
  }
770bfad84   David Howells   NFS: Add dentry m...
1367
1368
1369
1370
1371
1372
  
  struct dentry *d_instantiate_unique(struct dentry *entry, struct inode *inode)
  {
  	struct dentry *result;
  
  	BUG_ON(!list_empty(&entry->d_alias));
873feea09   Nick Piggin   fs: dcache per-in...
1373
1374
  	if (inode)
  		spin_lock(&inode->i_lock);
770bfad84   David Howells   NFS: Add dentry m...
1375
  	result = __d_instantiate_unique(entry, inode);
873feea09   Nick Piggin   fs: dcache per-in...
1376
1377
  	if (inode)
  		spin_unlock(&inode->i_lock);
770bfad84   David Howells   NFS: Add dentry m...
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
  
  	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
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
  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 };
a4464dbc0   Al Viro   Make ->d_sb assig...
1405
1406
  		res = __d_alloc(root_inode->i_sb, &name);
  		if (res)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1407
  			d_instantiate(res, root_inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1408
1409
1410
  	}
  	return res;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1411
  EXPORT_SYMBOL(d_alloc_root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1412

d891eedbc   J. Bruce Fields   fs/dcache: allow ...
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
  static struct dentry * __d_find_any_alias(struct inode *inode)
  {
  	struct dentry *alias;
  
  	if (list_empty(&inode->i_dentry))
  		return NULL;
  	alias = list_first_entry(&inode->i_dentry, struct dentry, d_alias);
  	__dget(alias);
  	return alias;
  }
  
  static struct dentry * d_find_any_alias(struct inode *inode)
  {
  	struct dentry *de;
  
  	spin_lock(&inode->i_lock);
  	de = __d_find_any_alias(inode);
  	spin_unlock(&inode->i_lock);
  	return de;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1433
  /**
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
   * 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...
1446
1447
1448
1449
   * 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...
1450
1451
1452
   */
  struct dentry *d_obtain_alias(struct inode *inode)
  {
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1453
1454
1455
  	static const struct qstr anonstring = { .name = "" };
  	struct dentry *tmp;
  	struct dentry *res;
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1456
1457
  
  	if (!inode)
440037287   Christoph Hellwig   [PATCH] switch al...
1458
  		return ERR_PTR(-ESTALE);
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1459
1460
  	if (IS_ERR(inode))
  		return ERR_CAST(inode);
d891eedbc   J. Bruce Fields   fs/dcache: allow ...
1461
  	res = d_find_any_alias(inode);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1462
1463
  	if (res)
  		goto out_iput;
a4464dbc0   Al Viro   Make ->d_sb assig...
1464
  	tmp = __d_alloc(inode->i_sb, &anonstring);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1465
1466
1467
  	if (!tmp) {
  		res = ERR_PTR(-ENOMEM);
  		goto out_iput;
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1468
  	}
b5c84bf6f   Nick Piggin   fs: dcache remove...
1469

873feea09   Nick Piggin   fs: dcache per-in...
1470
  	spin_lock(&inode->i_lock);
d891eedbc   J. Bruce Fields   fs/dcache: allow ...
1471
  	res = __d_find_any_alias(inode);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1472
  	if (res) {
873feea09   Nick Piggin   fs: dcache per-in...
1473
  		spin_unlock(&inode->i_lock);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1474
1475
1476
1477
1478
1479
  		dput(tmp);
  		goto out_iput;
  	}
  
  	/* attach a disconnected dentry */
  	spin_lock(&tmp->d_lock);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1480
1481
  	tmp->d_inode = inode;
  	tmp->d_flags |= DCACHE_DISCONNECTED;
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1482
  	list_add(&tmp->d_alias, &inode->i_dentry);
1879fd6a2   Christoph Hellwig   add hlist_bl_lock...
1483
  	hlist_bl_lock(&tmp->d_sb->s_anon);
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
1484
  	hlist_bl_add_head(&tmp->d_hash, &tmp->d_sb->s_anon);
1879fd6a2   Christoph Hellwig   add hlist_bl_lock...
1485
  	hlist_bl_unlock(&tmp->d_sb->s_anon);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1486
  	spin_unlock(&tmp->d_lock);
873feea09   Nick Piggin   fs: dcache per-in...
1487
  	spin_unlock(&inode->i_lock);
24ff6663c   Josef Bacik   fs: call security...
1488
  	security_d_instantiate(tmp, inode);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1489

9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1490
1491
1492
  	return tmp;
  
   out_iput:
24ff6663c   Josef Bacik   fs: call security...
1493
1494
  	if (res && !IS_ERR(res))
  		security_d_instantiate(res, inode);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1495
1496
  	iput(inode);
  	return res;
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1497
  }
adc487204   Benny Halevy   EXPORT_SYMBOL(d_o...
1498
  EXPORT_SYMBOL(d_obtain_alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
  
  /**
   * 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;
a9049376e   Al Viro   make d_splice_ali...
1519
1520
  	if (IS_ERR(inode))
  		return ERR_CAST(inode);
21c0d8fdd   NeilBrown   [PATCH] knfsd: cl...
1521
  	if (inode && S_ISDIR(inode->i_mode)) {
873feea09   Nick Piggin   fs: dcache per-in...
1522
  		spin_lock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1523
1524
1525
  		new = __d_find_alias(inode, 1);
  		if (new) {
  			BUG_ON(!(new->d_flags & DCACHE_DISCONNECTED));
873feea09   Nick Piggin   fs: dcache per-in...
1526
  			spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1527
  			security_d_instantiate(new, inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1528
1529
1530
  			d_move(new, dentry);
  			iput(inode);
  		} else {
873feea09   Nick Piggin   fs: dcache per-in...
1531
  			/* already taking inode->i_lock, so d_add() by hand */
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1532
  			__d_instantiate(dentry, inode);
873feea09   Nick Piggin   fs: dcache per-in...
1533
  			spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1534
1535
1536
1537
1538
1539
1540
  			security_d_instantiate(dentry, inode);
  			d_rehash(dentry);
  		}
  	} else
  		d_add(dentry, inode);
  	return new;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1541
  EXPORT_SYMBOL(d_splice_alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1542

9403540c0   Barry Naujok   dcache: Add case-...
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
  /**
   * 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_...
1559
  struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode,
9403540c0   Barry Naujok   dcache: Add case-...
1560
1561
1562
1563
1564
  			struct qstr *name)
  {
  	int error;
  	struct dentry *found;
  	struct dentry *new;
b6520c819   Christoph Hellwig   cleanup d_add_ci
1565
1566
1567
1568
  	/*
  	 * First check if a dentry matching the name already exists,
  	 * if not go ahead and create it now.
  	 */
9403540c0   Barry Naujok   dcache: Add case-...
1569
  	found = d_hash_and_lookup(dentry->d_parent, name);
9403540c0   Barry Naujok   dcache: Add case-...
1570
1571
1572
1573
1574
1575
  	if (!found) {
  		new = d_alloc(dentry->d_parent, name);
  		if (!new) {
  			error = -ENOMEM;
  			goto err_out;
  		}
b6520c819   Christoph Hellwig   cleanup d_add_ci
1576

9403540c0   Barry Naujok   dcache: Add case-...
1577
1578
1579
1580
1581
1582
1583
  		found = d_splice_alias(inode, new);
  		if (found) {
  			dput(new);
  			return found;
  		}
  		return new;
  	}
b6520c819   Christoph Hellwig   cleanup d_add_ci
1584
1585
1586
1587
1588
1589
1590
  
  	/*
  	 * 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-...
1591
1592
1593
1594
1595
1596
  	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-...
1597
1598
1599
  		iput(inode);
  		return found;
  	}
b6520c819   Christoph Hellwig   cleanup d_add_ci
1600

9403540c0   Barry Naujok   dcache: Add case-...
1601
  	/*
44396f4b5   Josef Bacik   fs: add a DCACHE_...
1602
1603
  	 * We are going to instantiate this dentry, unhash it and clear the
  	 * lookup flag so we can do that.
9403540c0   Barry Naujok   dcache: Add case-...
1604
  	 */
44396f4b5   Josef Bacik   fs: add a DCACHE_...
1605
1606
  	if (unlikely(d_need_lookup(found)))
  		d_clear_need_lookup(found);
b6520c819   Christoph Hellwig   cleanup d_add_ci
1607

9403540c0   Barry Naujok   dcache: Add case-...
1608
  	/*
9403540c0   Barry Naujok   dcache: Add case-...
1609
  	 * Negative dentry: instantiate it unless the inode is a directory and
b6520c819   Christoph Hellwig   cleanup d_add_ci
1610
  	 * already has a dentry.
9403540c0   Barry Naujok   dcache: Add case-...
1611
  	 */
4513d899c   Al Viro   switch d_add_ci()...
1612
1613
1614
1615
  	new = d_splice_alias(inode, found);
  	if (new) {
  		dput(found);
  		found = new;
9403540c0   Barry Naujok   dcache: Add case-...
1616
  	}
4513d899c   Al Viro   switch d_add_ci()...
1617
  	return found;
9403540c0   Barry Naujok   dcache: Add case-...
1618
1619
1620
1621
1622
  
  err_out:
  	iput(inode);
  	return ERR_PTR(error);
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1623
  EXPORT_SYMBOL(d_add_ci);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1624
1625
  
  /**
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
   * __d_lookup_rcu - search for a dentry (racy, store-free)
   * @parent: parent dentry
   * @name: qstr of name we wish to find
   * @seq: returns d_seq value at the point where the dentry was found
   * @inode: returns dentry->d_inode when the inode was found valid.
   * Returns: dentry, or NULL
   *
   * __d_lookup_rcu is the dcache lookup function for rcu-walk name
   * resolution (store-free path walking) design described in
   * Documentation/filesystems/path-lookup.txt.
   *
   * This is not to be used outside core vfs.
   *
   * __d_lookup_rcu must only be used in rcu-walk mode, ie. with vfsmount lock
   * held, and rcu_read_lock held. The returned dentry must not be stored into
   * without taking d_lock and checking d_seq sequence count against @seq
   * returned here.
   *
   * A refcount may be taken on the found dentry with the __d_rcu_to_refcount
   * function.
   *
   * Alternatively, __d_lookup_rcu may be called again to look up the child of
   * the returned dentry, so long as its parent's seqlock is checked after the
   * child is looked up. Thus, an interlocking stepping of sequence lock checks
   * is formed, giving integrity down the path walk.
   */
  struct dentry *__d_lookup_rcu(struct dentry *parent, struct qstr *name,
  				unsigned *seq, struct inode **inode)
  {
  	unsigned int len = name->len;
  	unsigned int hash = name->hash;
  	const unsigned char *str = name->name;
b07ad9967   Linus Torvalds   vfs: get rid of '...
1658
  	struct hlist_bl_head *b = d_hash(parent, hash);
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
1659
  	struct hlist_bl_node *node;
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
  	struct dentry *dentry;
  
  	/*
  	 * Note: There is significant duplication with __d_lookup_rcu which is
  	 * required to prevent single threaded performance regressions
  	 * especially on architectures where smp_rmb (in seqcounts) are costly.
  	 * Keep the two functions in sync.
  	 */
  
  	/*
  	 * The hash list is protected using RCU.
  	 *
  	 * Carefully use d_seq 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.
  	 *
b0a4bb830   Namhyung Kim   fs: update commen...
1680
  	 * See Documentation/filesystems/path-lookup.txt for more details.
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1681
  	 */
b07ad9967   Linus Torvalds   vfs: get rid of '...
1682
  	hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) {
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
  		struct inode *i;
  		const char *tname;
  		int tlen;
  
  		if (dentry->d_name.hash != hash)
  			continue;
  
  seqretry:
  		*seq = read_seqcount_begin(&dentry->d_seq);
  		if (dentry->d_parent != parent)
  			continue;
  		if (d_unhashed(dentry))
  			continue;
  		tlen = dentry->d_name.len;
  		tname = dentry->d_name.name;
  		i = dentry->d_inode;
e1bb57826   Nick Piggin   fs: prefetch inod...
1699
  		prefetch(tname);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1700
1701
1702
1703
1704
1705
1706
1707
  		/*
  		 * This seqcount check is required to ensure name and
  		 * len are loaded atomically, so as not to walk off the
  		 * edge of memory when walking. If we could load this
  		 * atomically some other way, we could drop this check.
  		 */
  		if (read_seqcount_retry(&dentry->d_seq, *seq))
  			goto seqretry;
830c0f0ed   Linus Torvalds   vfs: renumber DCA...
1708
  		if (unlikely(parent->d_flags & DCACHE_OP_COMPARE)) {
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1709
1710
1711
1712
1713
  			if (parent->d_op->d_compare(parent, *inode,
  						dentry, i,
  						tlen, tname, name))
  				continue;
  		} else {
9d55c369b   Nick Piggin   fs: implement fas...
1714
  			if (dentry_cmp(tname, tlen, str, len))
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
  				continue;
  		}
  		/*
  		 * No extra seqcount check is required after the name
  		 * compare. The caller must perform a seqcount check in
  		 * order to do anything useful with the returned dentry
  		 * anyway.
  		 */
  		*inode = i;
  		return dentry;
  	}
  	return NULL;
  }
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1730
1731
1732
   * d_lookup - search for a dentry
   * @parent: parent dentry
   * @name: qstr of name we wish to find
b04f784e5   Nick Piggin   fs: remove extra ...
1733
   * Returns: dentry, or NULL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1734
   *
b04f784e5   Nick Piggin   fs: remove extra ...
1735
1736
1737
1738
   * 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
1739
   */
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1740
  struct dentry *d_lookup(struct dentry *parent, struct qstr *name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1741
  {
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1742
  	struct dentry *dentry;
949854d02   Nick Piggin   fs: Use rename lo...
1743
  	unsigned seq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1744
1745
1746
1747
1748
1749
1750
1751
1752
  
          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...
1753
  EXPORT_SYMBOL(d_lookup);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1754

31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1755
  /**
b04f784e5   Nick Piggin   fs: remove extra ...
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
   * __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.
   */
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1770
  struct dentry *__d_lookup(struct dentry *parent, struct qstr *name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1771
1772
1773
1774
  {
  	unsigned int len = name->len;
  	unsigned int hash = name->hash;
  	const unsigned char *str = name->name;
b07ad9967   Linus Torvalds   vfs: get rid of '...
1775
  	struct hlist_bl_head *b = d_hash(parent, hash);
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
1776
  	struct hlist_bl_node *node;
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1777
  	struct dentry *found = NULL;
665a7583f   Paul E. McKenney   [PATCH] Remove hl...
1778
  	struct dentry *dentry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1779

b04f784e5   Nick Piggin   fs: remove extra ...
1780
  	/*
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1781
1782
1783
1784
1785
1786
1787
  	 * Note: There is significant duplication with __d_lookup_rcu which is
  	 * required to prevent single threaded performance regressions
  	 * especially on architectures where smp_rmb (in seqcounts) are costly.
  	 * Keep the two functions in sync.
  	 */
  
  	/*
b04f784e5   Nick Piggin   fs: remove extra ...
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
  	 * 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.
  	 *
b0a4bb830   Namhyung Kim   fs: update commen...
1798
  	 * See Documentation/filesystems/path-lookup.txt for more details.
b04f784e5   Nick Piggin   fs: remove extra ...
1799
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1800
1801
  	rcu_read_lock();
  	
b07ad9967   Linus Torvalds   vfs: get rid of '...
1802
  	hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) {
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1803
1804
  		const char *tname;
  		int tlen;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1805

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1806
1807
  		if (dentry->d_name.hash != hash)
  			continue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1808
1809
  
  		spin_lock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1810
1811
  		if (dentry->d_parent != parent)
  			goto next;
d0185c088   Linus Torvalds   Fix NULL pointer ...
1812
1813
  		if (d_unhashed(dentry))
  			goto next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1814
1815
1816
1817
  		/*
  		 * It is safe to compare names since d_move() cannot
  		 * change the qstr (protected by d_lock).
  		 */
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1818
1819
  		tlen = dentry->d_name.len;
  		tname = dentry->d_name.name;
fb045adb9   Nick Piggin   fs: dcache reduce...
1820
  		if (parent->d_flags & DCACHE_OP_COMPARE) {
621e155a3   Nick Piggin   fs: change d_comp...
1821
1822
  			if (parent->d_op->d_compare(parent, parent->d_inode,
  						dentry, dentry->d_inode,
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1823
  						tlen, tname, name))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1824
1825
  				goto next;
  		} else {
9d55c369b   Nick Piggin   fs: implement fas...
1826
  			if (dentry_cmp(tname, tlen, str, len))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1827
1828
  				goto next;
  		}
b7ab39f63   Nick Piggin   fs: dcache scale ...
1829
  		dentry->d_count++;
d0185c088   Linus Torvalds   Fix NULL pointer ...
1830
  		found = dentry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
  		spin_unlock(&dentry->d_lock);
  		break;
  next:
  		spin_unlock(&dentry->d_lock);
   	}
   	rcu_read_unlock();
  
   	return found;
  }
  
  /**
3e7e241f8   Eric W. Biederman   [PATCH] dcache: A...
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
   * 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);
fb045adb9   Nick Piggin   fs: dcache reduce...
1858
  	if (dir->d_flags & DCACHE_OP_HASH) {
b1e6a015a   Nick Piggin   fs: change d_hash...
1859
  		if (dir->d_op->d_hash(dir, dir->d_inode, name) < 0)
3e7e241f8   Eric W. Biederman   [PATCH] dcache: A...
1860
1861
1862
1863
1864
1865
1866
1867
  			goto out;
  	}
  	dentry = d_lookup(dir, name);
  out:
  	return dentry;
  }
  
  /**
786a5e15b   Nick Piggin   fs: d_validate fixes
1868
   * d_validate - verify dentry provided from insecure source (deprecated)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1869
   * @dentry: The dentry alleged to be valid child of @dparent
ff5fdb614   Randy Dunlap   fs: fix new dcach...
1870
   * @dparent: The parent dentry (known to be valid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1871
1872
1873
1874
   *
   * 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.
786a5e15b   Nick Piggin   fs: d_validate fixes
1875
1876
   *
   * This function is slow for big directories, and deprecated, do not use it.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1877
   */
d3a23e167   Nick Piggin   Revert "fs: use R...
1878
  int d_validate(struct dentry *dentry, struct dentry *dparent)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1879
  {
786a5e15b   Nick Piggin   fs: d_validate fixes
1880
  	struct dentry *child;
d3a23e167   Nick Piggin   Revert "fs: use R...
1881

2fd6b7f50   Nick Piggin   fs: dcache scale ...
1882
  	spin_lock(&dparent->d_lock);
786a5e15b   Nick Piggin   fs: d_validate fixes
1883
1884
  	list_for_each_entry(child, &dparent->d_subdirs, d_u.d_child) {
  		if (dentry == child) {
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1885
  			spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
dc0474be3   Nick Piggin   fs: dcache ration...
1886
  			__dget_dlock(dentry);
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1887
1888
  			spin_unlock(&dentry->d_lock);
  			spin_unlock(&dparent->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1889
1890
1891
  			return 1;
  		}
  	}
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1892
  	spin_unlock(&dparent->d_lock);
786a5e15b   Nick Piggin   fs: d_validate fixes
1893

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1894
1895
  	return 0;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1896
  EXPORT_SYMBOL(d_validate);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
  
  /*
   * 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)
  {
873feea09   Nick Piggin   fs: dcache per-in...
1921
  	struct inode *inode;
7a91bf7f5   John McCutchan   [PATCH] fsnotify_...
1922
  	int isdir = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1923
1924
1925
  	/*
  	 * Are we the only user?
  	 */
357f8e658   Nick Piggin   fs: dcache reduce...
1926
  again:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1927
  	spin_lock(&dentry->d_lock);
873feea09   Nick Piggin   fs: dcache per-in...
1928
1929
  	inode = dentry->d_inode;
  	isdir = S_ISDIR(inode->i_mode);
b7ab39f63   Nick Piggin   fs: dcache scale ...
1930
  	if (dentry->d_count == 1) {
873feea09   Nick Piggin   fs: dcache per-in...
1931
  		if (inode && !spin_trylock(&inode->i_lock)) {
357f8e658   Nick Piggin   fs: dcache reduce...
1932
1933
1934
1935
  			spin_unlock(&dentry->d_lock);
  			cpu_relax();
  			goto again;
  		}
13e3c5e5b   Al Viro   clean DCACHE_CANT...
1936
  		dentry->d_flags &= ~DCACHE_CANT_MOUNT;
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1937
  		dentry_unlink_inode(dentry);
7a91bf7f5   John McCutchan   [PATCH] fsnotify_...
1938
  		fsnotify_nameremove(dentry, isdir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1939
1940
1941
1942
1943
1944
1945
  		return;
  	}
  
  	if (!d_unhashed(dentry))
  		__d_drop(dentry);
  
  	spin_unlock(&dentry->d_lock);
7a91bf7f5   John McCutchan   [PATCH] fsnotify_...
1946
1947
  
  	fsnotify_nameremove(dentry, isdir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1948
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1949
  EXPORT_SYMBOL(d_delete);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1950

b07ad9967   Linus Torvalds   vfs: get rid of '...
1951
  static void __d_rehash(struct dentry * entry, struct hlist_bl_head *b)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1952
  {
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
1953
  	BUG_ON(!d_unhashed(entry));
1879fd6a2   Christoph Hellwig   add hlist_bl_lock...
1954
  	hlist_bl_lock(b);
dea3667bc   Linus Torvalds   vfs: get rid of i...
1955
  	entry->d_flags |= DCACHE_RCUACCESS;
b07ad9967   Linus Torvalds   vfs: get rid of '...
1956
  	hlist_bl_add_head_rcu(&entry->d_hash, b);
1879fd6a2   Christoph Hellwig   add hlist_bl_lock...
1957
  	hlist_bl_unlock(b);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1958
  }
770bfad84   David Howells   NFS: Add dentry m...
1959
1960
1961
1962
  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
1963
1964
1965
1966
1967
1968
1969
1970
1971
  /**
   * 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
1972
  	spin_lock(&entry->d_lock);
770bfad84   David Howells   NFS: Add dentry m...
1973
  	_d_rehash(entry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1974
  	spin_unlock(&entry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1975
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1976
  EXPORT_SYMBOL(d_rehash);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1977

fb2d5b86a   Nick Piggin   fs: name case upd...
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
  /**
   * dentry_update_name_case - update case insensitive dentry with a new name
   * @dentry: dentry to be updated
   * @name: new name
   *
   * Update a case insensitive dentry with new case of name.
   *
   * dentry must have been returned by d_lookup with name @name. Old and new
   * name lengths must match (ie. no d_compare which allows mismatched name
   * lengths).
   *
   * Parent inode i_mutex must be held over d_lookup and into this call (to
   * keep renames and concurrent inserts, and readdir(2) away).
   */
  void dentry_update_name_case(struct dentry *dentry, struct qstr *name)
  {
7ebfa57f6   Linus Torvalds   vfs: fix incorrec...
1994
  	BUG_ON(!mutex_is_locked(&dentry->d_parent->d_inode->i_mutex));
fb2d5b86a   Nick Piggin   fs: name case upd...
1995
  	BUG_ON(dentry->d_name.len != name->len); /* d_lookup gives this */
fb2d5b86a   Nick Piggin   fs: name case upd...
1996
  	spin_lock(&dentry->d_lock);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1997
  	write_seqcount_begin(&dentry->d_seq);
fb2d5b86a   Nick Piggin   fs: name case upd...
1998
  	memcpy((unsigned char *)dentry->d_name.name, name->name, name->len);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1999
  	write_seqcount_end(&dentry->d_seq);
fb2d5b86a   Nick Piggin   fs: name case upd...
2000
  	spin_unlock(&dentry->d_lock);
fb2d5b86a   Nick Piggin   fs: name case upd...
2001
2002
  }
  EXPORT_SYMBOL(dentry_update_name_case);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2003
2004
2005
2006
2007
2008
2009
  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...
2010
  			swap(target->d_name.name, dentry->d_name.name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2011
2012
2013
2014
2015
  		} else {
  			/*
  			 * dentry:internal, target:external.  Steal target's
  			 * storage and make target internal.
  			 */
321bcf921   J. Bruce Fields   dcache: don't exp...
2016
2017
  			memcpy(target->d_iname, dentry->d_name.name,
  					dentry->d_name.len + 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
  			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(...
2037
2038
  			dentry->d_name.len = target->d_name.len;
  			return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2039
2040
  		}
  	}
9a8d5bb4a   Wu Fengguang   generic swap(): d...
2041
  	swap(dentry->d_name.len, target->d_name.len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2042
  }
2fd6b7f50   Nick Piggin   fs: dcache scale ...
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
2074
2075
2076
2077
  static void dentry_lock_for_move(struct dentry *dentry, struct dentry *target)
  {
  	/*
  	 * XXXX: do we really need to take target->d_lock?
  	 */
  	if (IS_ROOT(dentry) || dentry->d_parent == target->d_parent)
  		spin_lock(&target->d_parent->d_lock);
  	else {
  		if (d_ancestor(dentry->d_parent, target->d_parent)) {
  			spin_lock(&dentry->d_parent->d_lock);
  			spin_lock_nested(&target->d_parent->d_lock,
  						DENTRY_D_LOCK_NESTED);
  		} else {
  			spin_lock(&target->d_parent->d_lock);
  			spin_lock_nested(&dentry->d_parent->d_lock,
  						DENTRY_D_LOCK_NESTED);
  		}
  	}
  	if (target < dentry) {
  		spin_lock_nested(&target->d_lock, 2);
  		spin_lock_nested(&dentry->d_lock, 3);
  	} else {
  		spin_lock_nested(&dentry->d_lock, 2);
  		spin_lock_nested(&target->d_lock, 3);
  	}
  }
  
  static void dentry_unlock_parents_for_move(struct dentry *dentry,
  					struct dentry *target)
  {
  	if (target->d_parent != dentry->d_parent)
  		spin_unlock(&dentry->d_parent->d_lock);
  	if (target->d_parent != target)
  		spin_unlock(&target->d_parent->d_lock);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2078
  /*
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2079
2080
2081
2082
2083
2084
2085
2086
2087
   * 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..
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2088
   */
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2089
  /*
183675011   Al Viro   fix loop checks i...
2090
   * __d_move - move a dentry
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2091
2092
2093
2094
   * @dentry: entry to move
   * @target: new dentry
   *
   * Update the dcache to reflect the move of a file name. Negative
c46c88774   Jeff Layton   vfs: document loc...
2095
2096
2097
   * dcache entries should not be moved in this way. Caller must hold
   * rename_lock, the i_mutex of the source and target directories,
   * and the sb->s_vfs_rename_mutex if they differ. See lock_rename().
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2098
   */
183675011   Al Viro   fix loop checks i...
2099
  static void __d_move(struct dentry * dentry, struct dentry * target)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2100
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2101
2102
2103
  	if (!dentry->d_inode)
  		printk(KERN_WARNING "VFS: moving negative dcache entry
  ");
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2104
2105
  	BUG_ON(d_ancestor(dentry, target));
  	BUG_ON(d_ancestor(target, dentry));
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2106
  	dentry_lock_for_move(dentry, target);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2107

31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2108
2109
  	write_seqcount_begin(&dentry->d_seq);
  	write_seqcount_begin(&target->d_seq);
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
2110
2111
2112
2113
2114
2115
2116
  	/* __d_drop does write_seqcount_barrier, but they're OK to nest. */
  
  	/*
  	 * Move the dentry to the target hash queue. Don't bother checking
  	 * for the same hash queue because of how unlikely it is.
  	 */
  	__d_drop(dentry);
789680d1e   Nick Piggin   fs: dcache scale ...
2117
  	__d_rehash(dentry, d_hash(target->d_parent, target->d_name.hash));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2118
2119
2120
  
  	/* Unhash the target: dput() will then get rid of it */
  	__d_drop(target);
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
2121
2122
  	list_del(&dentry->d_u.d_child);
  	list_del(&target->d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2123
2124
2125
  
  	/* Switch the names.. */
  	switch_names(dentry, target);
9a8d5bb4a   Wu Fengguang   generic swap(): d...
2126
  	swap(dentry->d_name.hash, target->d_name.hash);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2127
2128
2129
2130
2131
  
  	/* ... and switch the parents */
  	if (IS_ROOT(dentry)) {
  		dentry->d_parent = target->d_parent;
  		target->d_parent = target;
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
2132
  		INIT_LIST_HEAD(&target->d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2133
  	} else {
9a8d5bb4a   Wu Fengguang   generic swap(): d...
2134
  		swap(dentry->d_parent, target->d_parent);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2135
2136
  
  		/* And add them back to the (new) parent lists */
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
2137
  		list_add(&target->d_u.d_child, &target->d_parent->d_subdirs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2138
  	}
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
2139
  	list_add(&dentry->d_u.d_child, &dentry->d_parent->d_subdirs);
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2140

31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2141
2142
  	write_seqcount_end(&target->d_seq);
  	write_seqcount_end(&dentry->d_seq);
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2143
  	dentry_unlock_parents_for_move(dentry, target);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2144
  	spin_unlock(&target->d_lock);
c32ccd87b   Nick Piggin   [PATCH] inotify: ...
2145
  	fsnotify_d_move(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2146
  	spin_unlock(&dentry->d_lock);
183675011   Al Viro   fix loop checks i...
2147
2148
2149
2150
2151
2152
2153
2154
  }
  
  /*
   * d_move - move a dentry
   * @dentry: entry to move
   * @target: new dentry
   *
   * Update the dcache to reflect the move of a file name. Negative
c46c88774   Jeff Layton   vfs: document loc...
2155
2156
   * dcache entries should not be moved in this way. See the locking
   * requirements for __d_move.
183675011   Al Viro   fix loop checks i...
2157
2158
2159
2160
2161
   */
  void d_move(struct dentry *dentry, struct dentry *target)
  {
  	write_seqlock(&rename_lock);
  	__d_move(dentry, target);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2162
  	write_sequnlock(&rename_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2163
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2164
  EXPORT_SYMBOL(d_move);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2165

e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2166
2167
2168
2169
2170
2171
2172
  /**
   * 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...
2173
   */
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2174
  struct dentry *d_ancestor(struct dentry *p1, struct dentry *p2)
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2175
2176
  {
  	struct dentry *p;
871c0067d   OGAWA Hirofumi   [PATCH vfs-2.6 1/...
2177
  	for (p = p2; !IS_ROOT(p); p = p->d_parent) {
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2178
  		if (p->d_parent == p1)
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2179
  			return p;
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2180
  	}
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2181
  	return NULL;
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2182
2183
2184
2185
2186
2187
  }
  
  /*
   * This helper attempts to cope with remotely renamed directories
   *
   * It assumes that the caller is already holding
183675011   Al Viro   fix loop checks i...
2188
   * dentry->d_parent->d_inode->i_mutex, inode->i_lock and rename_lock
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2189
2190
2191
   *
   * Note: If ever the locking in lock_rename() changes, then please
   * remember to update this too...
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2192
   */
873feea09   Nick Piggin   fs: dcache per-in...
2193
2194
  static struct dentry *__d_unalias(struct inode *inode,
  		struct dentry *dentry, struct dentry *alias)
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2195
2196
2197
2198
2199
2200
2201
  {
  	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;
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2202
2203
2204
2205
2206
2207
2208
2209
2210
  	/* 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:
183675011   Al Viro   fix loop checks i...
2211
  	__d_move(alias, dentry);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2212
2213
  	ret = alias;
  out_err:
873feea09   Nick Piggin   fs: dcache per-in...
2214
  	spin_unlock(&inode->i_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2215
2216
2217
2218
2219
2220
2221
2222
  	if (m2)
  		mutex_unlock(m2);
  	if (m1)
  		mutex_unlock(m1);
  	return ret;
  }
  
  /*
770bfad84   David Howells   NFS: Add dentry m...
2223
2224
   * Prepare an anonymous dentry for life in the superblock's dentry tree as a
   * named dentry in place of the dentry to be replaced.
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2225
   * returns with anon->d_lock held!
770bfad84   David Howells   NFS: Add dentry m...
2226
2227
2228
2229
   */
  static void __d_materialise_dentry(struct dentry *dentry, struct dentry *anon)
  {
  	struct dentry *dparent, *aparent;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2230
  	dentry_lock_for_move(anon, dentry);
770bfad84   David Howells   NFS: Add dentry m...
2231

31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2232
2233
  	write_seqcount_begin(&dentry->d_seq);
  	write_seqcount_begin(&anon->d_seq);
770bfad84   David Howells   NFS: Add dentry m...
2234
2235
  	dparent = dentry->d_parent;
  	aparent = anon->d_parent;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2236
2237
  	switch_names(dentry, anon);
  	swap(dentry->d_name.hash, anon->d_name.hash);
770bfad84   David Howells   NFS: Add dentry m...
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
  	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);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2251
2252
  	write_seqcount_end(&dentry->d_seq);
  	write_seqcount_end(&anon->d_seq);
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2253
2254
2255
2256
  	dentry_unlock_parents_for_move(anon, dentry);
  	spin_unlock(&dentry->d_lock);
  
  	/* anon->d_lock still locked, returns locked */
770bfad84   David Howells   NFS: Add dentry m...
2257
2258
2259
2260
2261
2262
2263
2264
2265
  	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
c46c88774   Jeff Layton   vfs: document loc...
2266
2267
   * root directory alias in its place if there is one. Caller must hold the
   * i_mutex of the parent directory.
770bfad84   David Howells   NFS: Add dentry m...
2268
2269
2270
   */
  struct dentry *d_materialise_unique(struct dentry *dentry, struct inode *inode)
  {
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2271
  	struct dentry *actual;
770bfad84   David Howells   NFS: Add dentry m...
2272
2273
  
  	BUG_ON(!d_unhashed(dentry));
770bfad84   David Howells   NFS: Add dentry m...
2274
2275
  	if (!inode) {
  		actual = dentry;
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
2276
  		__d_instantiate(dentry, NULL);
357f8e658   Nick Piggin   fs: dcache reduce...
2277
2278
  		d_rehash(actual);
  		goto out_nolock;
770bfad84   David Howells   NFS: Add dentry m...
2279
  	}
873feea09   Nick Piggin   fs: dcache per-in...
2280
  	spin_lock(&inode->i_lock);
357f8e658   Nick Piggin   fs: dcache reduce...
2281

9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2282
2283
2284
2285
2286
2287
2288
  	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;
183675011   Al Viro   fix loop checks i...
2289
2290
2291
2292
2293
2294
2295
2296
  			write_seqlock(&rename_lock);
  
  			if (d_ancestor(alias, dentry)) {
  				/* Check for loops */
  				actual = ERR_PTR(-ELOOP);
  			} else if (IS_ROOT(alias)) {
  				/* Is this an anonymous mountpoint that we
  				 * could splice into our tree? */
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2297
  				__d_materialise_dentry(dentry, alias);
183675011   Al Viro   fix loop checks i...
2298
  				write_sequnlock(&rename_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2299
2300
  				__d_drop(alias);
  				goto found;
183675011   Al Viro   fix loop checks i...
2301
2302
2303
2304
  			} else {
  				/* Nope, but we must(!) avoid directory
  				 * aliasing */
  				actual = __d_unalias(inode, dentry, alias);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2305
  			}
183675011   Al Viro   fix loop checks i...
2306
  			write_sequnlock(&rename_lock);
dd179946d   David Howells   VFS: Log the fact...
2307
2308
2309
2310
2311
2312
2313
2314
2315
  			if (IS_ERR(actual)) {
  				if (PTR_ERR(actual) == -ELOOP)
  					pr_warn_ratelimited(
  						"VFS: Lookup of '%s' in %s %s"
  						" would have caused loop
  ",
  						dentry->d_name.name,
  						inode->i_sb->s_type->name,
  						inode->i_sb->s_id);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2316
  				dput(alias);
dd179946d   David Howells   VFS: Log the fact...
2317
  			}
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2318
2319
  			goto out_nolock;
  		}
770bfad84   David Howells   NFS: Add dentry m...
2320
2321
2322
2323
2324
2325
  	}
  
  	/* Add a unique reference */
  	actual = __d_instantiate_unique(dentry, inode);
  	if (!actual)
  		actual = dentry;
357f8e658   Nick Piggin   fs: dcache reduce...
2326
2327
  	else
  		BUG_ON(!d_unhashed(actual));
770bfad84   David Howells   NFS: Add dentry m...
2328

770bfad84   David Howells   NFS: Add dentry m...
2329
2330
2331
2332
  	spin_lock(&actual->d_lock);
  found:
  	_d_rehash(actual);
  	spin_unlock(&actual->d_lock);
873feea09   Nick Piggin   fs: dcache per-in...
2333
  	spin_unlock(&inode->i_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2334
  out_nolock:
770bfad84   David Howells   NFS: Add dentry m...
2335
2336
2337
2338
2339
2340
2341
  	if (actual == dentry) {
  		security_d_instantiate(dentry, inode);
  		return NULL;
  	}
  
  	iput(inode);
  	return actual;
770bfad84   David Howells   NFS: Add dentry m...
2342
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2343
  EXPORT_SYMBOL_GPL(d_materialise_unique);
770bfad84   David Howells   NFS: Add dentry m...
2344

cdd16d026   Miklos Szeredi   [patch 2/3] vfs: ...
2345
  static int prepend(char **buffer, int *buflen, const char *str, int namelen)
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2346
2347
2348
2349
2350
2351
2352
2353
  {
  	*buflen -= namelen;
  	if (*buflen < 0)
  		return -ENAMETOOLONG;
  	*buffer -= namelen;
  	memcpy(*buffer, str, namelen);
  	return 0;
  }
cdd16d026   Miklos Szeredi   [patch 2/3] vfs: ...
2354
2355
2356
2357
  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
2358
  /**
208898c17   Randy Dunlap   fs: fix kernel-do...
2359
   * prepend_path - Prepend path string to a buffer
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
2360
   * @path: the dentry/vfsmount to report
02125a826   Al Viro   fix apparmor dere...
2361
   * @root: root vfsmnt/dentry
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2362
2363
   * @buffer: pointer to the end of the buffer
   * @buflen: pointer to buffer length
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2364
   *
949854d02   Nick Piggin   fs: Use rename lo...
2365
   * Caller holds the rename_lock.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2366
   */
02125a826   Al Viro   fix apparmor dere...
2367
2368
  static int prepend_path(const struct path *path,
  			const struct path *root,
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2369
  			char **buffer, int *buflen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2370
  {
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
2371
2372
  	struct dentry *dentry = path->dentry;
  	struct vfsmount *vfsmnt = path->mnt;
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2373
2374
  	bool slash = false;
  	int error = 0;
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2375

99b7db7b8   Nick Piggin   fs: brlock vfsmou...
2376
  	br_read_lock(vfsmount_lock);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2377
  	while (dentry != root->dentry || vfsmnt != root->mnt) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2378
  		struct dentry * parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2379
  		if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) {
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2380
  			/* Global root? */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2381
  			if (vfsmnt->mnt_parent == vfsmnt) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2382
2383
2384
2385
  				goto global_root;
  			}
  			dentry = vfsmnt->mnt_mountpoint;
  			vfsmnt = vfsmnt->mnt_parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2386
2387
2388
2389
  			continue;
  		}
  		parent = dentry->d_parent;
  		prefetch(parent);
9abca3608   Nick Piggin   fs: increase d_na...
2390
  		spin_lock(&dentry->d_lock);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2391
  		error = prepend_name(buffer, buflen, &dentry->d_name);
9abca3608   Nick Piggin   fs: increase d_na...
2392
  		spin_unlock(&dentry->d_lock);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2393
2394
2395
2396
2397
2398
  		if (!error)
  			error = prepend(buffer, buflen, "/", 1);
  		if (error)
  			break;
  
  		slash = true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2399
2400
  		dentry = parent;
  	}
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2401
2402
  	if (!error && !slash)
  		error = prepend(buffer, buflen, "/", 1);
02125a826   Al Viro   fix apparmor dere...
2403
  out:
99b7db7b8   Nick Piggin   fs: brlock vfsmou...
2404
  	br_read_unlock(vfsmount_lock);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2405
  	return error;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2406
2407
  
  global_root:
98dc568bc   Miklos Szeredi   vfs: __d_path: do...
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
  	/*
  	 * 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);
  	}
02125a826   Al Viro   fix apparmor dere...
2418
2419
2420
2421
  	if (!slash)
  		error = prepend(buffer, buflen, "/", 1);
  	if (!error)
  		error = vfsmnt->mnt_ns ? 1 : 2;
be285c712   Andreas Gruenbacher   [patch 3/3] vfs: ...
2422
  	goto out;
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2423
  }
be285c712   Andreas Gruenbacher   [patch 3/3] vfs: ...
2424

f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2425
2426
2427
  /**
   * __d_path - return the path of a dentry
   * @path: the dentry/vfsmount to report
02125a826   Al Viro   fix apparmor dere...
2428
   * @root: root vfsmnt/dentry
cd956a1c0   Randy Dunlap   fs/dcache: fix fu...
2429
   * @buf: buffer to return value in
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2430
2431
   * @buflen: buffer length
   *
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2432
   * Convert a dentry into an ASCII path name.
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2433
2434
2435
2436
   *
   * Returns a pointer into the buffer or an error code if the
   * path was too long.
   *
be148247c   Christoph Hellwig   fs: take dcache_l...
2437
   * "buflen" should be positive.
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2438
   *
02125a826   Al Viro   fix apparmor dere...
2439
   * If the path is not reachable from the supplied root, return %NULL.
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2440
   */
02125a826   Al Viro   fix apparmor dere...
2441
2442
  char *__d_path(const struct path *path,
  	       const struct path *root,
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2443
2444
2445
2446
2447
2448
  	       char *buf, int buflen)
  {
  	char *res = buf + buflen;
  	int error;
  
  	prepend(&res, &buflen, "\0", 1);
949854d02   Nick Piggin   fs: Use rename lo...
2449
  	write_seqlock(&rename_lock);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2450
  	error = prepend_path(path, root, &res, &buflen);
949854d02   Nick Piggin   fs: Use rename lo...
2451
  	write_sequnlock(&rename_lock);
be148247c   Christoph Hellwig   fs: take dcache_l...
2452

02125a826   Al Viro   fix apparmor dere...
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
  	if (error < 0)
  		return ERR_PTR(error);
  	if (error > 0)
  		return NULL;
  	return res;
  }
  
  char *d_absolute_path(const struct path *path,
  	       char *buf, int buflen)
  {
  	struct path root = {};
  	char *res = buf + buflen;
  	int error;
  
  	prepend(&res, &buflen, "\0", 1);
  	write_seqlock(&rename_lock);
  	error = prepend_path(path, &root, &res, &buflen);
  	write_sequnlock(&rename_lock);
  
  	if (error > 1)
  		error = -EINVAL;
  	if (error < 0)
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2475
  		return ERR_PTR(error);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2476
  	return res;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2477
  }
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2478
2479
2480
  /*
   * same as __d_path but appends "(deleted)" for unlinked files.
   */
02125a826   Al Viro   fix apparmor dere...
2481
2482
2483
  static int path_with_deleted(const struct path *path,
  			     const struct path *root,
  			     char **buf, int *buflen)
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
  {
  	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...
2494
2495
2496
2497
  static int prepend_unreachable(char **buffer, int *buflen)
  {
  	return prepend(buffer, buflen, "(unreachable)", 13);
  }
a03a8a709   Jan Blunck   d_path: kerneldoc...
2498
2499
  /**
   * d_path - return the path of a dentry
cf28b4863   Jan Blunck   d_path: Make d_pa...
2500
   * @path: path to report
a03a8a709   Jan Blunck   d_path: kerneldoc...
2501
2502
2503
2504
2505
2506
   * @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...
2507
2508
2509
2510
   * 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...
2511
   *
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
2512
   * "buflen" should be positive.
a03a8a709   Jan Blunck   d_path: kerneldoc...
2513
   */
20d4fdc1a   Jan Engelhardt   [patch 2/4] fs: m...
2514
  char *d_path(const struct path *path, char *buf, int buflen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2515
  {
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2516
  	char *res = buf + buflen;
6ac08c39a   Jan Blunck   Use struct path i...
2517
  	struct path root;
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2518
  	int error;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2519

c23fbb6bc   Eric Dumazet   VFS: delay the de...
2520
2521
2522
2523
2524
2525
2526
  	/*
  	 * 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...
2527
2528
  	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...
2529

f7ad3c6be   Miklos Szeredi   vfs: add helpers ...
2530
  	get_fs_root(current->fs, &root);
949854d02   Nick Piggin   fs: Use rename lo...
2531
  	write_seqlock(&rename_lock);
02125a826   Al Viro   fix apparmor dere...
2532
2533
  	error = path_with_deleted(path, &root, &res, &buflen);
  	if (error < 0)
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2534
  		res = ERR_PTR(error);
949854d02   Nick Piggin   fs: Use rename lo...
2535
  	write_sequnlock(&rename_lock);
6ac08c39a   Jan Blunck   Use struct path i...
2536
  	path_put(&root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2537
2538
  	return res;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2539
  EXPORT_SYMBOL(d_path);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2540

8df9d1a41   Miklos Szeredi   vfs: show unreach...
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
  /**
   * 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;
8df9d1a41   Miklos Szeredi   vfs: show unreach...
2554
2555
2556
2557
2558
2559
  	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);
949854d02   Nick Piggin   fs: Use rename lo...
2560
  	write_seqlock(&rename_lock);
02125a826   Al Viro   fix apparmor dere...
2561
2562
  	error = path_with_deleted(path, &root, &res, &buflen);
  	if (error > 0)
8df9d1a41   Miklos Szeredi   vfs: show unreach...
2563
  		error = prepend_unreachable(&res, &buflen);
949854d02   Nick Piggin   fs: Use rename lo...
2564
  	write_sequnlock(&rename_lock);
8df9d1a41   Miklos Szeredi   vfs: show unreach...
2565
2566
2567
2568
2569
2570
  	path_put(&root);
  	if (error)
  		res =  ERR_PTR(error);
  
  	return res;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2571
  /*
c23fbb6bc   Eric Dumazet   VFS: delay the de...
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
   * 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: ...
2593
2594
   * Write full pathname from the root of the filesystem into the buffer.
   */
ec2447c27   Nick Piggin   hostfs: simplify ...
2595
  static char *__dentry_path(struct dentry *dentry, char *buf, int buflen)
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2596
2597
2598
  {
  	char *end = buf + buflen;
  	char *retval;
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2599
  	prepend(&end, &buflen, "\0", 1);
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2600
2601
2602
2603
2604
  	if (buflen < 1)
  		goto Elong;
  	/* Get '/' right */
  	retval = end-1;
  	*retval = '/';
cdd16d026   Miklos Szeredi   [patch 2/3] vfs: ...
2605
2606
  	while (!IS_ROOT(dentry)) {
  		struct dentry *parent = dentry->d_parent;
9abca3608   Nick Piggin   fs: increase d_na...
2607
  		int error;
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2608

6092d0481   Ram Pai   [patch 1/7] vfs: ...
2609
  		prefetch(parent);
9abca3608   Nick Piggin   fs: increase d_na...
2610
2611
2612
2613
  		spin_lock(&dentry->d_lock);
  		error = prepend_name(&end, &buflen, &dentry->d_name);
  		spin_unlock(&dentry->d_lock);
  		if (error != 0 || prepend(&end, &buflen, "/", 1) != 0)
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2614
2615
2616
2617
2618
  			goto Elong;
  
  		retval = end;
  		dentry = parent;
  	}
c103135c1   Al Viro   new helper: __den...
2619
2620
2621
2622
  	return retval;
  Elong:
  	return ERR_PTR(-ENAMETOOLONG);
  }
ec2447c27   Nick Piggin   hostfs: simplify ...
2623
2624
2625
2626
  
  char *dentry_path_raw(struct dentry *dentry, char *buf, int buflen)
  {
  	char *retval;
949854d02   Nick Piggin   fs: Use rename lo...
2627
  	write_seqlock(&rename_lock);
ec2447c27   Nick Piggin   hostfs: simplify ...
2628
  	retval = __dentry_path(dentry, buf, buflen);
949854d02   Nick Piggin   fs: Use rename lo...
2629
  	write_sequnlock(&rename_lock);
ec2447c27   Nick Piggin   hostfs: simplify ...
2630
2631
2632
2633
  
  	return retval;
  }
  EXPORT_SYMBOL(dentry_path_raw);
c103135c1   Al Viro   new helper: __den...
2634
2635
2636
2637
2638
  
  char *dentry_path(struct dentry *dentry, char *buf, int buflen)
  {
  	char *p = NULL;
  	char *retval;
949854d02   Nick Piggin   fs: Use rename lo...
2639
  	write_seqlock(&rename_lock);
c103135c1   Al Viro   new helper: __den...
2640
2641
2642
2643
2644
2645
2646
  	if (d_unlinked(dentry)) {
  		p = buf + buflen;
  		if (prepend(&p, &buflen, "//deleted", 10) != 0)
  			goto Elong;
  		buflen++;
  	}
  	retval = __dentry_path(dentry, buf, buflen);
949854d02   Nick Piggin   fs: Use rename lo...
2647
  	write_sequnlock(&rename_lock);
c103135c1   Al Viro   new helper: __den...
2648
2649
  	if (!IS_ERR(retval) && p)
  		*p = '/';	/* restore '/' overriden with '\0' */
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2650
2651
  	return retval;
  Elong:
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2652
2653
2654
2655
  	return ERR_PTR(-ENAMETOOLONG);
  }
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
   * 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...
2673
  SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2674
  {
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2675
  	int error;
6ac08c39a   Jan Blunck   Use struct path i...
2676
  	struct path pwd, root;
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2677
  	char *page = (char *) __get_free_page(GFP_USER);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2678
2679
2680
  
  	if (!page)
  		return -ENOMEM;
f7ad3c6be   Miklos Szeredi   vfs: add helpers ...
2681
  	get_fs_root_and_pwd(current->fs, &root, &pwd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2682

552ce544e   Linus Torvalds   Revert "[PATCH] F...
2683
  	error = -ENOENT;
949854d02   Nick Piggin   fs: Use rename lo...
2684
  	write_seqlock(&rename_lock);
f3da392e9   Alexey Dobriyan   dcache: extrace a...
2685
  	if (!d_unlinked(pwd.dentry)) {
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2686
  		unsigned long len;
8df9d1a41   Miklos Szeredi   vfs: show unreach...
2687
2688
  		char *cwd = page + PAGE_SIZE;
  		int buflen = PAGE_SIZE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2689

8df9d1a41   Miklos Szeredi   vfs: show unreach...
2690
  		prepend(&cwd, &buflen, "\0", 1);
02125a826   Al Viro   fix apparmor dere...
2691
  		error = prepend_path(&pwd, &root, &cwd, &buflen);
949854d02   Nick Piggin   fs: Use rename lo...
2692
  		write_sequnlock(&rename_lock);
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2693

02125a826   Al Viro   fix apparmor dere...
2694
  		if (error < 0)
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2695
  			goto out;
8df9d1a41   Miklos Szeredi   vfs: show unreach...
2696
  		/* Unreachable from current root */
02125a826   Al Viro   fix apparmor dere...
2697
  		if (error > 0) {
8df9d1a41   Miklos Szeredi   vfs: show unreach...
2698
2699
2700
2701
  			error = prepend_unreachable(&cwd, &buflen);
  			if (error)
  				goto out;
  		}
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2702
2703
2704
2705
2706
2707
2708
  		error = -ERANGE;
  		len = PAGE_SIZE + page - cwd;
  		if (len <= size) {
  			error = len;
  			if (copy_to_user(buf, cwd, len))
  				error = -EFAULT;
  		}
949854d02   Nick Piggin   fs: Use rename lo...
2709
2710
  	} else {
  		write_sequnlock(&rename_lock);
949854d02   Nick Piggin   fs: Use rename lo...
2711
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2712
2713
  
  out:
6ac08c39a   Jan Blunck   Use struct path i...
2714
2715
  	path_put(&pwd);
  	path_put(&root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
  	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/...
2736
  int is_subdir(struct dentry *new_dentry, struct dentry *old_dentry)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2737
2738
  {
  	int result;
949854d02   Nick Piggin   fs: Use rename lo...
2739
  	unsigned seq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2740

e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2741
2742
  	if (new_dentry == old_dentry)
  		return 1;
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2743
  	do {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2744
  		/* for restarting inner loop in case of seq retry */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2745
  		seq = read_seqbegin(&rename_lock);
949854d02   Nick Piggin   fs: Use rename lo...
2746
2747
2748
2749
2750
  		/*
  		 * Need rcu_readlock to protect against the d_parent trashing
  		 * due to d_move
  		 */
  		rcu_read_lock();
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2751
  		if (d_ancestor(old_dentry, new_dentry))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2752
  			result = 1;
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2753
2754
  		else
  			result = 0;
949854d02   Nick Piggin   fs: Use rename lo...
2755
  		rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2756
  	} while (read_seqretry(&rename_lock, seq));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2757
2758
2759
  
  	return result;
  }
2096f759a   Al Viro   New helper: path_...
2760
2761
2762
2763
2764
  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...
2765
2766
  
  	br_read_lock(vfsmount_lock);
2096f759a   Al Viro   New helper: path_...
2767
2768
2769
  	if (mnt != path2->mnt) {
  		for (;;) {
  			if (mnt->mnt_parent == mnt) {
99b7db7b8   Nick Piggin   fs: brlock vfsmou...
2770
  				br_read_unlock(vfsmount_lock);
2096f759a   Al Viro   New helper: path_...
2771
2772
2773
2774
2775
2776
2777
2778
2779
  				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...
2780
  	br_read_unlock(vfsmount_lock);
2096f759a   Al Viro   New helper: path_...
2781
2782
2783
  	return res;
  }
  EXPORT_SYMBOL(path_is_under);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2784
2785
  void d_genocide(struct dentry *root)
  {
949854d02   Nick Piggin   fs: Use rename lo...
2786
  	struct dentry *this_parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2787
  	struct list_head *next;
949854d02   Nick Piggin   fs: Use rename lo...
2788
  	unsigned seq;
58db63d08   Nick Piggin   fs: dcache avoid ...
2789
  	int locked = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2790

949854d02   Nick Piggin   fs: Use rename lo...
2791
  	seq = read_seqbegin(&rename_lock);
58db63d08   Nick Piggin   fs: dcache avoid ...
2792
2793
  again:
  	this_parent = root;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2794
  	spin_lock(&this_parent->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2795
2796
2797
2798
2799
  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...
2800
  		struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2801
  		next = tmp->next;
949854d02   Nick Piggin   fs: Use rename lo...
2802

da5029563   Nick Piggin   fs: dcache scale ...
2803
2804
2805
  		spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
  		if (d_unhashed(dentry) || !dentry->d_inode) {
  			spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2806
  			continue;
da5029563   Nick Piggin   fs: dcache scale ...
2807
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2808
  		if (!list_empty(&dentry->d_subdirs)) {
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2809
2810
  			spin_unlock(&this_parent->d_lock);
  			spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2811
  			this_parent = dentry;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2812
  			spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2813
2814
  			goto repeat;
  		}
949854d02   Nick Piggin   fs: Use rename lo...
2815
2816
2817
2818
  		if (!(dentry->d_flags & DCACHE_GENOCIDE)) {
  			dentry->d_flags |= DCACHE_GENOCIDE;
  			dentry->d_count--;
  		}
b7ab39f63   Nick Piggin   fs: dcache scale ...
2819
  		spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2820
2821
  	}
  	if (this_parent != root) {
c826cb7df   Linus Torvalds   dcache.c: create ...
2822
  		struct dentry *child = this_parent;
949854d02   Nick Piggin   fs: Use rename lo...
2823
2824
2825
2826
  		if (!(this_parent->d_flags & DCACHE_GENOCIDE)) {
  			this_parent->d_flags |= DCACHE_GENOCIDE;
  			this_parent->d_count--;
  		}
c826cb7df   Linus Torvalds   dcache.c: create ...
2827
2828
  		this_parent = try_to_ascend(this_parent, locked, seq);
  		if (!this_parent)
949854d02   Nick Piggin   fs: Use rename lo...
2829
  			goto rename_retry;
949854d02   Nick Piggin   fs: Use rename lo...
2830
  		next = child->d_u.d_child.next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2831
2832
  		goto resume;
  	}
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2833
  	spin_unlock(&this_parent->d_lock);
58db63d08   Nick Piggin   fs: dcache avoid ...
2834
  	if (!locked && read_seqretry(&rename_lock, seq))
949854d02   Nick Piggin   fs: Use rename lo...
2835
  		goto rename_retry;
58db63d08   Nick Piggin   fs: dcache avoid ...
2836
2837
2838
2839
2840
2841
2842
2843
  	if (locked)
  		write_sequnlock(&rename_lock);
  	return;
  
  rename_retry:
  	locked = 1;
  	write_seqlock(&rename_lock);
  	goto again;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
  }
  
  /**
   * 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...
2864
2865
  	dentry = d_hash_and_lookup(dir, name);
  	if (dentry) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2866
2867
2868
2869
  		if (dentry->d_inode)
  			ino = dentry->d_inode->i_ino;
  		dput(dentry);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2870
2871
  	return ino;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2872
  EXPORT_SYMBOL(find_inode_number);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
  
  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",
b07ad9967   Linus Torvalds   vfs: get rid of '...
2896
  					sizeof(struct hlist_bl_head),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2897
2898
2899
2900
2901
2902
2903
2904
  					dhash_entries,
  					13,
  					HASH_EARLY,
  					&d_hash_shift,
  					&d_hash_mask,
  					0);
  
  	for (loop = 0; loop < (1 << d_hash_shift); loop++)
b07ad9967   Linus Torvalds   vfs: get rid of '...
2905
  		INIT_HLIST_BL_HEAD(dentry_hashtable + loop);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2906
  }
74bf17cff   Denis Cheng   fs: remove the un...
2907
  static void __init dcache_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2908
2909
2910
2911
2912
2913
2914
2915
  {
  	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...
2916
2917
  	dentry_cache = KMEM_CACHE(dentry,
  		SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_MEM_SPREAD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2918
2919
2920
2921
2922
2923
2924
  
  	/* Hash may have been set up in dcache_init_early */
  	if (!hashdist)
  		return;
  
  	dentry_hashtable =
  		alloc_large_system_hash("Dentry cache",
b07ad9967   Linus Torvalds   vfs: get rid of '...
2925
  					sizeof(struct hlist_bl_head),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2926
2927
2928
2929
2930
2931
2932
2933
  					dhash_entries,
  					13,
  					0,
  					&d_hash_shift,
  					&d_hash_mask,
  					0);
  
  	for (loop = 0; loop < (1 << d_hash_shift); loop++)
b07ad9967   Linus Torvalds   vfs: get rid of '...
2934
  		INIT_HLIST_BL_HEAD(dentry_hashtable + loop);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2935
2936
2937
  }
  
  /* SLAB cache for __getname() consumers */
e18b890bb   Christoph Lameter   [PATCH] slab: rem...
2938
  struct kmem_cache *names_cachep __read_mostly;
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2939
  EXPORT_SYMBOL(names_cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2940

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2941
  EXPORT_SYMBOL(d_genocide);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
  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...
2959
  			SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2960

74bf17cff   Denis Cheng   fs: remove the un...
2961
2962
  	dcache_init();
  	inode_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2963
  	files_init(mempages);
74bf17cff   Denis Cheng   fs: remove the un...
2964
  	mnt_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2965
2966
2967
  	bdev_cache_init();
  	chrdev_init();
  }