Blame view

fs/dcache.c 76.7 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>
07f3f05c1   David Howells   [PATCH] BLOCK: Mo...
38
  #include "internal.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39

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

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

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

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

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

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

dea3667bc   Linus Torvalds   vfs: get rid of i...
150
151
  	/* if dentry was never visible to RCU, immediate free is OK */
  	if (!(dentry->d_flags & DCACHE_RCUACCESS))
9c82ab9c9   Christoph Hellwig   fs: simplify __d_...
152
  		__d_free(&dentry->d_u.d_rcu);
b3423415f   Eric Dumazet   [PATCH] dcache: a...
153
  	else
9c82ab9c9   Christoph Hellwig   fs: simplify __d_...
154
  		call_rcu(&dentry->d_u.d_rcu, __d_free);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
155
  }
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
156
157
  /**
   * dentry_rcuwalk_barrier - invalidate in-progress rcu-walk lookups
ff5fdb614   Randy Dunlap   fs: fix new dcach...
158
   * @dentry: the target dentry
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
159
160
161
162
163
164
165
166
167
168
   * 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
169
170
  /*
   * Release the dentry's inode, using the filesystem
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
171
172
   * d_iput() operation if defined. Dentry has no refcount
   * and is unhashed.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
173
   */
858119e15   Arjan van de Ven   [PATCH] Unlinline...
174
  static void dentry_iput(struct dentry * dentry)
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
175
  	__releases(dentry->d_lock)
873feea09   Nick Piggin   fs: dcache per-in...
176
  	__releases(dentry->d_inode->i_lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
177
178
179
180
181
182
  {
  	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...
183
  		spin_unlock(&inode->i_lock);
f805fbdaa   Linus Torvalds   Make fsnotify pos...
184
185
  		if (!inode->i_nlink)
  			fsnotify_inoderemove(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
186
187
188
189
190
191
  		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
192
193
  	}
  }
da3bbdd46   Kentaro Makita   fix soft lock up ...
194
  /*
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
195
196
197
198
199
   * 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...
200
  	__releases(dentry->d_inode->i_lock)
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
201
202
203
204
205
206
  {
  	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...
207
  	spin_unlock(&inode->i_lock);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
208
209
210
211
212
213
214
215
216
  	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 ...
217
   * dentry_lru_(add|del|prune|move_tail) must be called with d_lock held.
da3bbdd46   Kentaro Makita   fix soft lock up ...
218
219
220
   */
  static void dentry_lru_add(struct dentry *dentry)
  {
a4633357a   Christoph Hellwig   fs: clean up dent...
221
  	if (list_empty(&dentry->d_lru)) {
230445078   Nick Piggin   fs: dcache scale lru
222
  		spin_lock(&dcache_lru_lock);
a4633357a   Christoph Hellwig   fs: clean up dent...
223
224
  		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...
225
  		dentry_stat.nr_unused++;
230445078   Nick Piggin   fs: dcache scale lru
226
  		spin_unlock(&dcache_lru_lock);
a4633357a   Christoph Hellwig   fs: clean up dent...
227
  	}
da3bbdd46   Kentaro Makita   fix soft lock up ...
228
  }
230445078   Nick Piggin   fs: dcache scale lru
229
230
231
232
233
234
  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 ...
235
236
237
  /*
   * Remove a dentry with references from the LRU.
   */
da3bbdd46   Kentaro Makita   fix soft lock up ...
238
239
240
  static void dentry_lru_del(struct dentry *dentry)
  {
  	if (!list_empty(&dentry->d_lru)) {
230445078   Nick Piggin   fs: dcache scale lru
241
242
243
  		spin_lock(&dcache_lru_lock);
  		__dentry_lru_del(dentry);
  		spin_unlock(&dcache_lru_lock);
da3bbdd46   Kentaro Makita   fix soft lock up ...
244
245
  	}
  }
f0023bc61   Sage Weil   vfs: add d_prune ...
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
  /*
   * 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...
262
  static void dentry_lru_move_tail(struct dentry *dentry)
da3bbdd46   Kentaro Makita   fix soft lock up ...
263
  {
230445078   Nick Piggin   fs: dcache scale lru
264
  	spin_lock(&dcache_lru_lock);
a4633357a   Christoph Hellwig   fs: clean up dent...
265
266
267
  	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...
268
  		dentry_stat.nr_unused++;
a4633357a   Christoph Hellwig   fs: clean up dent...
269
270
  	} else {
  		list_move_tail(&dentry->d_lru, &dentry->d_sb->s_dentry_lru);
da3bbdd46   Kentaro Makita   fix soft lock up ...
271
  	}
230445078   Nick Piggin   fs: dcache scale lru
272
  	spin_unlock(&dcache_lru_lock);
da3bbdd46   Kentaro Makita   fix soft lock up ...
273
  }
d52b90864   Miklos Szeredi   fix quadratic beh...
274
275
276
  /**
   * d_kill - kill dentry and return parent
   * @dentry: dentry to kill
ff5fdb614   Randy Dunlap   fs: fix new dcach...
277
   * @parent: parent dentry
d52b90864   Miklos Szeredi   fix quadratic beh...
278
   *
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
279
   * The dentry must already be unhashed and removed from the LRU.
d52b90864   Miklos Szeredi   fix quadratic beh...
280
281
   *
   * If this is the root of the dentry tree, return NULL.
230445078   Nick Piggin   fs: dcache scale lru
282
   *
b5c84bf6f   Nick Piggin   fs: dcache remove...
283
284
   * dentry->d_lock and parent->d_lock must be held by caller, and are dropped by
   * d_kill.
d52b90864   Miklos Szeredi   fix quadratic beh...
285
   */
2fd6b7f50   Nick Piggin   fs: dcache scale ...
286
  static struct dentry *d_kill(struct dentry *dentry, struct dentry *parent)
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
287
  	__releases(dentry->d_lock)
2fd6b7f50   Nick Piggin   fs: dcache scale ...
288
  	__releases(parent->d_lock)
873feea09   Nick Piggin   fs: dcache per-in...
289
  	__releases(dentry->d_inode->i_lock)
d52b90864   Miklos Szeredi   fix quadratic beh...
290
  {
d52b90864   Miklos Szeredi   fix quadratic beh...
291
  	list_del(&dentry->d_u.d_child);
c83ce989c   Trond Myklebust   VFS: Fix the nfs ...
292
293
294
295
296
  	/*
  	 * 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 ...
297
298
  	if (parent)
  		spin_unlock(&parent->d_lock);
d52b90864   Miklos Szeredi   fix quadratic beh...
299
  	dentry_iput(dentry);
b7ab39f63   Nick Piggin   fs: dcache scale ...
300
301
302
303
  	/*
  	 * dentry_iput drops the locks, at which point nobody (except
  	 * transient RCU lookups) can reach this dentry.
  	 */
d52b90864   Miklos Szeredi   fix quadratic beh...
304
  	d_free(dentry);
871c0067d   OGAWA Hirofumi   [PATCH vfs-2.6 1/...
305
  	return parent;
d52b90864   Miklos Szeredi   fix quadratic beh...
306
  }
c6627c60c   David Howells   VFS: Remove dentr...
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
  /*
   * 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 ...
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
  /**
   * 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...
344
  	if (!d_unhashed(dentry)) {
c6627c60c   David Howells   VFS: Remove dentr...
345
  		__d_shrink(dentry);
dea3667bc   Linus Torvalds   vfs: get rid of i...
346
  		dentry_rcuwalk_barrier(dentry);
789680d1e   Nick Piggin   fs: dcache scale ...
347
348
349
350
351
352
  	}
  }
  EXPORT_SYMBOL(__d_drop);
  
  void d_drop(struct dentry *dentry)
  {
789680d1e   Nick Piggin   fs: dcache scale ...
353
354
355
  	spin_lock(&dentry->d_lock);
  	__d_drop(dentry);
  	spin_unlock(&dentry->d_lock);
789680d1e   Nick Piggin   fs: dcache scale ...
356
357
  }
  EXPORT_SYMBOL(d_drop);
77812a1ef   Nick Piggin   fs: consolidate d...
358
  /*
44396f4b5   Josef Bacik   fs: add a DCACHE_...
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
   * 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...
377
378
379
380
381
382
383
384
   * 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...
385
  	struct inode *inode;
77812a1ef   Nick Piggin   fs: consolidate d...
386
  	struct dentry *parent;
873feea09   Nick Piggin   fs: dcache per-in...
387
388
  	inode = dentry->d_inode;
  	if (inode && !spin_trylock(&inode->i_lock)) {
77812a1ef   Nick Piggin   fs: consolidate d...
389
390
391
392
393
394
395
396
397
398
  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...
399
400
  		if (inode)
  			spin_unlock(&inode->i_lock);
77812a1ef   Nick Piggin   fs: consolidate d...
401
402
  		goto relock;
  	}
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
403

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

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

44396f4b5   Josef Bacik   fs: add a DCACHE_...
466
467
468
469
470
471
472
  	/*
  	 * 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...
473
  	dentry_lru_add(dentry);
265ac9023   Nick Piggin   fs: improve DCACH...
474

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

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

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

77812a1ef   Nick Piggin   fs: consolidate d...
679
  	parent = dentry_kill(dentry, 0);
d52b90864   Miklos Szeredi   fix quadratic beh...
680
  	/*
77812a1ef   Nick Piggin   fs: consolidate d...
681
682
683
684
685
686
687
688
  	 * 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...
689
  	 */
77812a1ef   Nick Piggin   fs: consolidate d...
690
691
692
693
694
695
696
  	if (!parent)
  		return;
  	if (parent == dentry)
  		return;
  
  	/* Prune ancestors. */
  	dentry = parent;
d52b90864   Miklos Szeredi   fix quadratic beh...
697
  	while (dentry) {
b7ab39f63   Nick Piggin   fs: dcache scale ...
698
  		spin_lock(&dentry->d_lock);
89e605483   Nick Piggin   fs: dcache reduce...
699
700
701
702
703
  		if (dentry->d_count > 1) {
  			dentry->d_count--;
  			spin_unlock(&dentry->d_lock);
  			return;
  		}
77812a1ef   Nick Piggin   fs: consolidate d...
704
  		dentry = dentry_kill(dentry, 1);
d52b90864   Miklos Szeredi   fix quadratic beh...
705
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
706
  }
3049cfe24   Christoph Hellwig   fs: split __shrin...
707
  static void shrink_dentry_list(struct list_head *list)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
708
  {
da3bbdd46   Kentaro Makita   fix soft lock up ...
709
  	struct dentry *dentry;
da3bbdd46   Kentaro Makita   fix soft lock up ...
710

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

ec33679d7   Nick Piggin   fs: use RCU in sh...
732
  		rcu_read_unlock();
77812a1ef   Nick Piggin   fs: consolidate d...
733
734
  
  		try_prune_one_dentry(dentry);
ec33679d7   Nick Piggin   fs: use RCU in sh...
735
  		rcu_read_lock();
da3bbdd46   Kentaro Makita   fix soft lock up ...
736
  	}
ec33679d7   Nick Piggin   fs: use RCU in sh...
737
  	rcu_read_unlock();
3049cfe24   Christoph Hellwig   fs: split __shrin...
738
739
740
741
742
743
744
745
746
747
  }
  
  /**
   * __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...
748
  static void __shrink_dcache_sb(struct super_block *sb, int count, int flags)
3049cfe24   Christoph Hellwig   fs: split __shrin...
749
  {
3049cfe24   Christoph Hellwig   fs: split __shrin...
750
751
752
  	struct dentry *dentry;
  	LIST_HEAD(referenced);
  	LIST_HEAD(tmp);
3049cfe24   Christoph Hellwig   fs: split __shrin...
753

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

c636ebdb1   David Howells   [PATCH] VFS: Dest...
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
  			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...
894
  				return;
c636ebdb1   David Howells   [PATCH] VFS: Dest...
895
  			dentry = parent;
c636ebdb1   David Howells   [PATCH] VFS: Dest...
896
897
898
899
900
901
902
903
904
  		} 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...
905
   * - we don't need to use dentry->d_lock because:
c636ebdb1   David Howells   [PATCH] VFS: Dest...
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
   *   - 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 ...
922
  	dentry->d_count--;
c636ebdb1   David Howells   [PATCH] VFS: Dest...
923
  	shrink_dcache_for_umount_subtree(dentry);
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
924
925
  	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...
926
927
928
929
930
  		shrink_dcache_for_umount_subtree(dentry);
  	}
  }
  
  /*
c826cb7df   Linus Torvalds   dcache.c: create ...
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
   * 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 ...
949
  		 (old->d_flags & DCACHE_DISCONNECTED) ||
c826cb7df   Linus Torvalds   dcache.c: create ...
950
951
952
953
954
955
956
957
958
959
  		 (!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
960
961
962
963
964
965
966
967
968
969
970
971
   * 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
972
973
  int have_submounts(struct dentry *parent)
  {
949854d02   Nick Piggin   fs: Use rename lo...
974
  	struct dentry *this_parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
975
  	struct list_head *next;
949854d02   Nick Piggin   fs: Use rename lo...
976
  	unsigned seq;
58db63d08   Nick Piggin   fs: dcache avoid ...
977
  	int locked = 0;
949854d02   Nick Piggin   fs: Use rename lo...
978

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

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

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

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

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1205
1206
  	return dentry;
  }
a4464dbc0   Al Viro   Make ->d_sb assig...
1207
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
  
  /**
   * 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...
1235
  EXPORT_SYMBOL(d_alloc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1236

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

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

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

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

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

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

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

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

9403540c0   Barry Naujok   dcache: Add case-...
1600
  	/*
44396f4b5   Josef Bacik   fs: add a DCACHE_...
1601
1602
  	 * 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-...
1603
  	 */
44396f4b5   Josef Bacik   fs: add a DCACHE_...
1604
1605
  	if (unlikely(d_need_lookup(found)))
  		d_clear_need_lookup(found);
b6520c819   Christoph Hellwig   cleanup d_add_ci
1606

9403540c0   Barry Naujok   dcache: Add case-...
1607
  	/*
9403540c0   Barry Naujok   dcache: Add case-...
1608
  	 * Negative dentry: instantiate it unless the inode is a directory and
b6520c819   Christoph Hellwig   cleanup d_add_ci
1609
  	 * already has a dentry.
9403540c0   Barry Naujok   dcache: Add case-...
1610
  	 */
4513d899c   Al Viro   switch d_add_ci()...
1611
1612
1613
1614
  	new = d_splice_alias(inode, found);
  	if (new) {
  		dput(found);
  		found = new;
9403540c0   Barry Naujok   dcache: Add case-...
1615
  	}
4513d899c   Al Viro   switch d_add_ci()...
1616
  	return found;
9403540c0   Barry Naujok   dcache: Add case-...
1617
1618
1619
1620
1621
  
  err_out:
  	iput(inode);
  	return ERR_PTR(error);
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1622
  EXPORT_SYMBOL(d_add_ci);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1623
1624
  
  /**
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
   * __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 '...
1657
  	struct hlist_bl_head *b = d_hash(parent, hash);
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
1658
  	struct hlist_bl_node *node;
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
  	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...
1679
  	 * See Documentation/filesystems/path-lookup.txt for more details.
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1680
  	 */
b07ad9967   Linus Torvalds   vfs: get rid of '...
1681
  	hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) {
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
  		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...
1698
  		prefetch(tname);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1699
1700
1701
1702
1703
1704
1705
1706
  		/*
  		 * 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...
1707
  		if (unlikely(parent->d_flags & DCACHE_OP_COMPARE)) {
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1708
1709
1710
1711
1712
  			if (parent->d_op->d_compare(parent, *inode,
  						dentry, i,
  						tlen, tname, name))
  				continue;
  		} else {
9d55c369b   Nick Piggin   fs: implement fas...
1713
  			if (dentry_cmp(tname, tlen, str, len))
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
  				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
1729
1730
1731
   * d_lookup - search for a dentry
   * @parent: parent dentry
   * @name: qstr of name we wish to find
b04f784e5   Nick Piggin   fs: remove extra ...
1732
   * Returns: dentry, or NULL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1733
   *
b04f784e5   Nick Piggin   fs: remove extra ...
1734
1735
1736
1737
   * 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
1738
   */
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1739
  struct dentry *d_lookup(struct dentry *parent, struct qstr *name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1740
  {
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1741
  	struct dentry *dentry;
949854d02   Nick Piggin   fs: Use rename lo...
1742
  	unsigned seq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1743
1744
1745
1746
1747
1748
1749
1750
1751
  
          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...
1752
  EXPORT_SYMBOL(d_lookup);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1753

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

b04f784e5   Nick Piggin   fs: remove extra ...
1779
  	/*
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1780
1781
1782
1783
1784
1785
1786
  	 * 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 ...
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
  	 * 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...
1797
  	 * See Documentation/filesystems/path-lookup.txt for more details.
b04f784e5   Nick Piggin   fs: remove extra ...
1798
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1799
1800
  	rcu_read_lock();
  	
b07ad9967   Linus Torvalds   vfs: get rid of '...
1801
  	hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) {
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1802
1803
  		const char *tname;
  		int tlen;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1804

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

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

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

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

fb2d5b86a   Nick Piggin   fs: name case upd...
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
  /**
   * 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...
1993
  	BUG_ON(!mutex_is_locked(&dentry->d_parent->d_inode->i_mutex));
fb2d5b86a   Nick Piggin   fs: name case upd...
1994
  	BUG_ON(dentry->d_name.len != name->len); /* d_lookup gives this */
fb2d5b86a   Nick Piggin   fs: name case upd...
1995
  	spin_lock(&dentry->d_lock);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1996
  	write_seqcount_begin(&dentry->d_seq);
fb2d5b86a   Nick Piggin   fs: name case upd...
1997
  	memcpy((unsigned char *)dentry->d_name.name, name->name, name->len);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1998
  	write_seqcount_end(&dentry->d_seq);
fb2d5b86a   Nick Piggin   fs: name case upd...
1999
  	spin_unlock(&dentry->d_lock);
fb2d5b86a   Nick Piggin   fs: name case upd...
2000
2001
  }
  EXPORT_SYMBOL(dentry_update_name_case);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2002
2003
2004
2005
2006
2007
2008
  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...
2009
  			swap(target->d_name.name, dentry->d_name.name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2010
2011
2012
2013
2014
  		} else {
  			/*
  			 * dentry:internal, target:external.  Steal target's
  			 * storage and make target internal.
  			 */
321bcf921   J. Bruce Fields   dcache: don't exp...
2015
2016
  			memcpy(target->d_iname, dentry->d_name.name,
  					dentry->d_name.len + 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
  			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(...
2036
2037
  			dentry->d_name.len = target->d_name.len;
  			return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2038
2039
  		}
  	}
9a8d5bb4a   Wu Fengguang   generic swap(): d...
2040
  	swap(dentry->d_name.len, target->d_name.len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2041
  }
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
  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
2077
  /*
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2078
2079
2080
2081
2082
2083
2084
2085
2086
   * 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
2087
   */
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2088
  /*
183675011   Al Viro   fix loop checks i...
2089
   * __d_move - move a dentry
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2090
2091
2092
2093
   * @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...
2094
2095
2096
   * 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
2097
   */
183675011   Al Viro   fix loop checks i...
2098
  static void __d_move(struct dentry * dentry, struct dentry * target)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2099
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2100
2101
2102
  	if (!dentry->d_inode)
  		printk(KERN_WARNING "VFS: moving negative dcache entry
  ");
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2103
2104
  	BUG_ON(d_ancestor(dentry, target));
  	BUG_ON(d_ancestor(target, dentry));
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2105
  	dentry_lock_for_move(dentry, target);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2106

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

31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2140
2141
  	write_seqcount_end(&target->d_seq);
  	write_seqcount_end(&dentry->d_seq);
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2142
  	dentry_unlock_parents_for_move(dentry, target);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2143
  	spin_unlock(&target->d_lock);
c32ccd87b   Nick Piggin   [PATCH] inotify: ...
2144
  	fsnotify_d_move(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2145
  	spin_unlock(&dentry->d_lock);
183675011   Al Viro   fix loop checks i...
2146
2147
2148
2149
2150
2151
2152
2153
  }
  
  /*
   * 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...
2154
2155
   * dcache entries should not be moved in this way. See the locking
   * requirements for __d_move.
183675011   Al Viro   fix loop checks i...
2156
2157
2158
2159
2160
   */
  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
2161
  	write_sequnlock(&rename_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2162
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2163
  EXPORT_SYMBOL(d_move);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2164

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

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

9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2281
2282
2283
2284
2285
2286
2287
  	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...
2288
2289
2290
2291
2292
2293
2294
2295
  			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...
2296
  				__d_materialise_dentry(dentry, alias);
183675011   Al Viro   fix loop checks i...
2297
  				write_sequnlock(&rename_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2298
2299
  				__d_drop(alias);
  				goto found;
183675011   Al Viro   fix loop checks i...
2300
2301
2302
2303
  			} else {
  				/* Nope, but we must(!) avoid directory
  				 * aliasing */
  				actual = __d_unalias(inode, dentry, alias);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2304
  			}
183675011   Al Viro   fix loop checks i...
2305
  			write_sequnlock(&rename_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2306
2307
2308
2309
  			if (IS_ERR(actual))
  				dput(alias);
  			goto out_nolock;
  		}
770bfad84   David Howells   NFS: Add dentry m...
2310
2311
2312
2313
2314
2315
  	}
  
  	/* Add a unique reference */
  	actual = __d_instantiate_unique(dentry, inode);
  	if (!actual)
  		actual = dentry;
357f8e658   Nick Piggin   fs: dcache reduce...
2316
2317
  	else
  		BUG_ON(!d_unhashed(actual));
770bfad84   David Howells   NFS: Add dentry m...
2318

770bfad84   David Howells   NFS: Add dentry m...
2319
2320
2321
2322
  	spin_lock(&actual->d_lock);
  found:
  	_d_rehash(actual);
  	spin_unlock(&actual->d_lock);
873feea09   Nick Piggin   fs: dcache per-in...
2323
  	spin_unlock(&inode->i_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2324
  out_nolock:
770bfad84   David Howells   NFS: Add dentry m...
2325
2326
2327
2328
2329
2330
2331
  	if (actual == dentry) {
  		security_d_instantiate(dentry, inode);
  		return NULL;
  	}
  
  	iput(inode);
  	return actual;
770bfad84   David Howells   NFS: Add dentry m...
2332
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2333
  EXPORT_SYMBOL_GPL(d_materialise_unique);
770bfad84   David Howells   NFS: Add dentry m...
2334

cdd16d026   Miklos Szeredi   [patch 2/3] vfs: ...
2335
  static int prepend(char **buffer, int *buflen, const char *str, int namelen)
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2336
2337
2338
2339
2340
2341
2342
2343
  {
  	*buflen -= namelen;
  	if (*buflen < 0)
  		return -ENAMETOOLONG;
  	*buffer -= namelen;
  	memcpy(*buffer, str, namelen);
  	return 0;
  }
cdd16d026   Miklos Szeredi   [patch 2/3] vfs: ...
2344
2345
2346
2347
  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
2348
  /**
208898c17   Randy Dunlap   fs: fix kernel-do...
2349
   * prepend_path - Prepend path string to a buffer
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
2350
2351
   * @path: the dentry/vfsmount to report
   * @root: root vfsmnt/dentry (may be modified by this function)
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2352
2353
   * @buffer: pointer to the end of the buffer
   * @buflen: pointer to buffer length
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2354
   *
949854d02   Nick Piggin   fs: Use rename lo...
2355
   * Caller holds the rename_lock.
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
2356
2357
2358
   *
   * If path is not reachable from the supplied root, then the value of
   * root is changed (without modifying refcounts).
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2359
   */
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2360
2361
  static int prepend_path(const struct path *path, struct path *root,
  			char **buffer, int *buflen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2362
  {
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
2363
2364
  	struct dentry *dentry = path->dentry;
  	struct vfsmount *vfsmnt = path->mnt;
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2365
2366
  	bool slash = false;
  	int error = 0;
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2367

99b7db7b8   Nick Piggin   fs: brlock vfsmou...
2368
  	br_read_lock(vfsmount_lock);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2369
  	while (dentry != root->dentry || vfsmnt != root->mnt) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2370
  		struct dentry * parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2371
  		if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) {
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2372
  			/* Global root? */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2373
  			if (vfsmnt->mnt_parent == vfsmnt) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2374
2375
2376
2377
  				goto global_root;
  			}
  			dentry = vfsmnt->mnt_mountpoint;
  			vfsmnt = vfsmnt->mnt_parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2378
2379
2380
2381
  			continue;
  		}
  		parent = dentry->d_parent;
  		prefetch(parent);
9abca3608   Nick Piggin   fs: increase d_na...
2382
  		spin_lock(&dentry->d_lock);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2383
  		error = prepend_name(buffer, buflen, &dentry->d_name);
9abca3608   Nick Piggin   fs: increase d_na...
2384
  		spin_unlock(&dentry->d_lock);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2385
2386
2387
2388
2389
2390
  		if (!error)
  			error = prepend(buffer, buflen, "/", 1);
  		if (error)
  			break;
  
  		slash = true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2391
2392
  		dentry = parent;
  	}
be285c712   Andreas Gruenbacher   [patch 3/3] vfs: ...
2393
  out:
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2394
2395
  	if (!error && !slash)
  		error = prepend(buffer, buflen, "/", 1);
99b7db7b8   Nick Piggin   fs: brlock vfsmou...
2396
  	br_read_unlock(vfsmount_lock);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2397
  	return error;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2398
2399
  
  global_root:
98dc568bc   Miklos Szeredi   vfs: __d_path: do...
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
  	/*
  	 * Filesystems needing to implement special "root names"
  	 * should do so with ->d_dname()
  	 */
  	if (IS_ROOT(dentry) &&
  	    (dentry->d_name.len != 1 || dentry->d_name.name[0] != '/')) {
  		WARN(1, "Root dentry has weird name <%.*s>
  ",
  		     (int) dentry->d_name.len, dentry->d_name.name);
  	}
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
2410
2411
  	root->mnt = vfsmnt;
  	root->dentry = dentry;
be285c712   Andreas Gruenbacher   [patch 3/3] vfs: ...
2412
  	goto out;
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2413
  }
be285c712   Andreas Gruenbacher   [patch 3/3] vfs: ...
2414

f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2415
2416
2417
2418
  /**
   * __d_path - return the path of a dentry
   * @path: the dentry/vfsmount to report
   * @root: root vfsmnt/dentry (may be modified by this function)
cd956a1c0   Randy Dunlap   fs/dcache: fix fu...
2419
   * @buf: buffer to return value in
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2420
2421
   * @buflen: buffer length
   *
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2422
   * Convert a dentry into an ASCII path name.
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2423
2424
2425
2426
   *
   * Returns a pointer into the buffer or an error code if the
   * path was too long.
   *
be148247c   Christoph Hellwig   fs: take dcache_l...
2427
   * "buflen" should be positive.
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
   *
   * If path is not reachable from the supplied root, then the value of
   * root is changed (without modifying refcounts).
   */
  char *__d_path(const struct path *path, struct path *root,
  	       char *buf, int buflen)
  {
  	char *res = buf + buflen;
  	int error;
  
  	prepend(&res, &buflen, "\0", 1);
949854d02   Nick Piggin   fs: Use rename lo...
2439
  	write_seqlock(&rename_lock);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2440
  	error = prepend_path(path, root, &res, &buflen);
949854d02   Nick Piggin   fs: Use rename lo...
2441
  	write_sequnlock(&rename_lock);
be148247c   Christoph Hellwig   fs: take dcache_l...
2442

f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2443
2444
  	if (error)
  		return ERR_PTR(error);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2445
  	return res;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2446
  }
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
  /*
   * same as __d_path but appends "(deleted)" for unlinked files.
   */
  static int path_with_deleted(const struct path *path, struct path *root,
  				 char **buf, int *buflen)
  {
  	prepend(buf, buflen, "\0", 1);
  	if (d_unlinked(path->dentry)) {
  		int error = prepend(buf, buflen, " (deleted)", 10);
  		if (error)
  			return error;
  	}
  
  	return prepend_path(path, root, buf, buflen);
  }
8df9d1a41   Miklos Szeredi   vfs: show unreach...
2462
2463
2464
2465
  static int prepend_unreachable(char **buffer, int *buflen)
  {
  	return prepend(buffer, buflen, "(unreachable)", 13);
  }
a03a8a709   Jan Blunck   d_path: kerneldoc...
2466
2467
  /**
   * d_path - return the path of a dentry
cf28b4863   Jan Blunck   d_path: Make d_pa...
2468
   * @path: path to report
a03a8a709   Jan Blunck   d_path: kerneldoc...
2469
2470
2471
2472
2473
2474
   * @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...
2475
2476
2477
2478
   * 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...
2479
   *
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
2480
   * "buflen" should be positive.
a03a8a709   Jan Blunck   d_path: kerneldoc...
2481
   */
20d4fdc1a   Jan Engelhardt   [patch 2/4] fs: m...
2482
  char *d_path(const struct path *path, char *buf, int buflen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2483
  {
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2484
  	char *res = buf + buflen;
6ac08c39a   Jan Blunck   Use struct path i...
2485
  	struct path root;
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
2486
  	struct path tmp;
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2487
  	int error;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2488

c23fbb6bc   Eric Dumazet   VFS: delay the de...
2489
2490
2491
2492
2493
2494
2495
  	/*
  	 * 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...
2496
2497
  	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...
2498

f7ad3c6be   Miklos Szeredi   vfs: add helpers ...
2499
  	get_fs_root(current->fs, &root);
949854d02   Nick Piggin   fs: Use rename lo...
2500
  	write_seqlock(&rename_lock);
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
2501
  	tmp = root;
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2502
2503
2504
  	error = path_with_deleted(path, &tmp, &res, &buflen);
  	if (error)
  		res = ERR_PTR(error);
949854d02   Nick Piggin   fs: Use rename lo...
2505
  	write_sequnlock(&rename_lock);
6ac08c39a   Jan Blunck   Use struct path i...
2506
  	path_put(&root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2507
2508
  	return res;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2509
  EXPORT_SYMBOL(d_path);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2510

8df9d1a41   Miklos Szeredi   vfs: show unreach...
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
  /**
   * d_path_with_unreachable - return the path of a dentry
   * @path: path to report
   * @buf: buffer to return value in
   * @buflen: buffer length
   *
   * The difference from d_path() is that this prepends "(unreachable)"
   * to paths which are unreachable from the current process' root.
   */
  char *d_path_with_unreachable(const struct path *path, char *buf, int buflen)
  {
  	char *res = buf + buflen;
  	struct path root;
  	struct path tmp;
  	int error;
  
  	if (path->dentry->d_op && path->dentry->d_op->d_dname)
  		return path->dentry->d_op->d_dname(path->dentry, buf, buflen);
  
  	get_fs_root(current->fs, &root);
949854d02   Nick Piggin   fs: Use rename lo...
2531
  	write_seqlock(&rename_lock);
8df9d1a41   Miklos Szeredi   vfs: show unreach...
2532
2533
2534
2535
  	tmp = root;
  	error = path_with_deleted(path, &tmp, &res, &buflen);
  	if (!error && !path_equal(&tmp, &root))
  		error = prepend_unreachable(&res, &buflen);
949854d02   Nick Piggin   fs: Use rename lo...
2536
  	write_sequnlock(&rename_lock);
8df9d1a41   Miklos Szeredi   vfs: show unreach...
2537
2538
2539
2540
2541
2542
  	path_put(&root);
  	if (error)
  		res =  ERR_PTR(error);
  
  	return res;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2543
  /*
c23fbb6bc   Eric Dumazet   VFS: delay the de...
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
   * 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: ...
2565
2566
   * Write full pathname from the root of the filesystem into the buffer.
   */
ec2447c27   Nick Piggin   hostfs: simplify ...
2567
  static char *__dentry_path(struct dentry *dentry, char *buf, int buflen)
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2568
2569
2570
  {
  	char *end = buf + buflen;
  	char *retval;
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2571
  	prepend(&end, &buflen, "\0", 1);
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2572
2573
2574
2575
2576
  	if (buflen < 1)
  		goto Elong;
  	/* Get '/' right */
  	retval = end-1;
  	*retval = '/';
cdd16d026   Miklos Szeredi   [patch 2/3] vfs: ...
2577
2578
  	while (!IS_ROOT(dentry)) {
  		struct dentry *parent = dentry->d_parent;
9abca3608   Nick Piggin   fs: increase d_na...
2579
  		int error;
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2580

6092d0481   Ram Pai   [patch 1/7] vfs: ...
2581
  		prefetch(parent);
9abca3608   Nick Piggin   fs: increase d_na...
2582
2583
2584
2585
  		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: ...
2586
2587
2588
2589
2590
  			goto Elong;
  
  		retval = end;
  		dentry = parent;
  	}
c103135c1   Al Viro   new helper: __den...
2591
2592
2593
2594
  	return retval;
  Elong:
  	return ERR_PTR(-ENAMETOOLONG);
  }
ec2447c27   Nick Piggin   hostfs: simplify ...
2595
2596
2597
2598
  
  char *dentry_path_raw(struct dentry *dentry, char *buf, int buflen)
  {
  	char *retval;
949854d02   Nick Piggin   fs: Use rename lo...
2599
  	write_seqlock(&rename_lock);
ec2447c27   Nick Piggin   hostfs: simplify ...
2600
  	retval = __dentry_path(dentry, buf, buflen);
949854d02   Nick Piggin   fs: Use rename lo...
2601
  	write_sequnlock(&rename_lock);
ec2447c27   Nick Piggin   hostfs: simplify ...
2602
2603
2604
2605
  
  	return retval;
  }
  EXPORT_SYMBOL(dentry_path_raw);
c103135c1   Al Viro   new helper: __den...
2606
2607
2608
2609
2610
  
  char *dentry_path(struct dentry *dentry, char *buf, int buflen)
  {
  	char *p = NULL;
  	char *retval;
949854d02   Nick Piggin   fs: Use rename lo...
2611
  	write_seqlock(&rename_lock);
c103135c1   Al Viro   new helper: __den...
2612
2613
2614
2615
2616
2617
2618
  	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...
2619
  	write_sequnlock(&rename_lock);
c103135c1   Al Viro   new helper: __den...
2620
2621
  	if (!IS_ERR(retval) && p)
  		*p = '/';	/* restore '/' overriden with '\0' */
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2622
2623
  	return retval;
  Elong:
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2624
2625
2626
2627
  	return ERR_PTR(-ENAMETOOLONG);
  }
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
   * 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...
2645
  SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2646
  {
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2647
  	int error;
6ac08c39a   Jan Blunck   Use struct path i...
2648
  	struct path pwd, root;
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2649
  	char *page = (char *) __get_free_page(GFP_USER);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2650
2651
2652
  
  	if (!page)
  		return -ENOMEM;
f7ad3c6be   Miklos Szeredi   vfs: add helpers ...
2653
  	get_fs_root_and_pwd(current->fs, &root, &pwd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2654

552ce544e   Linus Torvalds   Revert "[PATCH] F...
2655
  	error = -ENOENT;
949854d02   Nick Piggin   fs: Use rename lo...
2656
  	write_seqlock(&rename_lock);
f3da392e9   Alexey Dobriyan   dcache: extrace a...
2657
  	if (!d_unlinked(pwd.dentry)) {
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2658
  		unsigned long len;
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
2659
  		struct path tmp = root;
8df9d1a41   Miklos Szeredi   vfs: show unreach...
2660
2661
  		char *cwd = page + PAGE_SIZE;
  		int buflen = PAGE_SIZE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2662

8df9d1a41   Miklos Szeredi   vfs: show unreach...
2663
2664
  		prepend(&cwd, &buflen, "\0", 1);
  		error = prepend_path(&pwd, &tmp, &cwd, &buflen);
949854d02   Nick Piggin   fs: Use rename lo...
2665
  		write_sequnlock(&rename_lock);
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2666

8df9d1a41   Miklos Szeredi   vfs: show unreach...
2667
  		if (error)
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2668
  			goto out;
8df9d1a41   Miklos Szeredi   vfs: show unreach...
2669
2670
2671
2672
2673
2674
  		/* Unreachable from current root */
  		if (!path_equal(&tmp, &root)) {
  			error = prepend_unreachable(&cwd, &buflen);
  			if (error)
  				goto out;
  		}
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2675
2676
2677
2678
2679
2680
2681
  		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...
2682
2683
  	} else {
  		write_sequnlock(&rename_lock);
949854d02   Nick Piggin   fs: Use rename lo...
2684
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2685
2686
  
  out:
6ac08c39a   Jan Blunck   Use struct path i...
2687
2688
  	path_put(&pwd);
  	path_put(&root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
  	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/...
2709
  int is_subdir(struct dentry *new_dentry, struct dentry *old_dentry)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2710
2711
  {
  	int result;
949854d02   Nick Piggin   fs: Use rename lo...
2712
  	unsigned seq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2713

e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2714
2715
  	if (new_dentry == old_dentry)
  		return 1;
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2716
  	do {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2717
  		/* for restarting inner loop in case of seq retry */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2718
  		seq = read_seqbegin(&rename_lock);
949854d02   Nick Piggin   fs: Use rename lo...
2719
2720
2721
2722
2723
  		/*
  		 * 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/...
2724
  		if (d_ancestor(old_dentry, new_dentry))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2725
  			result = 1;
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2726
2727
  		else
  			result = 0;
949854d02   Nick Piggin   fs: Use rename lo...
2728
  		rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2729
  	} while (read_seqretry(&rename_lock, seq));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2730
2731
2732
  
  	return result;
  }
2096f759a   Al Viro   New helper: path_...
2733
2734
2735
2736
2737
  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...
2738
2739
  
  	br_read_lock(vfsmount_lock);
2096f759a   Al Viro   New helper: path_...
2740
2741
2742
  	if (mnt != path2->mnt) {
  		for (;;) {
  			if (mnt->mnt_parent == mnt) {
99b7db7b8   Nick Piggin   fs: brlock vfsmou...
2743
  				br_read_unlock(vfsmount_lock);
2096f759a   Al Viro   New helper: path_...
2744
2745
2746
2747
2748
2749
2750
2751
2752
  				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...
2753
  	br_read_unlock(vfsmount_lock);
2096f759a   Al Viro   New helper: path_...
2754
2755
2756
  	return res;
  }
  EXPORT_SYMBOL(path_is_under);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2757
2758
  void d_genocide(struct dentry *root)
  {
949854d02   Nick Piggin   fs: Use rename lo...
2759
  	struct dentry *this_parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2760
  	struct list_head *next;
949854d02   Nick Piggin   fs: Use rename lo...
2761
  	unsigned seq;
58db63d08   Nick Piggin   fs: dcache avoid ...
2762
  	int locked = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2763

949854d02   Nick Piggin   fs: Use rename lo...
2764
  	seq = read_seqbegin(&rename_lock);
58db63d08   Nick Piggin   fs: dcache avoid ...
2765
2766
  again:
  	this_parent = root;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2767
  	spin_lock(&this_parent->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2768
2769
2770
2771
2772
  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...
2773
  		struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2774
  		next = tmp->next;
949854d02   Nick Piggin   fs: Use rename lo...
2775

da5029563   Nick Piggin   fs: dcache scale ...
2776
2777
2778
  		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
2779
  			continue;
da5029563   Nick Piggin   fs: dcache scale ...
2780
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2781
  		if (!list_empty(&dentry->d_subdirs)) {
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2782
2783
  			spin_unlock(&this_parent->d_lock);
  			spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2784
  			this_parent = dentry;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2785
  			spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2786
2787
  			goto repeat;
  		}
949854d02   Nick Piggin   fs: Use rename lo...
2788
2789
2790
2791
  		if (!(dentry->d_flags & DCACHE_GENOCIDE)) {
  			dentry->d_flags |= DCACHE_GENOCIDE;
  			dentry->d_count--;
  		}
b7ab39f63   Nick Piggin   fs: dcache scale ...
2792
  		spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2793
2794
  	}
  	if (this_parent != root) {
c826cb7df   Linus Torvalds   dcache.c: create ...
2795
  		struct dentry *child = this_parent;
949854d02   Nick Piggin   fs: Use rename lo...
2796
2797
2798
2799
  		if (!(this_parent->d_flags & DCACHE_GENOCIDE)) {
  			this_parent->d_flags |= DCACHE_GENOCIDE;
  			this_parent->d_count--;
  		}
c826cb7df   Linus Torvalds   dcache.c: create ...
2800
2801
  		this_parent = try_to_ascend(this_parent, locked, seq);
  		if (!this_parent)
949854d02   Nick Piggin   fs: Use rename lo...
2802
  			goto rename_retry;
949854d02   Nick Piggin   fs: Use rename lo...
2803
  		next = child->d_u.d_child.next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2804
2805
  		goto resume;
  	}
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2806
  	spin_unlock(&this_parent->d_lock);
58db63d08   Nick Piggin   fs: dcache avoid ...
2807
  	if (!locked && read_seqretry(&rename_lock, seq))
949854d02   Nick Piggin   fs: Use rename lo...
2808
  		goto rename_retry;
58db63d08   Nick Piggin   fs: dcache avoid ...
2809
2810
2811
2812
2813
2814
2815
2816
  	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
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
  }
  
  /**
   * 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...
2837
2838
  	dentry = d_hash_and_lookup(dir, name);
  	if (dentry) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2839
2840
2841
2842
  		if (dentry->d_inode)
  			ino = dentry->d_inode->i_ino;
  		dput(dentry);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2843
2844
  	return ino;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2845
  EXPORT_SYMBOL(find_inode_number);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
  
  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 '...
2869
  					sizeof(struct hlist_bl_head),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2870
2871
2872
2873
2874
2875
2876
2877
  					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 '...
2878
  		INIT_HLIST_BL_HEAD(dentry_hashtable + loop);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2879
  }
74bf17cff   Denis Cheng   fs: remove the un...
2880
  static void __init dcache_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2881
2882
2883
2884
2885
2886
2887
2888
  {
  	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...
2889
2890
  	dentry_cache = KMEM_CACHE(dentry,
  		SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_MEM_SPREAD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2891
2892
2893
2894
2895
2896
2897
  
  	/* 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 '...
2898
  					sizeof(struct hlist_bl_head),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2899
2900
2901
2902
2903
2904
2905
2906
  					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 '...
2907
  		INIT_HLIST_BL_HEAD(dentry_hashtable + loop);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2908
2909
2910
  }
  
  /* SLAB cache for __getname() consumers */
e18b890bb   Christoph Lameter   [PATCH] slab: rem...
2911
  struct kmem_cache *names_cachep __read_mostly;
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2912
  EXPORT_SYMBOL(names_cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2913

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2914
  EXPORT_SYMBOL(d_genocide);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
  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...
2932
  			SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2933

74bf17cff   Denis Cheng   fs: remove the un...
2934
2935
  	dcache_init();
  	inode_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2936
  	files_init(mempages);
74bf17cff   Denis Cheng   fs: remove the un...
2937
  	mnt_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2938
2939
2940
  	bdev_cache_init();
  	chrdev_init();
  }