Blame view

fs/dcache.c 75.9 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);
  }
  
  /*
230445078   Nick Piggin   fs: dcache scale lru
217
   * dentry_lru_(add|del|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--;
  }
da3bbdd46   Kentaro Makita   fix soft lock up ...
235
236
237
  static void dentry_lru_del(struct dentry *dentry)
  {
  	if (!list_empty(&dentry->d_lru)) {
230445078   Nick Piggin   fs: dcache scale lru
238
239
240
  		spin_lock(&dcache_lru_lock);
  		__dentry_lru_del(dentry);
  		spin_unlock(&dcache_lru_lock);
da3bbdd46   Kentaro Makita   fix soft lock up ...
241
242
  	}
  }
a4633357a   Christoph Hellwig   fs: clean up dent...
243
  static void dentry_lru_move_tail(struct dentry *dentry)
da3bbdd46   Kentaro Makita   fix soft lock up ...
244
  {
230445078   Nick Piggin   fs: dcache scale lru
245
  	spin_lock(&dcache_lru_lock);
a4633357a   Christoph Hellwig   fs: clean up dent...
246
247
248
  	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...
249
  		dentry_stat.nr_unused++;
a4633357a   Christoph Hellwig   fs: clean up dent...
250
251
  	} else {
  		list_move_tail(&dentry->d_lru, &dentry->d_sb->s_dentry_lru);
da3bbdd46   Kentaro Makita   fix soft lock up ...
252
  	}
230445078   Nick Piggin   fs: dcache scale lru
253
  	spin_unlock(&dcache_lru_lock);
da3bbdd46   Kentaro Makita   fix soft lock up ...
254
  }
d52b90864   Miklos Szeredi   fix quadratic beh...
255
256
257
  /**
   * d_kill - kill dentry and return parent
   * @dentry: dentry to kill
ff5fdb614   Randy Dunlap   fs: fix new dcach...
258
   * @parent: parent dentry
d52b90864   Miklos Szeredi   fix quadratic beh...
259
   *
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
260
   * The dentry must already be unhashed and removed from the LRU.
d52b90864   Miklos Szeredi   fix quadratic beh...
261
262
   *
   * If this is the root of the dentry tree, return NULL.
230445078   Nick Piggin   fs: dcache scale lru
263
   *
b5c84bf6f   Nick Piggin   fs: dcache remove...
264
265
   * dentry->d_lock and parent->d_lock must be held by caller, and are dropped by
   * d_kill.
d52b90864   Miklos Szeredi   fix quadratic beh...
266
   */
2fd6b7f50   Nick Piggin   fs: dcache scale ...
267
  static struct dentry *d_kill(struct dentry *dentry, struct dentry *parent)
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
268
  	__releases(dentry->d_lock)
2fd6b7f50   Nick Piggin   fs: dcache scale ...
269
  	__releases(parent->d_lock)
873feea09   Nick Piggin   fs: dcache per-in...
270
  	__releases(dentry->d_inode->i_lock)
d52b90864   Miklos Szeredi   fix quadratic beh...
271
  {
d52b90864   Miklos Szeredi   fix quadratic beh...
272
  	list_del(&dentry->d_u.d_child);
c83ce989c   Trond Myklebust   VFS: Fix the nfs ...
273
274
275
276
277
  	/*
  	 * 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 ...
278
279
  	if (parent)
  		spin_unlock(&parent->d_lock);
d52b90864   Miklos Szeredi   fix quadratic beh...
280
  	dentry_iput(dentry);
b7ab39f63   Nick Piggin   fs: dcache scale ...
281
282
283
284
  	/*
  	 * dentry_iput drops the locks, at which point nobody (except
  	 * transient RCU lookups) can reach this dentry.
  	 */
d52b90864   Miklos Szeredi   fix quadratic beh...
285
  	d_free(dentry);
871c0067d   OGAWA Hirofumi   [PATCH vfs-2.6 1/...
286
  	return parent;
d52b90864   Miklos Szeredi   fix quadratic beh...
287
  }
c6627c60c   David Howells   VFS: Remove dentr...
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
  /*
   * 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 ...
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
  /**
   * 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...
325
  	if (!d_unhashed(dentry)) {
c6627c60c   David Howells   VFS: Remove dentr...
326
  		__d_shrink(dentry);
dea3667bc   Linus Torvalds   vfs: get rid of i...
327
  		dentry_rcuwalk_barrier(dentry);
789680d1e   Nick Piggin   fs: dcache scale ...
328
329
330
331
332
333
  	}
  }
  EXPORT_SYMBOL(__d_drop);
  
  void d_drop(struct dentry *dentry)
  {
789680d1e   Nick Piggin   fs: dcache scale ...
334
335
336
  	spin_lock(&dentry->d_lock);
  	__d_drop(dentry);
  	spin_unlock(&dentry->d_lock);
789680d1e   Nick Piggin   fs: dcache scale ...
337
338
  }
  EXPORT_SYMBOL(d_drop);
77812a1ef   Nick Piggin   fs: consolidate d...
339
  /*
44396f4b5   Josef Bacik   fs: add a DCACHE_...
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
   * 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...
358
359
360
361
362
363
364
365
   * 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...
366
  	struct inode *inode;
77812a1ef   Nick Piggin   fs: consolidate d...
367
  	struct dentry *parent;
873feea09   Nick Piggin   fs: dcache per-in...
368
369
  	inode = dentry->d_inode;
  	if (inode && !spin_trylock(&inode->i_lock)) {
77812a1ef   Nick Piggin   fs: consolidate d...
370
371
372
373
374
375
376
377
378
379
  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...
380
381
  		if (inode)
  			spin_unlock(&inode->i_lock);
77812a1ef   Nick Piggin   fs: consolidate d...
382
383
  		goto relock;
  	}
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
384

77812a1ef   Nick Piggin   fs: consolidate d...
385
386
387
388
389
390
391
392
  	if (ref)
  		dentry->d_count--;
  	/* if dentry was on the d_lru list delete it from there */
  	dentry_lru_del(dentry);
  	/* 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
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
  /* 
   * 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
418
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
419
420
421
422
423
424
  void dput(struct dentry *dentry)
  {
  	if (!dentry)
  		return;
  
  repeat:
b7ab39f63   Nick Piggin   fs: dcache scale ...
425
  	if (dentry->d_count == 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
426
  		might_sleep();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
427
  	spin_lock(&dentry->d_lock);
61f3dee4a   Nick Piggin   fs: dcache reduce...
428
429
430
  	BUG_ON(!dentry->d_count);
  	if (dentry->d_count > 1) {
  		dentry->d_count--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
431
  		spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
432
433
  		return;
  	}
fb045adb9   Nick Piggin   fs: dcache reduce...
434
  	if (dentry->d_flags & DCACHE_OP_DELETE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
435
  		if (dentry->d_op->d_delete(dentry))
61f3dee4a   Nick Piggin   fs: dcache reduce...
436
  			goto kill_it;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
437
  	}
265ac9023   Nick Piggin   fs: improve DCACH...
438

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

44396f4b5   Josef Bacik   fs: add a DCACHE_...
443
444
445
446
447
448
449
  	/*
  	 * 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...
450
  	dentry_lru_add(dentry);
265ac9023   Nick Piggin   fs: improve DCACH...
451

61f3dee4a   Nick Piggin   fs: dcache reduce...
452
453
  	dentry->d_count--;
  	spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
454
  	return;
d52b90864   Miklos Szeredi   fix quadratic beh...
455
  kill_it:
77812a1ef   Nick Piggin   fs: consolidate d...
456
  	dentry = dentry_kill(dentry, 1);
d52b90864   Miklos Szeredi   fix quadratic beh...
457
458
  	if (dentry)
  		goto repeat;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
459
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
460
  EXPORT_SYMBOL(dput);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
  
  /**
   * 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 ...
479
  	spin_lock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
480
  	if (d_unhashed(dentry)) {
da5029563   Nick Piggin   fs: dcache scale ...
481
  		spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
482
483
484
485
486
487
488
  		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 ...
489
  		spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
490
  		shrink_dcache_parent(dentry);
da5029563   Nick Piggin   fs: dcache scale ...
491
  		spin_lock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
492
493
494
495
496
497
498
499
500
501
502
503
  	}
  
  	/*
  	 * 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).
  	 */
b7ab39f63   Nick Piggin   fs: dcache scale ...
504
  	if (dentry->d_count > 1) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
505
506
  		if (dentry->d_inode && S_ISDIR(dentry->d_inode->i_mode)) {
  			spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
507
508
509
510
511
512
  			return -EBUSY;
  		}
  	}
  
  	__d_drop(dentry);
  	spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
513
514
  	return 0;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
515
  EXPORT_SYMBOL(d_invalidate);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
516

b5c84bf6f   Nick Piggin   fs: dcache remove...
517
  /* This must be called with d_lock held */
dc0474be3   Nick Piggin   fs: dcache ration...
518
  static inline void __dget_dlock(struct dentry *dentry)
230445078   Nick Piggin   fs: dcache scale lru
519
  {
b7ab39f63   Nick Piggin   fs: dcache scale ...
520
  	dentry->d_count++;
230445078   Nick Piggin   fs: dcache scale lru
521
  }
dc0474be3   Nick Piggin   fs: dcache ration...
522
  static inline void __dget(struct dentry *dentry)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
523
  {
230445078   Nick Piggin   fs: dcache scale lru
524
  	spin_lock(&dentry->d_lock);
dc0474be3   Nick Piggin   fs: dcache ration...
525
  	__dget_dlock(dentry);
230445078   Nick Piggin   fs: dcache scale lru
526
  	spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
527
  }
b7ab39f63   Nick Piggin   fs: dcache scale ...
528
529
530
531
532
  struct dentry *dget_parent(struct dentry *dentry)
  {
  	struct dentry *ret;
  
  repeat:
a734eb458   Nick Piggin   fs: dcache reduce...
533
534
535
536
537
  	/*
  	 * Don't need rcu_dereference because we re-check it was correct under
  	 * the lock.
  	 */
  	rcu_read_lock();
b7ab39f63   Nick Piggin   fs: dcache scale ...
538
  	ret = dentry->d_parent;
a734eb458   Nick Piggin   fs: dcache reduce...
539
540
541
542
  	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 ...
543
544
  		goto repeat;
  	}
a734eb458   Nick Piggin   fs: dcache reduce...
545
  	rcu_read_unlock();
b7ab39f63   Nick Piggin   fs: dcache scale ...
546
547
548
  	BUG_ON(!ret->d_count);
  	ret->d_count++;
  	spin_unlock(&ret->d_lock);
b7ab39f63   Nick Piggin   fs: dcache scale ...
549
550
551
  	return ret;
  }
  EXPORT_SYMBOL(dget_parent);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
552
553
554
555
556
557
558
559
560
561
562
563
  /**
   * 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...
564
   * If the inode has an IS_ROOT, DCACHE_DISCONNECTED alias, then prefer
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
565
   * any other hashed alias over that one unless @want_discon is set,
21c0d8fdd   NeilBrown   [PATCH] knfsd: cl...
566
   * in which case only return an IS_ROOT, DCACHE_DISCONNECTED alias.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
567
   */
da5029563   Nick Piggin   fs: dcache scale ...
568
  static struct dentry *__d_find_alias(struct inode *inode, int want_discon)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
569
  {
da5029563   Nick Piggin   fs: dcache scale ...
570
  	struct dentry *alias, *discon_alias;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
571

da5029563   Nick Piggin   fs: dcache scale ...
572
573
574
575
  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
576
   		if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) {
21c0d8fdd   NeilBrown   [PATCH] knfsd: cl...
577
  			if (IS_ROOT(alias) &&
da5029563   Nick Piggin   fs: dcache scale ...
578
  			    (alias->d_flags & DCACHE_DISCONNECTED)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
579
  				discon_alias = alias;
da5029563   Nick Piggin   fs: dcache scale ...
580
  			} else if (!want_discon) {
dc0474be3   Nick Piggin   fs: dcache ration...
581
  				__dget_dlock(alias);
da5029563   Nick Piggin   fs: dcache scale ...
582
583
584
585
586
587
588
589
590
591
592
593
  				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...
594
  				__dget_dlock(alias);
da5029563   Nick Piggin   fs: dcache scale ...
595
  				spin_unlock(&alias->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
596
597
598
  				return alias;
  			}
  		}
da5029563   Nick Piggin   fs: dcache scale ...
599
600
  		spin_unlock(&alias->d_lock);
  		goto again;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
601
  	}
da5029563   Nick Piggin   fs: dcache scale ...
602
  	return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
603
  }
da5029563   Nick Piggin   fs: dcache scale ...
604
  struct dentry *d_find_alias(struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
605
  {
214fda1f6   David Howells   [PATCH] Optimise ...
606
607
608
  	struct dentry *de = NULL;
  
  	if (!list_empty(&inode->i_dentry)) {
873feea09   Nick Piggin   fs: dcache per-in...
609
  		spin_lock(&inode->i_lock);
214fda1f6   David Howells   [PATCH] Optimise ...
610
  		de = __d_find_alias(inode, 0);
873feea09   Nick Piggin   fs: dcache per-in...
611
  		spin_unlock(&inode->i_lock);
214fda1f6   David Howells   [PATCH] Optimise ...
612
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
613
614
  	return de;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
615
  EXPORT_SYMBOL(d_find_alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
616
617
618
619
620
621
622
  
  /*
   *	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: ...
623
  	struct dentry *dentry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
624
  restart:
873feea09   Nick Piggin   fs: dcache per-in...
625
  	spin_lock(&inode->i_lock);
0cdca3f98   Domen Puncer   [PATCH] janitor: ...
626
  	list_for_each_entry(dentry, &inode->i_dentry, d_alias) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
627
  		spin_lock(&dentry->d_lock);
b7ab39f63   Nick Piggin   fs: dcache scale ...
628
  		if (!dentry->d_count) {
dc0474be3   Nick Piggin   fs: dcache ration...
629
  			__dget_dlock(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
630
631
  			__d_drop(dentry);
  			spin_unlock(&dentry->d_lock);
873feea09   Nick Piggin   fs: dcache per-in...
632
  			spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
633
634
635
636
637
  			dput(dentry);
  			goto restart;
  		}
  		spin_unlock(&dentry->d_lock);
  	}
873feea09   Nick Piggin   fs: dcache per-in...
638
  	spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
639
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
640
  EXPORT_SYMBOL(d_prune_aliases);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
641
642
  
  /*
77812a1ef   Nick Piggin   fs: consolidate d...
643
644
645
   * 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...
646
   *
77812a1ef   Nick Piggin   fs: consolidate d...
647
   * This may fail if locks cannot be acquired no problem, just try again.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
648
   */
77812a1ef   Nick Piggin   fs: consolidate d...
649
  static void try_prune_one_dentry(struct dentry *dentry)
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
650
  	__releases(dentry->d_lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
651
  {
77812a1ef   Nick Piggin   fs: consolidate d...
652
  	struct dentry *parent;
d52b90864   Miklos Szeredi   fix quadratic beh...
653

77812a1ef   Nick Piggin   fs: consolidate d...
654
  	parent = dentry_kill(dentry, 0);
d52b90864   Miklos Szeredi   fix quadratic beh...
655
  	/*
77812a1ef   Nick Piggin   fs: consolidate d...
656
657
658
659
660
661
662
663
  	 * 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...
664
  	 */
77812a1ef   Nick Piggin   fs: consolidate d...
665
666
667
668
669
670
671
  	if (!parent)
  		return;
  	if (parent == dentry)
  		return;
  
  	/* Prune ancestors. */
  	dentry = parent;
d52b90864   Miklos Szeredi   fix quadratic beh...
672
  	while (dentry) {
b7ab39f63   Nick Piggin   fs: dcache scale ...
673
  		spin_lock(&dentry->d_lock);
89e605483   Nick Piggin   fs: dcache reduce...
674
675
676
677
678
  		if (dentry->d_count > 1) {
  			dentry->d_count--;
  			spin_unlock(&dentry->d_lock);
  			return;
  		}
77812a1ef   Nick Piggin   fs: consolidate d...
679
  		dentry = dentry_kill(dentry, 1);
d52b90864   Miklos Szeredi   fix quadratic beh...
680
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
681
  }
3049cfe24   Christoph Hellwig   fs: split __shrin...
682
  static void shrink_dentry_list(struct list_head *list)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
683
  {
da3bbdd46   Kentaro Makita   fix soft lock up ...
684
  	struct dentry *dentry;
da3bbdd46   Kentaro Makita   fix soft lock up ...
685

ec33679d7   Nick Piggin   fs: use RCU in sh...
686
687
  	rcu_read_lock();
  	for (;;) {
ec33679d7   Nick Piggin   fs: use RCU in sh...
688
689
690
691
692
693
  		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
694
695
  			continue;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
696
697
  		/*
  		 * We found an inuse dentry which was not removed from
da3bbdd46   Kentaro Makita   fix soft lock up ...
698
699
  		 * 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
700
  		 */
b7ab39f63   Nick Piggin   fs: dcache scale ...
701
  		if (dentry->d_count) {
ec33679d7   Nick Piggin   fs: use RCU in sh...
702
  			dentry_lru_del(dentry);
da3bbdd46   Kentaro Makita   fix soft lock up ...
703
  			spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
704
705
  			continue;
  		}
ec33679d7   Nick Piggin   fs: use RCU in sh...
706

ec33679d7   Nick Piggin   fs: use RCU in sh...
707
  		rcu_read_unlock();
77812a1ef   Nick Piggin   fs: consolidate d...
708
709
  
  		try_prune_one_dentry(dentry);
ec33679d7   Nick Piggin   fs: use RCU in sh...
710
  		rcu_read_lock();
da3bbdd46   Kentaro Makita   fix soft lock up ...
711
  	}
ec33679d7   Nick Piggin   fs: use RCU in sh...
712
  	rcu_read_unlock();
3049cfe24   Christoph Hellwig   fs: split __shrin...
713
714
715
716
717
718
719
720
721
722
  }
  
  /**
   * __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...
723
  static void __shrink_dcache_sb(struct super_block *sb, int count, int flags)
3049cfe24   Christoph Hellwig   fs: split __shrin...
724
  {
3049cfe24   Christoph Hellwig   fs: split __shrin...
725
726
727
  	struct dentry *dentry;
  	LIST_HEAD(referenced);
  	LIST_HEAD(tmp);
3049cfe24   Christoph Hellwig   fs: split __shrin...
728

230445078   Nick Piggin   fs: dcache scale lru
729
730
  relock:
  	spin_lock(&dcache_lru_lock);
3049cfe24   Christoph Hellwig   fs: split __shrin...
731
732
733
734
  	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
735
736
737
738
739
  		if (!spin_trylock(&dentry->d_lock)) {
  			spin_unlock(&dcache_lru_lock);
  			cpu_relax();
  			goto relock;
  		}
3049cfe24   Christoph Hellwig   fs: split __shrin...
740
741
742
743
744
  		/*
  		 * 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
745
746
747
748
  		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...
749
  			spin_unlock(&dentry->d_lock);
230445078   Nick Piggin   fs: dcache scale lru
750
751
752
  		} else {
  			list_move_tail(&dentry->d_lru, &tmp);
  			spin_unlock(&dentry->d_lock);
b0d40c92a   Dave Chinner   superblock: intro...
753
  			if (!--count)
230445078   Nick Piggin   fs: dcache scale lru
754
  				break;
3049cfe24   Christoph Hellwig   fs: split __shrin...
755
  		}
ec33679d7   Nick Piggin   fs: use RCU in sh...
756
  		cond_resched_lock(&dcache_lru_lock);
3049cfe24   Christoph Hellwig   fs: split __shrin...
757
  	}
da3bbdd46   Kentaro Makita   fix soft lock up ...
758
759
  	if (!list_empty(&referenced))
  		list_splice(&referenced, &sb->s_dentry_lru);
230445078   Nick Piggin   fs: dcache scale lru
760
  	spin_unlock(&dcache_lru_lock);
ec33679d7   Nick Piggin   fs: use RCU in sh...
761
762
  
  	shrink_dentry_list(&tmp);
da3bbdd46   Kentaro Makita   fix soft lock up ...
763
764
765
  }
  
  /**
b0d40c92a   Dave Chinner   superblock: intro...
766
   * prune_dcache_sb - shrink the dcache
2af141626   Randy Dunlap   fs/dcache.c: fix ...
767
   * @sb: superblock
b0d40c92a   Dave Chinner   superblock: intro...
768
   * @nr_to_scan: number of entries to try to free
da3bbdd46   Kentaro Makita   fix soft lock up ...
769
   *
b0d40c92a   Dave Chinner   superblock: intro...
770
771
772
   * 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 ...
773
   *
b0d40c92a   Dave Chinner   superblock: intro...
774
775
   * This function may fail to free any resources if all the dentries are in
   * use.
da3bbdd46   Kentaro Makita   fix soft lock up ...
776
   */
b0d40c92a   Dave Chinner   superblock: intro...
777
  void prune_dcache_sb(struct super_block *sb, int nr_to_scan)
da3bbdd46   Kentaro Makita   fix soft lock up ...
778
  {
b0d40c92a   Dave Chinner   superblock: intro...
779
  	__shrink_dcache_sb(sb, nr_to_scan, DCACHE_REFERENCED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
780
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
781
782
783
784
  /**
   * shrink_dcache_sb - shrink dcache for a superblock
   * @sb: superblock
   *
3049cfe24   Christoph Hellwig   fs: split __shrin...
785
786
   * 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
787
   */
3049cfe24   Christoph Hellwig   fs: split __shrin...
788
  void shrink_dcache_sb(struct super_block *sb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
789
  {
3049cfe24   Christoph Hellwig   fs: split __shrin...
790
  	LIST_HEAD(tmp);
230445078   Nick Piggin   fs: dcache scale lru
791
  	spin_lock(&dcache_lru_lock);
3049cfe24   Christoph Hellwig   fs: split __shrin...
792
793
  	while (!list_empty(&sb->s_dentry_lru)) {
  		list_splice_init(&sb->s_dentry_lru, &tmp);
ec33679d7   Nick Piggin   fs: use RCU in sh...
794
  		spin_unlock(&dcache_lru_lock);
3049cfe24   Christoph Hellwig   fs: split __shrin...
795
  		shrink_dentry_list(&tmp);
ec33679d7   Nick Piggin   fs: use RCU in sh...
796
  		spin_lock(&dcache_lru_lock);
3049cfe24   Christoph Hellwig   fs: split __shrin...
797
  	}
230445078   Nick Piggin   fs: dcache scale lru
798
  	spin_unlock(&dcache_lru_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
799
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
800
  EXPORT_SYMBOL(shrink_dcache_sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
801
802
  
  /*
c636ebdb1   David Howells   [PATCH] VFS: Dest...
803
804
805
806
807
808
809
810
811
   * 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...
812
813
  	for (;;) {
  		/* descend to the first leaf in the current subtree */
43c1c9cd2   David Howells   VFS: Reorganise s...
814
  		while (!list_empty(&dentry->d_subdirs))
c636ebdb1   David Howells   [PATCH] VFS: Dest...
815
816
  			dentry = list_entry(dentry->d_subdirs.next,
  					    struct dentry, d_u.d_child);
c636ebdb1   David Howells   [PATCH] VFS: Dest...
817
818
819
820
821
  
  		/* consume the dentries from this leaf up through its parents
  		 * until we find one with children or run out altogether */
  		do {
  			struct inode *inode;
43c1c9cd2   David Howells   VFS: Reorganise s...
822
823
824
  			/* detach from the system */
  			dentry_lru_del(dentry);
  			__d_shrink(dentry);
b7ab39f63   Nick Piggin   fs: dcache scale ...
825
  			if (dentry->d_count != 0) {
c636ebdb1   David Howells   [PATCH] VFS: Dest...
826
827
828
829
830
831
832
833
834
  				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 ...
835
  				       dentry->d_count,
c636ebdb1   David Howells   [PATCH] VFS: Dest...
836
837
838
839
  				       dentry->d_sb->s_type->name,
  				       dentry->d_sb->s_id);
  				BUG();
  			}
2fd6b7f50   Nick Piggin   fs: dcache scale ...
840
  			if (IS_ROOT(dentry)) {
c636ebdb1   David Howells   [PATCH] VFS: Dest...
841
  				parent = NULL;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
842
843
  				list_del(&dentry->d_u.d_child);
  			} else {
871c0067d   OGAWA Hirofumi   [PATCH vfs-2.6 1/...
844
  				parent = dentry->d_parent;
b7ab39f63   Nick Piggin   fs: dcache scale ...
845
  				parent->d_count--;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
846
  				list_del(&dentry->d_u.d_child);
871c0067d   OGAWA Hirofumi   [PATCH vfs-2.6 1/...
847
  			}
c636ebdb1   David Howells   [PATCH] VFS: Dest...
848

c636ebdb1   David Howells   [PATCH] VFS: Dest...
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
  			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...
865
  				return;
c636ebdb1   David Howells   [PATCH] VFS: Dest...
866
  			dentry = parent;
c636ebdb1   David Howells   [PATCH] VFS: Dest...
867
868
869
870
871
872
873
874
875
  		} 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...
876
   * - we don't need to use dentry->d_lock because:
c636ebdb1   David Howells   [PATCH] VFS: Dest...
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
   *   - 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 ...
893
  	dentry->d_count--;
c636ebdb1   David Howells   [PATCH] VFS: Dest...
894
  	shrink_dcache_for_umount_subtree(dentry);
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
895
896
  	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...
897
898
899
900
901
  		shrink_dcache_for_umount_subtree(dentry);
  	}
  }
  
  /*
c826cb7df   Linus Torvalds   dcache.c: create ...
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
   * 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 ...
920
  		 (old->d_flags & DCACHE_DISCONNECTED) ||
c826cb7df   Linus Torvalds   dcache.c: create ...
921
922
923
924
925
926
927
928
929
930
  		 (!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
931
932
933
934
935
936
937
938
939
940
941
942
   * 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
943
944
  int have_submounts(struct dentry *parent)
  {
949854d02   Nick Piggin   fs: Use rename lo...
945
  	struct dentry *this_parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
946
  	struct list_head *next;
949854d02   Nick Piggin   fs: Use rename lo...
947
  	unsigned seq;
58db63d08   Nick Piggin   fs: dcache avoid ...
948
  	int locked = 0;
949854d02   Nick Piggin   fs: Use rename lo...
949

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
954
955
  	if (d_mountpoint(parent))
  		goto positive;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
956
  	spin_lock(&this_parent->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
957
958
959
960
961
  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...
962
  		struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
963
  		next = tmp->next;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
964
965
  
  		spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
966
  		/* Have we found a mount point ? */
2fd6b7f50   Nick Piggin   fs: dcache scale ...
967
968
969
  		if (d_mountpoint(dentry)) {
  			spin_unlock(&dentry->d_lock);
  			spin_unlock(&this_parent->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
970
  			goto positive;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
971
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
972
  		if (!list_empty(&dentry->d_subdirs)) {
2fd6b7f50   Nick Piggin   fs: dcache scale ...
973
974
  			spin_unlock(&this_parent->d_lock);
  			spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
975
  			this_parent = dentry;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
976
  			spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
977
978
  			goto repeat;
  		}
2fd6b7f50   Nick Piggin   fs: dcache scale ...
979
  		spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
980
981
982
983
984
  	}
  	/*
  	 * All done at this level ... ascend and resume the search.
  	 */
  	if (this_parent != parent) {
c826cb7df   Linus Torvalds   dcache.c: create ...
985
986
987
  		struct dentry *child = this_parent;
  		this_parent = try_to_ascend(this_parent, locked, seq);
  		if (!this_parent)
949854d02   Nick Piggin   fs: Use rename lo...
988
  			goto rename_retry;
949854d02   Nick Piggin   fs: Use rename lo...
989
  		next = child->d_u.d_child.next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
990
991
  		goto resume;
  	}
2fd6b7f50   Nick Piggin   fs: dcache scale ...
992
  	spin_unlock(&this_parent->d_lock);
58db63d08   Nick Piggin   fs: dcache avoid ...
993
  	if (!locked && read_seqretry(&rename_lock, seq))
949854d02   Nick Piggin   fs: Use rename lo...
994
  		goto rename_retry;
58db63d08   Nick Piggin   fs: dcache avoid ...
995
996
  	if (locked)
  		write_sequnlock(&rename_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
997
998
  	return 0; /* No mount points found in tree */
  positive:
58db63d08   Nick Piggin   fs: dcache avoid ...
999
  	if (!locked && read_seqretry(&rename_lock, seq))
949854d02   Nick Piggin   fs: Use rename lo...
1000
  		goto rename_retry;
58db63d08   Nick Piggin   fs: dcache avoid ...
1001
1002
  	if (locked)
  		write_sequnlock(&rename_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1003
  	return 1;
58db63d08   Nick Piggin   fs: dcache avoid ...
1004
1005
1006
1007
1008
  
  rename_retry:
  	locked = 1;
  	write_seqlock(&rename_lock);
  	goto again;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1009
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1010
  EXPORT_SYMBOL(have_submounts);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
  
  /*
   * 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...
1028
  	struct dentry *this_parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1029
  	struct list_head *next;
949854d02   Nick Piggin   fs: Use rename lo...
1030
  	unsigned seq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1031
  	int found = 0;
58db63d08   Nick Piggin   fs: dcache avoid ...
1032
  	int locked = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1033

949854d02   Nick Piggin   fs: Use rename lo...
1034
  	seq = read_seqbegin(&rename_lock);
58db63d08   Nick Piggin   fs: dcache avoid ...
1035
1036
  again:
  	this_parent = parent;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1037
  	spin_lock(&this_parent->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1038
1039
1040
1041
1042
  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...
1043
  		struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1044
  		next = tmp->next;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1045
  		spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
230445078   Nick Piggin   fs: dcache scale lru
1046

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1047
1048
1049
1050
  		/* 
  		 * move only zero ref count dentries to the end 
  		 * of the unused list for prune_dcache
  		 */
b7ab39f63   Nick Piggin   fs: dcache scale ...
1051
  		if (!dentry->d_count) {
a4633357a   Christoph Hellwig   fs: clean up dent...
1052
  			dentry_lru_move_tail(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1053
  			found++;
a4633357a   Christoph Hellwig   fs: clean up dent...
1054
1055
  		} else {
  			dentry_lru_del(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1056
1057
1058
1059
1060
1061
1062
  		}
  
  		/*
  		 * 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 ...
1063
1064
  		if (found && need_resched()) {
  			spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1065
  			goto out;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1066
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1067
1068
1069
1070
1071
  
  		/*
  		 * Descend a level if the d_subdirs list is non-empty.
  		 */
  		if (!list_empty(&dentry->d_subdirs)) {
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1072
1073
  			spin_unlock(&this_parent->d_lock);
  			spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1074
  			this_parent = dentry;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1075
  			spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1076
1077
  			goto repeat;
  		}
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1078
1079
  
  		spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1080
1081
1082
1083
1084
  	}
  	/*
  	 * All done at this level ... ascend and resume the search.
  	 */
  	if (this_parent != parent) {
c826cb7df   Linus Torvalds   dcache.c: create ...
1085
1086
1087
  		struct dentry *child = this_parent;
  		this_parent = try_to_ascend(this_parent, locked, seq);
  		if (!this_parent)
949854d02   Nick Piggin   fs: Use rename lo...
1088
  			goto rename_retry;
949854d02   Nick Piggin   fs: Use rename lo...
1089
  		next = child->d_u.d_child.next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1090
1091
1092
  		goto resume;
  	}
  out:
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1093
  	spin_unlock(&this_parent->d_lock);
58db63d08   Nick Piggin   fs: dcache avoid ...
1094
  	if (!locked && read_seqretry(&rename_lock, seq))
949854d02   Nick Piggin   fs: Use rename lo...
1095
  		goto rename_retry;
58db63d08   Nick Piggin   fs: dcache avoid ...
1096
1097
  	if (locked)
  		write_sequnlock(&rename_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1098
  	return found;
58db63d08   Nick Piggin   fs: dcache avoid ...
1099
1100
1101
1102
1103
1104
1105
  
  rename_retry:
  	if (found)
  		return found;
  	locked = 1;
  	write_seqlock(&rename_lock);
  	goto again;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
  }
  
  /**
   * 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 ...
1117
  	struct super_block *sb = parent->d_sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1118
1119
1120
  	int found;
  
  	while ((found = select_parent(parent)) != 0)
b0d40c92a   Dave Chinner   superblock: intro...
1121
  		__shrink_dcache_sb(sb, found, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1122
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1123
  EXPORT_SYMBOL(shrink_dcache_parent);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1124

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1125
  /**
a4464dbc0   Al Viro   Make ->d_sb assig...
1126
1127
   * __d_alloc	-	allocate a dcache entry
   * @sb: filesystem it will belong to
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1128
1129
1130
1131
1132
1133
1134
   * @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...
1135
  struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1136
1137
1138
  {
  	struct dentry *dentry;
  	char *dname;
e12ba74d8   Mel Gorman   Group short-lived...
1139
  	dentry = kmem_cache_alloc(dentry_cache, GFP_KERNEL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
  	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 ...
1158
  	dentry->d_count = 1;
dea3667bc   Linus Torvalds   vfs: get rid of i...
1159
  	dentry->d_flags = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1160
  	spin_lock_init(&dentry->d_lock);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1161
  	seqcount_init(&dentry->d_seq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1162
  	dentry->d_inode = NULL;
a4464dbc0   Al Viro   Make ->d_sb assig...
1163
1164
  	dentry->d_parent = dentry;
  	dentry->d_sb = sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1165
1166
  	dentry->d_op = NULL;
  	dentry->d_fsdata = NULL;
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
1167
  	INIT_HLIST_BL_NODE(&dentry->d_hash);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1168
1169
1170
  	INIT_LIST_HEAD(&dentry->d_lru);
  	INIT_LIST_HEAD(&dentry->d_subdirs);
  	INIT_LIST_HEAD(&dentry->d_alias);
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1171
  	INIT_LIST_HEAD(&dentry->d_u.d_child);
a4464dbc0   Al Viro   Make ->d_sb assig...
1172
  	d_set_d_op(dentry, dentry->d_sb->s_d_op);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1173

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1176
1177
  	return dentry;
  }
a4464dbc0   Al Viro   Make ->d_sb assig...
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
  
  /**
   * 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...
1206
  EXPORT_SYMBOL(d_alloc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1207

4b936885a   Nick Piggin   fs: improve scala...
1208
1209
  struct dentry *d_alloc_pseudo(struct super_block *sb, const struct qstr *name)
  {
a4464dbc0   Al Viro   Make ->d_sb assig...
1210
1211
  	struct dentry *dentry = __d_alloc(sb, name);
  	if (dentry)
4b936885a   Nick Piggin   fs: improve scala...
1212
  		dentry->d_flags |= DCACHE_DISCONNECTED;
4b936885a   Nick Piggin   fs: improve scala...
1213
1214
1215
  	return dentry;
  }
  EXPORT_SYMBOL(d_alloc_pseudo);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1216
1217
1218
1219
1220
1221
1222
1223
1224
  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...
1225
  EXPORT_SYMBOL(d_alloc_name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1226

fb045adb9   Nick Piggin   fs: dcache reduce...
1227
1228
  void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op)
  {
6f7f7caab   Linus Torvalds   Turn d_set_d_op()...
1229
1230
  	WARN_ON_ONCE(dentry->d_op);
  	WARN_ON_ONCE(dentry->d_flags & (DCACHE_OP_HASH	|
fb045adb9   Nick Piggin   fs: dcache reduce...
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
  				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;
  
  }
  EXPORT_SYMBOL(d_set_d_op);
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1248
1249
  static void __d_instantiate(struct dentry *dentry, struct inode *inode)
  {
b23fb0a60   Nick Piggin   fs: scale inode a...
1250
  	spin_lock(&dentry->d_lock);
9875cf806   David Howells   Add a dentry op t...
1251
1252
1253
  	if (inode) {
  		if (unlikely(IS_AUTOMOUNT(inode)))
  			dentry->d_flags |= DCACHE_NEED_AUTOMOUNT;
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1254
  		list_add(&dentry->d_alias, &inode->i_dentry);
9875cf806   David Howells   Add a dentry op t...
1255
  	}
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1256
  	dentry->d_inode = inode;
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1257
  	dentry_rcuwalk_barrier(dentry);
b23fb0a60   Nick Piggin   fs: scale inode a...
1258
  	spin_unlock(&dentry->d_lock);
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1259
1260
  	fsnotify_d_instantiate(dentry, inode);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
  /**
   * 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...
1278
  	BUG_ON(!list_empty(&entry->d_alias));
873feea09   Nick Piggin   fs: dcache per-in...
1279
1280
  	if (inode)
  		spin_lock(&inode->i_lock);
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1281
  	__d_instantiate(entry, inode);
873feea09   Nick Piggin   fs: dcache per-in...
1282
1283
  	if (inode)
  		spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1284
1285
  	security_d_instantiate(entry, inode);
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1286
  EXPORT_SYMBOL(d_instantiate);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1287
1288
1289
1290
1291
1292
1293
1294
  
  /**
   * 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...
1295
   * aliased dentry instead and drop one reference to inode.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1296
1297
1298
   *
   * 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...
1299
1300
1301
1302
   *
   * 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
1303
   */
770bfad84   David Howells   NFS: Add dentry m...
1304
1305
  static struct dentry *__d_instantiate_unique(struct dentry *entry,
  					     struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1306
1307
1308
1309
1310
  {
  	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...
1311
  	if (!inode) {
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1312
  		__d_instantiate(entry, NULL);
770bfad84   David Howells   NFS: Add dentry m...
1313
1314
  		return NULL;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1315
1316
  	list_for_each_entry(alias, &inode->i_dentry, d_alias) {
  		struct qstr *qstr = &alias->d_name;
9abca3608   Nick Piggin   fs: increase d_na...
1317
1318
1319
1320
1321
  		/*
  		 * 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
1322
1323
1324
1325
  		if (qstr->hash != hash)
  			continue;
  		if (alias->d_parent != entry->d_parent)
  			continue;
9d55c369b   Nick Piggin   fs: implement fas...
1326
  		if (dentry_cmp(qstr->name, qstr->len, name, len))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1327
  			continue;
dc0474be3   Nick Piggin   fs: dcache ration...
1328
  		__dget(alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1329
1330
  		return alias;
  	}
770bfad84   David Howells   NFS: Add dentry m...
1331

360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1332
  	__d_instantiate(entry, inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1333
1334
  	return NULL;
  }
770bfad84   David Howells   NFS: Add dentry m...
1335
1336
1337
1338
1339
1340
  
  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...
1341
1342
  	if (inode)
  		spin_lock(&inode->i_lock);
770bfad84   David Howells   NFS: Add dentry m...
1343
  	result = __d_instantiate_unique(entry, inode);
873feea09   Nick Piggin   fs: dcache per-in...
1344
1345
  	if (inode)
  		spin_unlock(&inode->i_lock);
770bfad84   David Howells   NFS: Add dentry m...
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
  
  	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
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
  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...
1373
1374
  		res = __d_alloc(root_inode->i_sb, &name);
  		if (res)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1375
  			d_instantiate(res, root_inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1376
1377
1378
  	}
  	return res;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1379
  EXPORT_SYMBOL(d_alloc_root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1380

d891eedbc   J. Bruce Fields   fs/dcache: allow ...
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
  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
1401
  /**
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
   * 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...
1414
1415
1416
1417
   * 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...
1418
1419
1420
   */
  struct dentry *d_obtain_alias(struct inode *inode)
  {
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1421
1422
1423
  	static const struct qstr anonstring = { .name = "" };
  	struct dentry *tmp;
  	struct dentry *res;
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1424
1425
  
  	if (!inode)
440037287   Christoph Hellwig   [PATCH] switch al...
1426
  		return ERR_PTR(-ESTALE);
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1427
1428
  	if (IS_ERR(inode))
  		return ERR_CAST(inode);
d891eedbc   J. Bruce Fields   fs/dcache: allow ...
1429
  	res = d_find_any_alias(inode);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1430
1431
  	if (res)
  		goto out_iput;
a4464dbc0   Al Viro   Make ->d_sb assig...
1432
  	tmp = __d_alloc(inode->i_sb, &anonstring);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1433
1434
1435
  	if (!tmp) {
  		res = ERR_PTR(-ENOMEM);
  		goto out_iput;
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1436
  	}
b5c84bf6f   Nick Piggin   fs: dcache remove...
1437

873feea09   Nick Piggin   fs: dcache per-in...
1438
  	spin_lock(&inode->i_lock);
d891eedbc   J. Bruce Fields   fs/dcache: allow ...
1439
  	res = __d_find_any_alias(inode);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1440
  	if (res) {
873feea09   Nick Piggin   fs: dcache per-in...
1441
  		spin_unlock(&inode->i_lock);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1442
1443
1444
1445
1446
1447
  		dput(tmp);
  		goto out_iput;
  	}
  
  	/* attach a disconnected dentry */
  	spin_lock(&tmp->d_lock);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1448
1449
  	tmp->d_inode = inode;
  	tmp->d_flags |= DCACHE_DISCONNECTED;
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1450
  	list_add(&tmp->d_alias, &inode->i_dentry);
1879fd6a2   Christoph Hellwig   add hlist_bl_lock...
1451
  	hlist_bl_lock(&tmp->d_sb->s_anon);
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
1452
  	hlist_bl_add_head(&tmp->d_hash, &tmp->d_sb->s_anon);
1879fd6a2   Christoph Hellwig   add hlist_bl_lock...
1453
  	hlist_bl_unlock(&tmp->d_sb->s_anon);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1454
  	spin_unlock(&tmp->d_lock);
873feea09   Nick Piggin   fs: dcache per-in...
1455
  	spin_unlock(&inode->i_lock);
24ff6663c   Josef Bacik   fs: call security...
1456
  	security_d_instantiate(tmp, inode);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1457

9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1458
1459
1460
  	return tmp;
  
   out_iput:
24ff6663c   Josef Bacik   fs: call security...
1461
1462
  	if (res && !IS_ERR(res))
  		security_d_instantiate(res, inode);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1463
1464
  	iput(inode);
  	return res;
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1465
  }
adc487204   Benny Halevy   EXPORT_SYMBOL(d_o...
1466
  EXPORT_SYMBOL(d_obtain_alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
  
  /**
   * 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...
1487
1488
  	if (IS_ERR(inode))
  		return ERR_CAST(inode);
21c0d8fdd   NeilBrown   [PATCH] knfsd: cl...
1489
  	if (inode && S_ISDIR(inode->i_mode)) {
873feea09   Nick Piggin   fs: dcache per-in...
1490
  		spin_lock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1491
1492
1493
  		new = __d_find_alias(inode, 1);
  		if (new) {
  			BUG_ON(!(new->d_flags & DCACHE_DISCONNECTED));
873feea09   Nick Piggin   fs: dcache per-in...
1494
  			spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1495
  			security_d_instantiate(new, inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1496
1497
1498
  			d_move(new, dentry);
  			iput(inode);
  		} else {
873feea09   Nick Piggin   fs: dcache per-in...
1499
  			/* already taking inode->i_lock, so d_add() by hand */
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1500
  			__d_instantiate(dentry, inode);
873feea09   Nick Piggin   fs: dcache per-in...
1501
  			spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1502
1503
1504
1505
1506
1507
1508
  			security_d_instantiate(dentry, inode);
  			d_rehash(dentry);
  		}
  	} else
  		d_add(dentry, inode);
  	return new;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1509
  EXPORT_SYMBOL(d_splice_alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1510

9403540c0   Barry Naujok   dcache: Add case-...
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
  /**
   * 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_...
1527
  struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode,
9403540c0   Barry Naujok   dcache: Add case-...
1528
1529
1530
1531
1532
  			struct qstr *name)
  {
  	int error;
  	struct dentry *found;
  	struct dentry *new;
b6520c819   Christoph Hellwig   cleanup d_add_ci
1533
1534
1535
1536
  	/*
  	 * First check if a dentry matching the name already exists,
  	 * if not go ahead and create it now.
  	 */
9403540c0   Barry Naujok   dcache: Add case-...
1537
  	found = d_hash_and_lookup(dentry->d_parent, name);
9403540c0   Barry Naujok   dcache: Add case-...
1538
1539
1540
1541
1542
1543
  	if (!found) {
  		new = d_alloc(dentry->d_parent, name);
  		if (!new) {
  			error = -ENOMEM;
  			goto err_out;
  		}
b6520c819   Christoph Hellwig   cleanup d_add_ci
1544

9403540c0   Barry Naujok   dcache: Add case-...
1545
1546
1547
1548
1549
1550
1551
  		found = d_splice_alias(inode, new);
  		if (found) {
  			dput(new);
  			return found;
  		}
  		return new;
  	}
b6520c819   Christoph Hellwig   cleanup d_add_ci
1552
1553
1554
1555
1556
1557
1558
  
  	/*
  	 * 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-...
1559
1560
1561
1562
1563
1564
  	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-...
1565
1566
1567
  		iput(inode);
  		return found;
  	}
b6520c819   Christoph Hellwig   cleanup d_add_ci
1568

9403540c0   Barry Naujok   dcache: Add case-...
1569
  	/*
44396f4b5   Josef Bacik   fs: add a DCACHE_...
1570
1571
  	 * 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-...
1572
  	 */
44396f4b5   Josef Bacik   fs: add a DCACHE_...
1573
1574
  	if (unlikely(d_need_lookup(found)))
  		d_clear_need_lookup(found);
b6520c819   Christoph Hellwig   cleanup d_add_ci
1575

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

31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1723
  /**
b04f784e5   Nick Piggin   fs: remove extra ...
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
   * __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 ...
1738
  struct dentry *__d_lookup(struct dentry *parent, struct qstr *name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1739
1740
1741
1742
  {
  	unsigned int len = name->len;
  	unsigned int hash = name->hash;
  	const unsigned char *str = name->name;
b07ad9967   Linus Torvalds   vfs: get rid of '...
1743
  	struct hlist_bl_head *b = d_hash(parent, hash);
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
1744
  	struct hlist_bl_node *node;
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1745
  	struct dentry *found = NULL;
665a7583f   Paul E. McKenney   [PATCH] Remove hl...
1746
  	struct dentry *dentry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1747

b04f784e5   Nick Piggin   fs: remove extra ...
1748
  	/*
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1749
1750
1751
1752
1753
1754
1755
  	 * 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 ...
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
  	 * 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...
1766
  	 * See Documentation/filesystems/path-lookup.txt for more details.
b04f784e5   Nick Piggin   fs: remove extra ...
1767
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1768
1769
  	rcu_read_lock();
  	
b07ad9967   Linus Torvalds   vfs: get rid of '...
1770
  	hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) {
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1771
1772
  		const char *tname;
  		int tlen;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1773

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1774
1775
  		if (dentry->d_name.hash != hash)
  			continue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1776
1777
  
  		spin_lock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1778
1779
  		if (dentry->d_parent != parent)
  			goto next;
d0185c088   Linus Torvalds   Fix NULL pointer ...
1780
1781
  		if (d_unhashed(dentry))
  			goto next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1782
1783
1784
1785
  		/*
  		 * It is safe to compare names since d_move() cannot
  		 * change the qstr (protected by d_lock).
  		 */
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1786
1787
  		tlen = dentry->d_name.len;
  		tname = dentry->d_name.name;
fb045adb9   Nick Piggin   fs: dcache reduce...
1788
  		if (parent->d_flags & DCACHE_OP_COMPARE) {
621e155a3   Nick Piggin   fs: change d_comp...
1789
1790
  			if (parent->d_op->d_compare(parent, parent->d_inode,
  						dentry, dentry->d_inode,
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1791
  						tlen, tname, name))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1792
1793
  				goto next;
  		} else {
9d55c369b   Nick Piggin   fs: implement fas...
1794
  			if (dentry_cmp(tname, tlen, str, len))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1795
1796
  				goto next;
  		}
b7ab39f63   Nick Piggin   fs: dcache scale ...
1797
  		dentry->d_count++;
d0185c088   Linus Torvalds   Fix NULL pointer ...
1798
  		found = dentry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
  		spin_unlock(&dentry->d_lock);
  		break;
  next:
  		spin_unlock(&dentry->d_lock);
   	}
   	rcu_read_unlock();
  
   	return found;
  }
  
  /**
3e7e241f8   Eric W. Biederman   [PATCH] dcache: A...
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
   * 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...
1826
  	if (dir->d_flags & DCACHE_OP_HASH) {
b1e6a015a   Nick Piggin   fs: change d_hash...
1827
  		if (dir->d_op->d_hash(dir, dir->d_inode, name) < 0)
3e7e241f8   Eric W. Biederman   [PATCH] dcache: A...
1828
1829
1830
1831
1832
1833
1834
1835
  			goto out;
  	}
  	dentry = d_lookup(dir, name);
  out:
  	return dentry;
  }
  
  /**
786a5e15b   Nick Piggin   fs: d_validate fixes
1836
   * d_validate - verify dentry provided from insecure source (deprecated)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1837
   * @dentry: The dentry alleged to be valid child of @dparent
ff5fdb614   Randy Dunlap   fs: fix new dcach...
1838
   * @dparent: The parent dentry (known to be valid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1839
1840
1841
1842
   *
   * 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
1843
1844
   *
   * This function is slow for big directories, and deprecated, do not use it.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1845
   */
d3a23e167   Nick Piggin   Revert "fs: use R...
1846
  int d_validate(struct dentry *dentry, struct dentry *dparent)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1847
  {
786a5e15b   Nick Piggin   fs: d_validate fixes
1848
  	struct dentry *child;
d3a23e167   Nick Piggin   Revert "fs: use R...
1849

2fd6b7f50   Nick Piggin   fs: dcache scale ...
1850
  	spin_lock(&dparent->d_lock);
786a5e15b   Nick Piggin   fs: d_validate fixes
1851
1852
  	list_for_each_entry(child, &dparent->d_subdirs, d_u.d_child) {
  		if (dentry == child) {
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1853
  			spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
dc0474be3   Nick Piggin   fs: dcache ration...
1854
  			__dget_dlock(dentry);
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1855
1856
  			spin_unlock(&dentry->d_lock);
  			spin_unlock(&dparent->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1857
1858
1859
  			return 1;
  		}
  	}
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1860
  	spin_unlock(&dparent->d_lock);
786a5e15b   Nick Piggin   fs: d_validate fixes
1861

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1862
1863
  	return 0;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1864
  EXPORT_SYMBOL(d_validate);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
  
  /*
   * 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...
1889
  	struct inode *inode;
7a91bf7f5   John McCutchan   [PATCH] fsnotify_...
1890
  	int isdir = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1891
1892
1893
  	/*
  	 * Are we the only user?
  	 */
357f8e658   Nick Piggin   fs: dcache reduce...
1894
  again:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1895
  	spin_lock(&dentry->d_lock);
873feea09   Nick Piggin   fs: dcache per-in...
1896
1897
  	inode = dentry->d_inode;
  	isdir = S_ISDIR(inode->i_mode);
b7ab39f63   Nick Piggin   fs: dcache scale ...
1898
  	if (dentry->d_count == 1) {
873feea09   Nick Piggin   fs: dcache per-in...
1899
  		if (inode && !spin_trylock(&inode->i_lock)) {
357f8e658   Nick Piggin   fs: dcache reduce...
1900
1901
1902
1903
  			spin_unlock(&dentry->d_lock);
  			cpu_relax();
  			goto again;
  		}
13e3c5e5b   Al Viro   clean DCACHE_CANT...
1904
  		dentry->d_flags &= ~DCACHE_CANT_MOUNT;
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1905
  		dentry_unlink_inode(dentry);
7a91bf7f5   John McCutchan   [PATCH] fsnotify_...
1906
  		fsnotify_nameremove(dentry, isdir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1907
1908
1909
1910
1911
1912
1913
  		return;
  	}
  
  	if (!d_unhashed(dentry))
  		__d_drop(dentry);
  
  	spin_unlock(&dentry->d_lock);
7a91bf7f5   John McCutchan   [PATCH] fsnotify_...
1914
1915
  
  	fsnotify_nameremove(dentry, isdir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1916
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1917
  EXPORT_SYMBOL(d_delete);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1918

b07ad9967   Linus Torvalds   vfs: get rid of '...
1919
  static void __d_rehash(struct dentry * entry, struct hlist_bl_head *b)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1920
  {
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
1921
  	BUG_ON(!d_unhashed(entry));
1879fd6a2   Christoph Hellwig   add hlist_bl_lock...
1922
  	hlist_bl_lock(b);
dea3667bc   Linus Torvalds   vfs: get rid of i...
1923
  	entry->d_flags |= DCACHE_RCUACCESS;
b07ad9967   Linus Torvalds   vfs: get rid of '...
1924
  	hlist_bl_add_head_rcu(&entry->d_hash, b);
1879fd6a2   Christoph Hellwig   add hlist_bl_lock...
1925
  	hlist_bl_unlock(b);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1926
  }
770bfad84   David Howells   NFS: Add dentry m...
1927
1928
1929
1930
  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
1931
1932
1933
1934
1935
1936
1937
1938
1939
  /**
   * 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
1940
  	spin_lock(&entry->d_lock);
770bfad84   David Howells   NFS: Add dentry m...
1941
  	_d_rehash(entry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1942
  	spin_unlock(&entry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1943
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1944
  EXPORT_SYMBOL(d_rehash);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1945

fb2d5b86a   Nick Piggin   fs: name case upd...
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
  /**
   * 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...
1962
  	BUG_ON(!mutex_is_locked(&dentry->d_parent->d_inode->i_mutex));
fb2d5b86a   Nick Piggin   fs: name case upd...
1963
  	BUG_ON(dentry->d_name.len != name->len); /* d_lookup gives this */
fb2d5b86a   Nick Piggin   fs: name case upd...
1964
  	spin_lock(&dentry->d_lock);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1965
  	write_seqcount_begin(&dentry->d_seq);
fb2d5b86a   Nick Piggin   fs: name case upd...
1966
  	memcpy((unsigned char *)dentry->d_name.name, name->name, name->len);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1967
  	write_seqcount_end(&dentry->d_seq);
fb2d5b86a   Nick Piggin   fs: name case upd...
1968
  	spin_unlock(&dentry->d_lock);
fb2d5b86a   Nick Piggin   fs: name case upd...
1969
1970
  }
  EXPORT_SYMBOL(dentry_update_name_case);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1971
1972
1973
1974
1975
1976
1977
  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...
1978
  			swap(target->d_name.name, dentry->d_name.name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1979
1980
1981
1982
1983
  		} else {
  			/*
  			 * dentry:internal, target:external.  Steal target's
  			 * storage and make target internal.
  			 */
321bcf921   J. Bruce Fields   dcache: don't exp...
1984
1985
  			memcpy(target->d_iname, dentry->d_name.name,
  					dentry->d_name.len + 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
  			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(...
2005
2006
  			dentry->d_name.len = target->d_name.len;
  			return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2007
2008
  		}
  	}
9a8d5bb4a   Wu Fengguang   generic swap(): d...
2009
  	swap(dentry->d_name.len, target->d_name.len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2010
  }
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
  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
2046
  /*
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2047
2048
2049
2050
2051
2052
2053
2054
2055
   * 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
2056
   */
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2057
  /*
183675011   Al Viro   fix loop checks i...
2058
   * __d_move - move a dentry
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2059
2060
2061
2062
   * @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...
2063
2064
2065
   * 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
2066
   */
183675011   Al Viro   fix loop checks i...
2067
  static void __d_move(struct dentry * dentry, struct dentry * target)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2068
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2069
2070
2071
  	if (!dentry->d_inode)
  		printk(KERN_WARNING "VFS: moving negative dcache entry
  ");
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2072
2073
  	BUG_ON(d_ancestor(dentry, target));
  	BUG_ON(d_ancestor(target, dentry));
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2074
  	dentry_lock_for_move(dentry, target);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2075

31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2076
2077
  	write_seqcount_begin(&dentry->d_seq);
  	write_seqcount_begin(&target->d_seq);
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
2078
2079
2080
2081
2082
2083
2084
  	/* __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 ...
2085
  	__d_rehash(dentry, d_hash(target->d_parent, target->d_name.hash));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2086
2087
2088
  
  	/* Unhash the target: dput() will then get rid of it */
  	__d_drop(target);
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
2089
2090
  	list_del(&dentry->d_u.d_child);
  	list_del(&target->d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2091
2092
2093
  
  	/* Switch the names.. */
  	switch_names(dentry, target);
9a8d5bb4a   Wu Fengguang   generic swap(): d...
2094
  	swap(dentry->d_name.hash, target->d_name.hash);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2095
2096
2097
2098
2099
  
  	/* ... and switch the parents */
  	if (IS_ROOT(dentry)) {
  		dentry->d_parent = target->d_parent;
  		target->d_parent = target;
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
2100
  		INIT_LIST_HEAD(&target->d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2101
  	} else {
9a8d5bb4a   Wu Fengguang   generic swap(): d...
2102
  		swap(dentry->d_parent, target->d_parent);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2103
2104
  
  		/* And add them back to the (new) parent lists */
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
2105
  		list_add(&target->d_u.d_child, &target->d_parent->d_subdirs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2106
  	}
5160ee6fc   Eric Dumazet   [PATCH] shrink de...
2107
  	list_add(&dentry->d_u.d_child, &dentry->d_parent->d_subdirs);
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2108

31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2109
2110
  	write_seqcount_end(&target->d_seq);
  	write_seqcount_end(&dentry->d_seq);
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2111
  	dentry_unlock_parents_for_move(dentry, target);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2112
  	spin_unlock(&target->d_lock);
c32ccd87b   Nick Piggin   [PATCH] inotify: ...
2113
  	fsnotify_d_move(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2114
  	spin_unlock(&dentry->d_lock);
183675011   Al Viro   fix loop checks i...
2115
2116
2117
2118
2119
2120
2121
2122
  }
  
  /*
   * 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...
2123
2124
   * dcache entries should not be moved in this way. See the locking
   * requirements for __d_move.
183675011   Al Viro   fix loop checks i...
2125
2126
2127
2128
2129
   */
  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
2130
  	write_sequnlock(&rename_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2131
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2132
  EXPORT_SYMBOL(d_move);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2133

e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2134
2135
2136
2137
2138
2139
2140
  /**
   * 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...
2141
   */
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2142
  struct dentry *d_ancestor(struct dentry *p1, struct dentry *p2)
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2143
2144
  {
  	struct dentry *p;
871c0067d   OGAWA Hirofumi   [PATCH vfs-2.6 1/...
2145
  	for (p = p2; !IS_ROOT(p); p = p->d_parent) {
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2146
  		if (p->d_parent == p1)
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2147
  			return p;
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2148
  	}
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2149
  	return NULL;
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2150
2151
2152
2153
2154
2155
  }
  
  /*
   * This helper attempts to cope with remotely renamed directories
   *
   * It assumes that the caller is already holding
183675011   Al Viro   fix loop checks i...
2156
   * dentry->d_parent->d_inode->i_mutex, inode->i_lock and rename_lock
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2157
2158
2159
   *
   * Note: If ever the locking in lock_rename() changes, then please
   * remember to update this too...
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2160
   */
873feea09   Nick Piggin   fs: dcache per-in...
2161
2162
  static struct dentry *__d_unalias(struct inode *inode,
  		struct dentry *dentry, struct dentry *alias)
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2163
2164
2165
2166
2167
2168
2169
  {
  	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...
2170
2171
2172
2173
2174
2175
2176
2177
2178
  	/* 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...
2179
  	__d_move(alias, dentry);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2180
2181
  	ret = alias;
  out_err:
873feea09   Nick Piggin   fs: dcache per-in...
2182
  	spin_unlock(&inode->i_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2183
2184
2185
2186
2187
2188
2189
2190
  	if (m2)
  		mutex_unlock(m2);
  	if (m1)
  		mutex_unlock(m1);
  	return ret;
  }
  
  /*
770bfad84   David Howells   NFS: Add dentry m...
2191
2192
   * 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 ...
2193
   * returns with anon->d_lock held!
770bfad84   David Howells   NFS: Add dentry m...
2194
2195
2196
2197
   */
  static void __d_materialise_dentry(struct dentry *dentry, struct dentry *anon)
  {
  	struct dentry *dparent, *aparent;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2198
  	dentry_lock_for_move(anon, dentry);
770bfad84   David Howells   NFS: Add dentry m...
2199

31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2200
2201
  	write_seqcount_begin(&dentry->d_seq);
  	write_seqcount_begin(&anon->d_seq);
770bfad84   David Howells   NFS: Add dentry m...
2202
2203
  	dparent = dentry->d_parent;
  	aparent = anon->d_parent;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2204
2205
  	switch_names(dentry, anon);
  	swap(dentry->d_name.hash, anon->d_name.hash);
770bfad84   David Howells   NFS: Add dentry m...
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
  	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 ...
2219
2220
  	write_seqcount_end(&dentry->d_seq);
  	write_seqcount_end(&anon->d_seq);
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2221
2222
2223
2224
  	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...
2225
2226
2227
2228
2229
2230
2231
2232
2233
  	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...
2234
2235
   * 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...
2236
2237
2238
   */
  struct dentry *d_materialise_unique(struct dentry *dentry, struct inode *inode)
  {
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2239
  	struct dentry *actual;
770bfad84   David Howells   NFS: Add dentry m...
2240
2241
  
  	BUG_ON(!d_unhashed(dentry));
770bfad84   David Howells   NFS: Add dentry m...
2242
2243
  	if (!inode) {
  		actual = dentry;
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
2244
  		__d_instantiate(dentry, NULL);
357f8e658   Nick Piggin   fs: dcache reduce...
2245
2246
  		d_rehash(actual);
  		goto out_nolock;
770bfad84   David Howells   NFS: Add dentry m...
2247
  	}
873feea09   Nick Piggin   fs: dcache per-in...
2248
  	spin_lock(&inode->i_lock);
357f8e658   Nick Piggin   fs: dcache reduce...
2249

9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2250
2251
2252
2253
2254
2255
2256
  	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...
2257
2258
2259
2260
2261
2262
2263
2264
  			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...
2265
  				__d_materialise_dentry(dentry, alias);
183675011   Al Viro   fix loop checks i...
2266
  				write_sequnlock(&rename_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2267
2268
  				__d_drop(alias);
  				goto found;
183675011   Al Viro   fix loop checks i...
2269
2270
2271
2272
  			} else {
  				/* Nope, but we must(!) avoid directory
  				 * aliasing */
  				actual = __d_unalias(inode, dentry, alias);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2273
  			}
183675011   Al Viro   fix loop checks i...
2274
  			write_sequnlock(&rename_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2275
2276
2277
2278
  			if (IS_ERR(actual))
  				dput(alias);
  			goto out_nolock;
  		}
770bfad84   David Howells   NFS: Add dentry m...
2279
2280
2281
2282
2283
2284
  	}
  
  	/* Add a unique reference */
  	actual = __d_instantiate_unique(dentry, inode);
  	if (!actual)
  		actual = dentry;
357f8e658   Nick Piggin   fs: dcache reduce...
2285
2286
  	else
  		BUG_ON(!d_unhashed(actual));
770bfad84   David Howells   NFS: Add dentry m...
2287

770bfad84   David Howells   NFS: Add dentry m...
2288
2289
2290
2291
  	spin_lock(&actual->d_lock);
  found:
  	_d_rehash(actual);
  	spin_unlock(&actual->d_lock);
873feea09   Nick Piggin   fs: dcache per-in...
2292
  	spin_unlock(&inode->i_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2293
  out_nolock:
770bfad84   David Howells   NFS: Add dentry m...
2294
2295
2296
2297
2298
2299
2300
  	if (actual == dentry) {
  		security_d_instantiate(dentry, inode);
  		return NULL;
  	}
  
  	iput(inode);
  	return actual;
770bfad84   David Howells   NFS: Add dentry m...
2301
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2302
  EXPORT_SYMBOL_GPL(d_materialise_unique);
770bfad84   David Howells   NFS: Add dentry m...
2303

cdd16d026   Miklos Szeredi   [patch 2/3] vfs: ...
2304
  static int prepend(char **buffer, int *buflen, const char *str, int namelen)
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2305
2306
2307
2308
2309
2310
2311
2312
  {
  	*buflen -= namelen;
  	if (*buflen < 0)
  		return -ENAMETOOLONG;
  	*buffer -= namelen;
  	memcpy(*buffer, str, namelen);
  	return 0;
  }
cdd16d026   Miklos Szeredi   [patch 2/3] vfs: ...
2313
2314
2315
2316
  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
2317
  /**
208898c17   Randy Dunlap   fs: fix kernel-do...
2318
   * prepend_path - Prepend path string to a buffer
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
2319
2320
   * @path: the dentry/vfsmount to report
   * @root: root vfsmnt/dentry (may be modified by this function)
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2321
2322
   * @buffer: pointer to the end of the buffer
   * @buflen: pointer to buffer length
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2323
   *
949854d02   Nick Piggin   fs: Use rename lo...
2324
   * Caller holds the rename_lock.
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
2325
2326
2327
   *
   * 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
2328
   */
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2329
2330
  static int prepend_path(const struct path *path, struct path *root,
  			char **buffer, int *buflen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2331
  {
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
2332
2333
  	struct dentry *dentry = path->dentry;
  	struct vfsmount *vfsmnt = path->mnt;
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2334
2335
  	bool slash = false;
  	int error = 0;
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2336

99b7db7b8   Nick Piggin   fs: brlock vfsmou...
2337
  	br_read_lock(vfsmount_lock);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2338
  	while (dentry != root->dentry || vfsmnt != root->mnt) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2339
  		struct dentry * parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2340
  		if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) {
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2341
  			/* Global root? */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2342
  			if (vfsmnt->mnt_parent == vfsmnt) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2343
2344
2345
2346
  				goto global_root;
  			}
  			dentry = vfsmnt->mnt_mountpoint;
  			vfsmnt = vfsmnt->mnt_parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2347
2348
2349
2350
  			continue;
  		}
  		parent = dentry->d_parent;
  		prefetch(parent);
9abca3608   Nick Piggin   fs: increase d_na...
2351
  		spin_lock(&dentry->d_lock);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2352
  		error = prepend_name(buffer, buflen, &dentry->d_name);
9abca3608   Nick Piggin   fs: increase d_na...
2353
  		spin_unlock(&dentry->d_lock);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2354
2355
2356
2357
2358
2359
  		if (!error)
  			error = prepend(buffer, buflen, "/", 1);
  		if (error)
  			break;
  
  		slash = true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2360
2361
  		dentry = parent;
  	}
be285c712   Andreas Gruenbacher   [patch 3/3] vfs: ...
2362
  out:
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2363
2364
  	if (!error && !slash)
  		error = prepend(buffer, buflen, "/", 1);
99b7db7b8   Nick Piggin   fs: brlock vfsmou...
2365
  	br_read_unlock(vfsmount_lock);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2366
  	return error;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2367
2368
  
  global_root:
98dc568bc   Miklos Szeredi   vfs: __d_path: do...
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
  	/*
  	 * 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: ...
2379
2380
  	root->mnt = vfsmnt;
  	root->dentry = dentry;
be285c712   Andreas Gruenbacher   [patch 3/3] vfs: ...
2381
  	goto out;
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2382
  }
be285c712   Andreas Gruenbacher   [patch 3/3] vfs: ...
2383

f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2384
2385
2386
2387
  /**
   * __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...
2388
   * @buf: buffer to return value in
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2389
2390
   * @buflen: buffer length
   *
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2391
   * Convert a dentry into an ASCII path name.
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2392
2393
2394
2395
   *
   * Returns a pointer into the buffer or an error code if the
   * path was too long.
   *
be148247c   Christoph Hellwig   fs: take dcache_l...
2396
   * "buflen" should be positive.
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
   *
   * 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...
2408
  	write_seqlock(&rename_lock);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2409
  	error = prepend_path(path, root, &res, &buflen);
949854d02   Nick Piggin   fs: Use rename lo...
2410
  	write_sequnlock(&rename_lock);
be148247c   Christoph Hellwig   fs: take dcache_l...
2411

f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2412
2413
  	if (error)
  		return ERR_PTR(error);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
2414
  	return res;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2415
  }
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
  /*
   * 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...
2431
2432
2433
2434
  static int prepend_unreachable(char **buffer, int *buflen)
  {
  	return prepend(buffer, buflen, "(unreachable)", 13);
  }
a03a8a709   Jan Blunck   d_path: kerneldoc...
2435
2436
  /**
   * d_path - return the path of a dentry
cf28b4863   Jan Blunck   d_path: Make d_pa...
2437
   * @path: path to report
a03a8a709   Jan Blunck   d_path: kerneldoc...
2438
2439
2440
2441
2442
2443
   * @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...
2444
2445
2446
2447
   * 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...
2448
   *
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
2449
   * "buflen" should be positive.
a03a8a709   Jan Blunck   d_path: kerneldoc...
2450
   */
20d4fdc1a   Jan Engelhardt   [patch 2/4] fs: m...
2451
  char *d_path(const struct path *path, char *buf, int buflen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2452
  {
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2453
  	char *res = buf + buflen;
6ac08c39a   Jan Blunck   Use struct path i...
2454
  	struct path root;
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
2455
  	struct path tmp;
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2456
  	int error;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2457

c23fbb6bc   Eric Dumazet   VFS: delay the de...
2458
2459
2460
2461
2462
2463
2464
  	/*
  	 * 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...
2465
2466
  	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...
2467

f7ad3c6be   Miklos Szeredi   vfs: add helpers ...
2468
  	get_fs_root(current->fs, &root);
949854d02   Nick Piggin   fs: Use rename lo...
2469
  	write_seqlock(&rename_lock);
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
2470
  	tmp = root;
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
2471
2472
2473
  	error = path_with_deleted(path, &tmp, &res, &buflen);
  	if (error)
  		res = ERR_PTR(error);
949854d02   Nick Piggin   fs: Use rename lo...
2474
  	write_sequnlock(&rename_lock);
6ac08c39a   Jan Blunck   Use struct path i...
2475
  	path_put(&root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2476
2477
  	return res;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2478
  EXPORT_SYMBOL(d_path);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2479

8df9d1a41   Miklos Szeredi   vfs: show unreach...
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
  /**
   * 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...
2500
  	write_seqlock(&rename_lock);
8df9d1a41   Miklos Szeredi   vfs: show unreach...
2501
2502
2503
2504
  	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...
2505
  	write_sequnlock(&rename_lock);
8df9d1a41   Miklos Szeredi   vfs: show unreach...
2506
2507
2508
2509
2510
2511
  	path_put(&root);
  	if (error)
  		res =  ERR_PTR(error);
  
  	return res;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2512
  /*
c23fbb6bc   Eric Dumazet   VFS: delay the de...
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
   * 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: ...
2534
2535
   * Write full pathname from the root of the filesystem into the buffer.
   */
ec2447c27   Nick Piggin   hostfs: simplify ...
2536
  static char *__dentry_path(struct dentry *dentry, char *buf, int buflen)
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2537
2538
2539
  {
  	char *end = buf + buflen;
  	char *retval;
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2540
  	prepend(&end, &buflen, "\0", 1);
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2541
2542
2543
2544
2545
  	if (buflen < 1)
  		goto Elong;
  	/* Get '/' right */
  	retval = end-1;
  	*retval = '/';
cdd16d026   Miklos Szeredi   [patch 2/3] vfs: ...
2546
2547
  	while (!IS_ROOT(dentry)) {
  		struct dentry *parent = dentry->d_parent;
9abca3608   Nick Piggin   fs: increase d_na...
2548
  		int error;
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2549

6092d0481   Ram Pai   [patch 1/7] vfs: ...
2550
  		prefetch(parent);
9abca3608   Nick Piggin   fs: increase d_na...
2551
2552
2553
2554
  		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: ...
2555
2556
2557
2558
2559
  			goto Elong;
  
  		retval = end;
  		dentry = parent;
  	}
c103135c1   Al Viro   new helper: __den...
2560
2561
2562
2563
  	return retval;
  Elong:
  	return ERR_PTR(-ENAMETOOLONG);
  }
ec2447c27   Nick Piggin   hostfs: simplify ...
2564
2565
2566
2567
  
  char *dentry_path_raw(struct dentry *dentry, char *buf, int buflen)
  {
  	char *retval;
949854d02   Nick Piggin   fs: Use rename lo...
2568
  	write_seqlock(&rename_lock);
ec2447c27   Nick Piggin   hostfs: simplify ...
2569
  	retval = __dentry_path(dentry, buf, buflen);
949854d02   Nick Piggin   fs: Use rename lo...
2570
  	write_sequnlock(&rename_lock);
ec2447c27   Nick Piggin   hostfs: simplify ...
2571
2572
2573
2574
  
  	return retval;
  }
  EXPORT_SYMBOL(dentry_path_raw);
c103135c1   Al Viro   new helper: __den...
2575
2576
2577
2578
2579
  
  char *dentry_path(struct dentry *dentry, char *buf, int buflen)
  {
  	char *p = NULL;
  	char *retval;
949854d02   Nick Piggin   fs: Use rename lo...
2580
  	write_seqlock(&rename_lock);
c103135c1   Al Viro   new helper: __den...
2581
2582
2583
2584
2585
2586
2587
  	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...
2588
  	write_sequnlock(&rename_lock);
c103135c1   Al Viro   new helper: __den...
2589
2590
  	if (!IS_ERR(retval) && p)
  		*p = '/';	/* restore '/' overriden with '\0' */
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2591
2592
  	return retval;
  Elong:
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2593
2594
2595
2596
  	return ERR_PTR(-ENAMETOOLONG);
  }
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
   * 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...
2614
  SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2615
  {
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2616
  	int error;
6ac08c39a   Jan Blunck   Use struct path i...
2617
  	struct path pwd, root;
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2618
  	char *page = (char *) __get_free_page(GFP_USER);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2619
2620
2621
  
  	if (!page)
  		return -ENOMEM;
f7ad3c6be   Miklos Szeredi   vfs: add helpers ...
2622
  	get_fs_root_and_pwd(current->fs, &root, &pwd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2623

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

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

8df9d1a41   Miklos Szeredi   vfs: show unreach...
2636
  		if (error)
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2637
  			goto out;
8df9d1a41   Miklos Szeredi   vfs: show unreach...
2638
2639
2640
2641
2642
2643
  		/* Unreachable from current root */
  		if (!path_equal(&tmp, &root)) {
  			error = prepend_unreachable(&cwd, &buflen);
  			if (error)
  				goto out;
  		}
552ce544e   Linus Torvalds   Revert "[PATCH] F...
2644
2645
2646
2647
2648
2649
2650
  		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...
2651
2652
  	} else {
  		write_sequnlock(&rename_lock);
949854d02   Nick Piggin   fs: Use rename lo...
2653
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2654
2655
  
  out:
6ac08c39a   Jan Blunck   Use struct path i...
2656
2657
  	path_put(&pwd);
  	path_put(&root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
  	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/...
2678
  int is_subdir(struct dentry *new_dentry, struct dentry *old_dentry)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2679
2680
  {
  	int result;
949854d02   Nick Piggin   fs: Use rename lo...
2681
  	unsigned seq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2682

e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2683
2684
  	if (new_dentry == old_dentry)
  		return 1;
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2685
  	do {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2686
  		/* for restarting inner loop in case of seq retry */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2687
  		seq = read_seqbegin(&rename_lock);
949854d02   Nick Piggin   fs: Use rename lo...
2688
2689
2690
2691
2692
  		/*
  		 * 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/...
2693
  		if (d_ancestor(old_dentry, new_dentry))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2694
  			result = 1;
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2695
2696
  		else
  			result = 0;
949854d02   Nick Piggin   fs: Use rename lo...
2697
  		rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2698
  	} while (read_seqretry(&rename_lock, seq));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2699
2700
2701
  
  	return result;
  }
2096f759a   Al Viro   New helper: path_...
2702
2703
2704
2705
2706
  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...
2707
2708
  
  	br_read_lock(vfsmount_lock);
2096f759a   Al Viro   New helper: path_...
2709
2710
2711
  	if (mnt != path2->mnt) {
  		for (;;) {
  			if (mnt->mnt_parent == mnt) {
99b7db7b8   Nick Piggin   fs: brlock vfsmou...
2712
  				br_read_unlock(vfsmount_lock);
2096f759a   Al Viro   New helper: path_...
2713
2714
2715
2716
2717
2718
2719
2720
2721
  				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...
2722
  	br_read_unlock(vfsmount_lock);
2096f759a   Al Viro   New helper: path_...
2723
2724
2725
  	return res;
  }
  EXPORT_SYMBOL(path_is_under);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2726
2727
  void d_genocide(struct dentry *root)
  {
949854d02   Nick Piggin   fs: Use rename lo...
2728
  	struct dentry *this_parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2729
  	struct list_head *next;
949854d02   Nick Piggin   fs: Use rename lo...
2730
  	unsigned seq;
58db63d08   Nick Piggin   fs: dcache avoid ...
2731
  	int locked = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2732

949854d02   Nick Piggin   fs: Use rename lo...
2733
  	seq = read_seqbegin(&rename_lock);
58db63d08   Nick Piggin   fs: dcache avoid ...
2734
2735
  again:
  	this_parent = root;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2736
  	spin_lock(&this_parent->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2737
2738
2739
2740
2741
  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...
2742
  		struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2743
  		next = tmp->next;
949854d02   Nick Piggin   fs: Use rename lo...
2744

da5029563   Nick Piggin   fs: dcache scale ...
2745
2746
2747
  		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
2748
  			continue;
da5029563   Nick Piggin   fs: dcache scale ...
2749
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2750
  		if (!list_empty(&dentry->d_subdirs)) {
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2751
2752
  			spin_unlock(&this_parent->d_lock);
  			spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2753
  			this_parent = dentry;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2754
  			spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2755
2756
  			goto repeat;
  		}
949854d02   Nick Piggin   fs: Use rename lo...
2757
2758
2759
2760
  		if (!(dentry->d_flags & DCACHE_GENOCIDE)) {
  			dentry->d_flags |= DCACHE_GENOCIDE;
  			dentry->d_count--;
  		}
b7ab39f63   Nick Piggin   fs: dcache scale ...
2761
  		spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2762
2763
  	}
  	if (this_parent != root) {
c826cb7df   Linus Torvalds   dcache.c: create ...
2764
  		struct dentry *child = this_parent;
949854d02   Nick Piggin   fs: Use rename lo...
2765
2766
2767
2768
  		if (!(this_parent->d_flags & DCACHE_GENOCIDE)) {
  			this_parent->d_flags |= DCACHE_GENOCIDE;
  			this_parent->d_count--;
  		}
c826cb7df   Linus Torvalds   dcache.c: create ...
2769
2770
  		this_parent = try_to_ascend(this_parent, locked, seq);
  		if (!this_parent)
949854d02   Nick Piggin   fs: Use rename lo...
2771
  			goto rename_retry;
949854d02   Nick Piggin   fs: Use rename lo...
2772
  		next = child->d_u.d_child.next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2773
2774
  		goto resume;
  	}
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2775
  	spin_unlock(&this_parent->d_lock);
58db63d08   Nick Piggin   fs: dcache avoid ...
2776
  	if (!locked && read_seqretry(&rename_lock, seq))
949854d02   Nick Piggin   fs: Use rename lo...
2777
  		goto rename_retry;
58db63d08   Nick Piggin   fs: dcache avoid ...
2778
2779
2780
2781
2782
2783
2784
2785
  	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
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
  }
  
  /**
   * 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...
2806
2807
  	dentry = d_hash_and_lookup(dir, name);
  	if (dentry) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2808
2809
2810
2811
  		if (dentry->d_inode)
  			ino = dentry->d_inode->i_ino;
  		dput(dentry);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2812
2813
  	return ino;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2814
  EXPORT_SYMBOL(find_inode_number);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
  
  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 '...
2838
  					sizeof(struct hlist_bl_head),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2839
2840
2841
2842
2843
2844
2845
2846
  					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 '...
2847
  		INIT_HLIST_BL_HEAD(dentry_hashtable + loop);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2848
  }
74bf17cff   Denis Cheng   fs: remove the un...
2849
  static void __init dcache_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2850
2851
2852
2853
2854
2855
2856
2857
  {
  	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...
2858
2859
  	dentry_cache = KMEM_CACHE(dentry,
  		SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_MEM_SPREAD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2860
2861
2862
2863
2864
2865
2866
  
  	/* 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 '...
2867
  					sizeof(struct hlist_bl_head),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2868
2869
2870
2871
2872
2873
2874
2875
  					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 '...
2876
  		INIT_HLIST_BL_HEAD(dentry_hashtable + loop);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2877
2878
2879
  }
  
  /* SLAB cache for __getname() consumers */
e18b890bb   Christoph Lameter   [PATCH] slab: rem...
2880
  struct kmem_cache *names_cachep __read_mostly;
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2881
  EXPORT_SYMBOL(names_cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2882

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2883
  EXPORT_SYMBOL(d_genocide);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
  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...
2901
  			SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2902

74bf17cff   Denis Cheng   fs: remove the un...
2903
2904
  	dcache_init();
  	inode_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2905
  	files_init(mempages);
74bf17cff   Denis Cheng   fs: remove the un...
2906
  	mnt_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2907
2908
2909
  	bdev_cache_init();
  	chrdev_init();
  }