Blame view

fs/dcache.c 96 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
  #include <linux/hash.h>
  #include <linux/cache.h>
630d9c472   Paul Gortmaker   fs: reduce the us...
25
  #include <linux/export.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
  #include <linux/mount.h>
  #include <linux/file.h>
7c0f6ba68   Linus Torvalds   Replace <asm/uacc...
28
  #include <linux/uaccess.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29
30
31
32
  #include <linux/security.h>
  #include <linux/seqlock.h>
  #include <linux/swap.h>
  #include <linux/bootmem.h>
5ad4e53bd   Al Viro   Get rid of indire...
33
  #include <linux/fs_struct.h>
613afbf83   Frederic Weisbecker   sched: Pull up th...
34
  #include <linux/hardirq.h>
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
35
36
  #include <linux/bit_spinlock.h>
  #include <linux/rculist_bl.h>
268bb0ce3   Linus Torvalds   sanitize <linux/p...
37
  #include <linux/prefetch.h>
dd179946d   David Howells   VFS: Log the fact...
38
  #include <linux/ratelimit.h>
f60415675   Dave Chinner   dcache: convert t...
39
  #include <linux/list_lru.h>
df4c0e36f   Andrey Ryabinin   fs: dcache: manua...
40
  #include <linux/kasan.h>
07f3f05c1   David Howells   [PATCH] BLOCK: Mo...
41
  #include "internal.h"
b2dba1af3   Al Viro   vfs: new internal...
42
  #include "mount.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43

789680d1e   Nick Piggin   fs: dcache scale ...
44
45
  /*
   * Usage:
873feea09   Nick Piggin   fs: dcache per-in...
46
   * dcache->d_inode->i_lock protects:
946e51f2b   Al Viro   move d_rcu from o...
47
   *   - i_dentry, d_u.d_alias, d_inode of aliases
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
48
49
50
51
   * dcache_hash_bucket lock protects:
   *   - the dcache hash table
   * s_anon bl list spinlock protects:
   *   - the s_anon list (see __d_drop)
19156840e   Dave Chinner   dentry: move to p...
52
   * dentry->d_sb->s_dentry_lru_lock protects:
230445078   Nick Piggin   fs: dcache scale lru
53
54
55
56
57
   *   - the dcache lru lists and counters
   * d_lock protects:
   *   - d_flags
   *   - d_name
   *   - d_lru
b7ab39f63   Nick Piggin   fs: dcache scale ...
58
   *   - d_count
da5029563   Nick Piggin   fs: dcache scale ...
59
   *   - d_unhashed()
2fd6b7f50   Nick Piggin   fs: dcache scale ...
60
61
   *   - d_parent and d_subdirs
   *   - childrens' d_child and d_parent
946e51f2b   Al Viro   move d_rcu from o...
62
   *   - d_u.d_alias, d_inode
789680d1e   Nick Piggin   fs: dcache scale ...
63
64
   *
   * Ordering:
873feea09   Nick Piggin   fs: dcache per-in...
65
   * dentry->d_inode->i_lock
b5c84bf6f   Nick Piggin   fs: dcache remove...
66
   *   dentry->d_lock
19156840e   Dave Chinner   dentry: move to p...
67
   *     dentry->d_sb->s_dentry_lru_lock
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
68
69
   *     dcache_hash_bucket lock
   *     s_anon lock
789680d1e   Nick Piggin   fs: dcache scale ...
70
   *
da5029563   Nick Piggin   fs: dcache scale ...
71
72
73
74
75
76
77
   * 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 ...
78
79
80
81
   * if (dentry1 < dentry2)
   *   dentry1->d_lock
   *     dentry2->d_lock
   */
fa3536cc1   Eric Dumazet   [PATCH] Use __rea...
82
  int sysctl_vfs_cache_pressure __read_mostly = 100;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83
  EXPORT_SYMBOL_GPL(sysctl_vfs_cache_pressure);
74c3cbe33   Al Viro   [PATCH] audit: wa...
84
  __cacheline_aligned_in_smp DEFINE_SEQLOCK(rename_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85

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

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

cdf01226b   David Howells   VFS: Provide empt...
90
91
92
93
  const struct qstr empty_name = QSTR_INIT("", 0);
  EXPORT_SYMBOL(empty_name);
  const struct qstr slash_name = QSTR_INIT("/", 1);
  EXPORT_SYMBOL(slash_name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
94
95
96
97
98
99
100
101
  /*
   * 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.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
102

fa3536cc1   Eric Dumazet   [PATCH] Use __rea...
103
104
  static unsigned int d_hash_mask __read_mostly;
  static unsigned int d_hash_shift __read_mostly;
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
105

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

8387ff257   Linus Torvalds   vfs: make the str...
108
  static inline struct hlist_bl_head *d_hash(unsigned int hash)
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
109
  {
703b5faf2   George Spelvin   fs/dcache.c: Save...
110
  	return dentry_hashtable + (hash >> (32 - d_hash_shift));
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
111
  }
94bdd655c   Al Viro   parallel lookups ...
112
113
114
115
116
117
118
119
120
  #define IN_LOOKUP_SHIFT 10
  static struct hlist_bl_head in_lookup_hashtable[1 << IN_LOOKUP_SHIFT];
  
  static inline struct hlist_bl_head *in_lookup_hash(const struct dentry *parent,
  					unsigned int hash)
  {
  	hash += (unsigned long) parent / L1_CACHE_BYTES;
  	return in_lookup_hashtable + hash_32(hash, IN_LOOKUP_SHIFT);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
121
122
123
124
  /* Statistics gathering. */
  struct dentry_stat_t dentry_stat = {
  	.age_limit = 45,
  };
3942c07cc   Glauber Costa   fs: bump inode an...
125
  static DEFINE_PER_CPU(long, nr_dentry);
62d36c770   Dave Chinner   dcache: convert d...
126
  static DEFINE_PER_CPU(long, nr_dentry_unused);
312d3ca85   Christoph Hellwig   fs: use percpu co...
127
128
  
  #if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS)
62d36c770   Dave Chinner   dcache: convert d...
129
130
131
132
133
134
135
136
137
138
139
140
141
  
  /*
   * Here we resort to our own counters instead of using generic per-cpu counters
   * for consistency with what the vfs inode code does. We are expected to harvest
   * better code and performance by having our own specialized counters.
   *
   * Please note that the loop is done over all possible CPUs, not over all online
   * CPUs. The reason for this is that we don't want to play games with CPUs going
   * on and off. If one of them goes off, we will just keep their counters.
   *
   * glommer: See cffbc8a for details, and if you ever intend to change this,
   * please update all vfs counters to match.
   */
3942c07cc   Glauber Costa   fs: bump inode an...
142
  static long get_nr_dentry(void)
3e880fb5e   Nick Piggin   fs: use fast coun...
143
144
  {
  	int i;
3942c07cc   Glauber Costa   fs: bump inode an...
145
  	long sum = 0;
3e880fb5e   Nick Piggin   fs: use fast coun...
146
147
148
149
  	for_each_possible_cpu(i)
  		sum += per_cpu(nr_dentry, i);
  	return sum < 0 ? 0 : sum;
  }
62d36c770   Dave Chinner   dcache: convert d...
150
151
152
153
154
155
156
157
  static long get_nr_dentry_unused(void)
  {
  	int i;
  	long sum = 0;
  	for_each_possible_cpu(i)
  		sum += per_cpu(nr_dentry_unused, i);
  	return sum < 0 ? 0 : sum;
  }
1f7e0616c   Joe Perches   fs: convert use o...
158
  int proc_nr_dentry(struct ctl_table *table, int write, void __user *buffer,
312d3ca85   Christoph Hellwig   fs: use percpu co...
159
160
  		   size_t *lenp, loff_t *ppos)
  {
3e880fb5e   Nick Piggin   fs: use fast coun...
161
  	dentry_stat.nr_dentry = get_nr_dentry();
62d36c770   Dave Chinner   dcache: convert d...
162
  	dentry_stat.nr_unused = get_nr_dentry_unused();
3942c07cc   Glauber Costa   fs: bump inode an...
163
  	return proc_doulongvec_minmax(table, write, buffer, lenp, ppos);
312d3ca85   Christoph Hellwig   fs: use percpu co...
164
165
  }
  #endif
5483f18e9   Linus Torvalds   vfs: move dentry_...
166
167
168
169
  /*
   * Compare 2 name strings, return 0 if they match, otherwise non-zero.
   * The strings are both count bytes long, and count is non-zero.
   */
e419b4cc5   Linus Torvalds   vfs: make word-at...
170
171
172
173
174
175
176
177
178
179
180
181
  #ifdef CONFIG_DCACHE_WORD_ACCESS
  
  #include <asm/word-at-a-time.h>
  /*
   * NOTE! 'cs' and 'scount' come from a dentry, so it has a
   * aligned allocation for this particular component. We don't
   * strictly need the load_unaligned_zeropad() safety, but it
   * doesn't hurt either.
   *
   * In contrast, 'ct' and 'tcount' can be from a pathname, and do
   * need the careful unaligned handling.
   */
94753db5e   Linus Torvalds   vfs: do the caref...
182
  static inline int dentry_string_cmp(const unsigned char *cs, const unsigned char *ct, unsigned tcount)
5483f18e9   Linus Torvalds   vfs: move dentry_...
183
  {
bfcfaa77b   Linus Torvalds   vfs: use 'unsigne...
184
  	unsigned long a,b,mask;
bfcfaa77b   Linus Torvalds   vfs: use 'unsigne...
185
186
  
  	for (;;) {
12f8ad4b0   Linus Torvalds   vfs: clean up __d...
187
  		a = *(unsigned long *)cs;
e419b4cc5   Linus Torvalds   vfs: make word-at...
188
  		b = load_unaligned_zeropad(ct);
bfcfaa77b   Linus Torvalds   vfs: use 'unsigne...
189
190
191
192
193
194
195
196
197
198
  		if (tcount < sizeof(unsigned long))
  			break;
  		if (unlikely(a != b))
  			return 1;
  		cs += sizeof(unsigned long);
  		ct += sizeof(unsigned long);
  		tcount -= sizeof(unsigned long);
  		if (!tcount)
  			return 0;
  	}
a5c21dcef   Will Deacon   dcache: allow wor...
199
  	mask = bytemask_from_count(tcount);
bfcfaa77b   Linus Torvalds   vfs: use 'unsigne...
200
  	return unlikely(!!((a ^ b) & mask));
e419b4cc5   Linus Torvalds   vfs: make word-at...
201
  }
bfcfaa77b   Linus Torvalds   vfs: use 'unsigne...
202
  #else
e419b4cc5   Linus Torvalds   vfs: make word-at...
203

94753db5e   Linus Torvalds   vfs: do the caref...
204
  static inline int dentry_string_cmp(const unsigned char *cs, const unsigned char *ct, unsigned tcount)
e419b4cc5   Linus Torvalds   vfs: make word-at...
205
  {
5483f18e9   Linus Torvalds   vfs: move dentry_...
206
207
208
209
210
211
212
213
214
  	do {
  		if (*cs != *ct)
  			return 1;
  		cs++;
  		ct++;
  		tcount--;
  	} while (tcount);
  	return 0;
  }
e419b4cc5   Linus Torvalds   vfs: make word-at...
215
  #endif
94753db5e   Linus Torvalds   vfs: do the caref...
216
217
  static inline int dentry_cmp(const struct dentry *dentry, const unsigned char *ct, unsigned tcount)
  {
94753db5e   Linus Torvalds   vfs: do the caref...
218
219
  	/*
  	 * Be careful about RCU walk racing with rename:
5383f45db   Will Deacon   locking/barriers:...
220
  	 * use 'READ_ONCE' to fetch the name pointer.
94753db5e   Linus Torvalds   vfs: do the caref...
221
222
223
224
225
226
227
228
229
230
231
232
233
  	 *
  	 * NOTE! Even if a rename will mean that the length
  	 * was not loaded atomically, we don't care. The
  	 * RCU walk will check the sequence count eventually,
  	 * and catch it. And we won't overrun the buffer,
  	 * because we're reading the name pointer atomically,
  	 * and a dentry name is guaranteed to be properly
  	 * terminated with a NUL byte.
  	 *
  	 * End result: even if 'len' is wrong, we'll exit
  	 * early because the data cannot match (there can
  	 * be no NUL in the ct/tcount data)
  	 */
5383f45db   Will Deacon   locking/barriers:...
234
  	const unsigned char *cs = READ_ONCE(dentry->d_name.name);
ae0a843c7   He Kuang   dentry_cmp(): use...
235

6326c71fd   Linus Torvalds   vfs: be even more...
236
  	return dentry_string_cmp(cs, ct, tcount);
94753db5e   Linus Torvalds   vfs: do the caref...
237
  }
8d85b4845   Al Viro   Allow sharing ext...
238
239
240
241
242
243
244
245
246
247
248
249
  struct external_name {
  	union {
  		atomic_t count;
  		struct rcu_head head;
  	} u;
  	unsigned char name[];
  };
  
  static inline struct external_name *external_name(struct dentry *dentry)
  {
  	return container_of(dentry->d_name.name, struct external_name, name[0]);
  }
9c82ab9c9   Christoph Hellwig   fs: simplify __d_...
250
  static void __d_free(struct rcu_head *head)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
251
  {
9c82ab9c9   Christoph Hellwig   fs: simplify __d_...
252
  	struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu);
8d85b4845   Al Viro   Allow sharing ext...
253
254
  	kmem_cache_free(dentry_cache, dentry); 
  }
6d7942377   Roman Gushchin   dcache: account e...
255
256
257
258
259
260
261
262
263
264
265
  static void __d_free_external_name(struct rcu_head *head)
  {
  	struct external_name *name = container_of(head, struct external_name,
  						  u.head);
  
  	mod_node_page_state(page_pgdat(virt_to_page(name)),
  			    NR_INDIRECTLY_RECLAIMABLE_BYTES,
  			    -ksize(name));
  
  	kfree(name);
  }
8d85b4845   Al Viro   Allow sharing ext...
266
267
268
  static void __d_free_external(struct rcu_head *head)
  {
  	struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu);
6d7942377   Roman Gushchin   dcache: account e...
269
270
271
272
  
  	__d_free_external_name(&external_name(dentry)->u.head);
  
  	kmem_cache_free(dentry_cache, dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
273
  }
810bb1726   Al Viro   take dname_extern...
274
275
276
277
  static inline int dname_external(const struct dentry *dentry)
  {
  	return dentry->d_name.name != dentry->d_iname;
  }
49d31c2f3   Al Viro   dentry name snaps...
278
279
280
281
282
283
284
285
286
  void take_dentry_name_snapshot(struct name_snapshot *name, struct dentry *dentry)
  {
  	spin_lock(&dentry->d_lock);
  	if (unlikely(dname_external(dentry))) {
  		struct external_name *p = external_name(dentry);
  		atomic_inc(&p->u.count);
  		spin_unlock(&dentry->d_lock);
  		name->name = p->name;
  	} else {
e20c4abf9   Tetsuo Handa   fs/dcache.c: fix ...
287
288
  		memcpy(name->inline_name, dentry->d_iname,
  		       dentry->d_name.len + 1);
49d31c2f3   Al Viro   dentry name snaps...
289
290
291
292
293
294
295
296
297
298
299
300
  		spin_unlock(&dentry->d_lock);
  		name->name = name->inline_name;
  	}
  }
  EXPORT_SYMBOL(take_dentry_name_snapshot);
  
  void release_dentry_name_snapshot(struct name_snapshot *name)
  {
  	if (unlikely(name->name != name->inline_name)) {
  		struct external_name *p;
  		p = container_of(name->name, struct external_name, name[0]);
  		if (unlikely(atomic_dec_and_test(&p->u.count)))
6d7942377   Roman Gushchin   dcache: account e...
301
  			call_rcu(&p->u.head, __d_free_external_name);
49d31c2f3   Al Viro   dentry name snaps...
302
303
304
  	}
  }
  EXPORT_SYMBOL(release_dentry_name_snapshot);
4bf46a272   David Howells   VFS: Impose order...
305
306
307
308
309
310
311
  static inline void __d_set_inode_and_type(struct dentry *dentry,
  					  struct inode *inode,
  					  unsigned type_flags)
  {
  	unsigned flags;
  
  	dentry->d_inode = inode;
4bf46a272   David Howells   VFS: Impose order...
312
313
314
315
316
  	flags = READ_ONCE(dentry->d_flags);
  	flags &= ~(DCACHE_ENTRY_TYPE | DCACHE_FALLTHRU);
  	flags |= type_flags;
  	WRITE_ONCE(dentry->d_flags, flags);
  }
4bf46a272   David Howells   VFS: Impose order...
317
318
319
320
321
322
  static inline void __d_clear_type_and_inode(struct dentry *dentry)
  {
  	unsigned flags = READ_ONCE(dentry->d_flags);
  
  	flags &= ~(DCACHE_ENTRY_TYPE | DCACHE_FALLTHRU);
  	WRITE_ONCE(dentry->d_flags, flags);
4bf46a272   David Howells   VFS: Impose order...
323
324
  	dentry->d_inode = NULL;
  }
b4f0354e9   Al Viro   new helper: dentr...
325
326
  static void dentry_free(struct dentry *dentry)
  {
946e51f2b   Al Viro   move d_rcu from o...
327
  	WARN_ON(!hlist_unhashed(&dentry->d_u.d_alias));
8d85b4845   Al Viro   Allow sharing ext...
328
329
330
331
332
333
334
  	if (unlikely(dname_external(dentry))) {
  		struct external_name *p = external_name(dentry);
  		if (likely(atomic_dec_and_test(&p->u.count))) {
  			call_rcu(&dentry->d_u.d_rcu, __d_free_external);
  			return;
  		}
  	}
b4f0354e9   Al Viro   new helper: dentr...
335
336
337
338
339
340
  	/* if dentry was never visible to RCU, immediate free is OK */
  	if (!(dentry->d_flags & DCACHE_RCUACCESS))
  		__d_free(&dentry->d_u.d_rcu);
  	else
  		call_rcu(&dentry->d_u.d_rcu, __d_free);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
341
342
  /*
   * Release the dentry's inode, using the filesystem
550dce01d   Al Viro   unify dentry_iput...
343
   * d_iput() operation if defined.
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
344
345
346
   */
  static void dentry_unlink_inode(struct dentry * dentry)
  	__releases(dentry->d_lock)
873feea09   Nick Piggin   fs: dcache per-in...
347
  	__releases(dentry->d_inode->i_lock)
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
348
349
  {
  	struct inode *inode = dentry->d_inode;
a528aca7f   Al Viro   use ->d_seq to ge...
350

d5426a384   Al Viro   make sure that __...
351
  	raw_write_seqcount_begin(&dentry->d_seq);
4bf46a272   David Howells   VFS: Impose order...
352
  	__d_clear_type_and_inode(dentry);
946e51f2b   Al Viro   move d_rcu from o...
353
  	hlist_del_init(&dentry->d_u.d_alias);
d5426a384   Al Viro   make sure that __...
354
  	raw_write_seqcount_end(&dentry->d_seq);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
355
  	spin_unlock(&dentry->d_lock);
873feea09   Nick Piggin   fs: dcache per-in...
356
  	spin_unlock(&inode->i_lock);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
357
358
359
360
361
362
363
364
365
  	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);
  }
  
  /*
89dc77bcd   Linus Torvalds   vfs: fix dentry L...
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
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
   * The DCACHE_LRU_LIST bit is set whenever the 'd_lru' entry
   * is in use - which includes both the "real" per-superblock
   * LRU list _and_ the DCACHE_SHRINK_LIST use.
   *
   * The DCACHE_SHRINK_LIST bit is set whenever the dentry is
   * on the shrink list (ie not on the superblock LRU list).
   *
   * The per-cpu "nr_dentry_unused" counters are updated with
   * the DCACHE_LRU_LIST bit.
   *
   * These helper functions make sure we always follow the
   * rules. d_lock must be held by the caller.
   */
  #define D_FLAG_VERIFY(dentry,x) WARN_ON_ONCE(((dentry)->d_flags & (DCACHE_LRU_LIST | DCACHE_SHRINK_LIST)) != (x))
  static void d_lru_add(struct dentry *dentry)
  {
  	D_FLAG_VERIFY(dentry, 0);
  	dentry->d_flags |= DCACHE_LRU_LIST;
  	this_cpu_inc(nr_dentry_unused);
  	WARN_ON_ONCE(!list_lru_add(&dentry->d_sb->s_dentry_lru, &dentry->d_lru));
  }
  
  static void d_lru_del(struct dentry *dentry)
  {
  	D_FLAG_VERIFY(dentry, DCACHE_LRU_LIST);
  	dentry->d_flags &= ~DCACHE_LRU_LIST;
  	this_cpu_dec(nr_dentry_unused);
  	WARN_ON_ONCE(!list_lru_del(&dentry->d_sb->s_dentry_lru, &dentry->d_lru));
  }
  
  static void d_shrink_del(struct dentry *dentry)
  {
  	D_FLAG_VERIFY(dentry, DCACHE_SHRINK_LIST | DCACHE_LRU_LIST);
  	list_del_init(&dentry->d_lru);
  	dentry->d_flags &= ~(DCACHE_SHRINK_LIST | DCACHE_LRU_LIST);
  	this_cpu_dec(nr_dentry_unused);
  }
  
  static void d_shrink_add(struct dentry *dentry, struct list_head *list)
  {
  	D_FLAG_VERIFY(dentry, 0);
  	list_add(&dentry->d_lru, list);
  	dentry->d_flags |= DCACHE_SHRINK_LIST | DCACHE_LRU_LIST;
  	this_cpu_inc(nr_dentry_unused);
  }
  
  /*
   * These can only be called under the global LRU lock, ie during the
   * callback for freeing the LRU list. "isolate" removes it from the
   * LRU lists entirely, while shrink_move moves it to the indicated
   * private list.
   */
3f97b1632   Vladimir Davydov   list_lru: add hel...
418
  static void d_lru_isolate(struct list_lru_one *lru, struct dentry *dentry)
89dc77bcd   Linus Torvalds   vfs: fix dentry L...
419
420
421
422
  {
  	D_FLAG_VERIFY(dentry, DCACHE_LRU_LIST);
  	dentry->d_flags &= ~DCACHE_LRU_LIST;
  	this_cpu_dec(nr_dentry_unused);
3f97b1632   Vladimir Davydov   list_lru: add hel...
423
  	list_lru_isolate(lru, &dentry->d_lru);
89dc77bcd   Linus Torvalds   vfs: fix dentry L...
424
  }
3f97b1632   Vladimir Davydov   list_lru: add hel...
425
426
  static void d_lru_shrink_move(struct list_lru_one *lru, struct dentry *dentry,
  			      struct list_head *list)
89dc77bcd   Linus Torvalds   vfs: fix dentry L...
427
428
429
  {
  	D_FLAG_VERIFY(dentry, DCACHE_LRU_LIST);
  	dentry->d_flags |= DCACHE_SHRINK_LIST;
3f97b1632   Vladimir Davydov   list_lru: add hel...
430
  	list_lru_isolate_move(lru, &dentry->d_lru, list);
89dc77bcd   Linus Torvalds   vfs: fix dentry L...
431
432
433
  }
  
  /*
f60415675   Dave Chinner   dcache: convert t...
434
   * dentry_lru_(add|del)_list) must be called with d_lock held.
da3bbdd46   Kentaro Makita   fix soft lock up ...
435
436
437
   */
  static void dentry_lru_add(struct dentry *dentry)
  {
89dc77bcd   Linus Torvalds   vfs: fix dentry L...
438
439
  	if (unlikely(!(dentry->d_flags & DCACHE_LRU_LIST)))
  		d_lru_add(dentry);
563f40019   Josef Bacik   fs: don't set *RE...
440
441
  	else if (unlikely(!(dentry->d_flags & DCACHE_REFERENCED)))
  		dentry->d_flags |= DCACHE_REFERENCED;
da3bbdd46   Kentaro Makita   fix soft lock up ...
442
  }
d52b90864   Miklos Szeredi   fix quadratic beh...
443
  /**
789680d1e   Nick Piggin   fs: dcache scale ...
444
445
446
447
448
449
450
451
452
453
454
455
   * 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).
   *
db470ce8c   NeilBrown   VFS: close race b...
456
457
458
   * __d_drop requires dentry->d_lock
   * ___d_drop doesn't mark dentry as "unhashed"
   *   (dentry->d_hash.pprev will be LIST_POISON2, not NULL).
789680d1e   Nick Piggin   fs: dcache scale ...
459
   */
db470ce8c   NeilBrown   VFS: close race b...
460
  static void ___d_drop(struct dentry *dentry)
789680d1e   Nick Piggin   fs: dcache scale ...
461
  {
dea3667bc   Linus Torvalds   vfs: get rid of i...
462
  	if (!d_unhashed(dentry)) {
b61625d24   Al Viro   fold __d_shrink()...
463
  		struct hlist_bl_head *b;
7632e465f   J. Bruce Fields   dcache: use IS_RO...
464
465
466
467
468
469
  		/*
  		 * Hashed dentries are normally on the dentry hashtable,
  		 * with the exception of those newly allocated by
  		 * d_obtain_alias, which are always IS_ROOT:
  		 */
  		if (unlikely(IS_ROOT(dentry)))
b61625d24   Al Viro   fold __d_shrink()...
470
471
  			b = &dentry->d_sb->s_anon;
  		else
8387ff257   Linus Torvalds   vfs: make the str...
472
  			b = d_hash(dentry->d_name.hash);
b61625d24   Al Viro   fold __d_shrink()...
473
474
475
  
  		hlist_bl_lock(b);
  		__hlist_bl_del(&dentry->d_hash);
b61625d24   Al Viro   fold __d_shrink()...
476
  		hlist_bl_unlock(b);
d614146d1   Al Viro   fold dentry_rcuwa...
477
478
  		/* After this call, in-progress rcu-walk path lookup will fail. */
  		write_seqcount_invalidate(&dentry->d_seq);
789680d1e   Nick Piggin   fs: dcache scale ...
479
480
  	}
  }
db470ce8c   NeilBrown   VFS: close race b...
481
482
483
484
485
486
  
  void __d_drop(struct dentry *dentry)
  {
  	___d_drop(dentry);
  	dentry->d_hash.pprev = NULL;
  }
789680d1e   Nick Piggin   fs: dcache scale ...
487
488
489
490
  EXPORT_SYMBOL(__d_drop);
  
  void d_drop(struct dentry *dentry)
  {
789680d1e   Nick Piggin   fs: dcache scale ...
491
492
493
  	spin_lock(&dentry->d_lock);
  	__d_drop(dentry);
  	spin_unlock(&dentry->d_lock);
789680d1e   Nick Piggin   fs: dcache scale ...
494
495
  }
  EXPORT_SYMBOL(d_drop);
ba65dc5ef   Al Viro   much milder d_wal...
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
  static inline void dentry_unlist(struct dentry *dentry, struct dentry *parent)
  {
  	struct dentry *next;
  	/*
  	 * Inform d_walk() and shrink_dentry_list() that we are no longer
  	 * attached to the dentry tree
  	 */
  	dentry->d_flags |= DCACHE_DENTRY_KILLED;
  	if (unlikely(list_empty(&dentry->d_child)))
  		return;
  	__list_del_entry(&dentry->d_child);
  	/*
  	 * Cursors can move around the list of children.  While we'd been
  	 * a normal list member, it didn't matter - ->d_child.next would've
  	 * been updated.  However, from now on it won't be and for the
  	 * things like d_walk() it might end up with a nasty surprise.
  	 * Normally d_walk() doesn't care about cursors moving around -
  	 * ->d_lock on parent prevents that and since a cursor has no children
  	 * of its own, we get through it without ever unlocking the parent.
  	 * There is one exception, though - if we ascend from a child that
  	 * gets killed as soon as we unlock it, the next sibling is found
  	 * using the value left in its ->d_child.next.  And if _that_
  	 * pointed to a cursor, and cursor got moved (e.g. by lseek())
  	 * before d_walk() regains parent->d_lock, we'll end up skipping
  	 * everything the cursor had been moved past.
  	 *
  	 * Solution: make sure that the pointer left behind in ->d_child.next
  	 * points to something that won't be moving around.  I.e. skip the
  	 * cursors.
  	 */
  	while (dentry->d_child.next != &parent->d_subdirs) {
  		next = list_entry(dentry->d_child.next, struct dentry, d_child);
  		if (likely(!(next->d_flags & DCACHE_DENTRY_CURSOR)))
  			break;
  		dentry->d_child.next = next->d_child.next;
  	}
  }
e55fd0115   Al Viro   split dentry_kill()
533
  static void __dentry_kill(struct dentry *dentry)
77812a1ef   Nick Piggin   fs: consolidate d...
534
  {
41edf278f   Al Viro   dentry_kill(): do...
535
536
  	struct dentry *parent = NULL;
  	bool can_free = true;
41edf278f   Al Viro   dentry_kill(): do...
537
  	if (!IS_ROOT(dentry))
77812a1ef   Nick Piggin   fs: consolidate d...
538
  		parent = dentry->d_parent;
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
539

0d98439ea   Linus Torvalds   vfs: use lockred ...
540
541
542
543
  	/*
  	 * The dentry is now unrecoverably dead to the world.
  	 */
  	lockref_mark_dead(&dentry->d_lockref);
f0023bc61   Sage Weil   vfs: add d_prune ...
544
  	/*
f0023bc61   Sage Weil   vfs: add d_prune ...
545
546
547
  	 * inform the fs via d_prune that this dentry is about to be
  	 * unhashed and destroyed.
  	 */
292662014   Al Viro   dcache.c: call ->...
548
  	if (dentry->d_flags & DCACHE_OP_PRUNE)
61572bb1f   Yan, Zheng   fs: remove dentry...
549
  		dentry->d_op->d_prune(dentry);
01b603519   Al Viro   expand the call o...
550
551
552
  	if (dentry->d_flags & DCACHE_LRU_LIST) {
  		if (!(dentry->d_flags & DCACHE_SHRINK_LIST))
  			d_lru_del(dentry);
01b603519   Al Viro   expand the call o...
553
  	}
77812a1ef   Nick Piggin   fs: consolidate d...
554
555
  	/* if it was on the hash then remove it */
  	__d_drop(dentry);
ba65dc5ef   Al Viro   much milder d_wal...
556
  	dentry_unlist(dentry, parent);
03b3b889e   Al Viro   fold d_kill() and...
557
558
  	if (parent)
  		spin_unlock(&parent->d_lock);
550dce01d   Al Viro   unify dentry_iput...
559
560
561
562
  	if (dentry->d_inode)
  		dentry_unlink_inode(dentry);
  	else
  		spin_unlock(&dentry->d_lock);
03b3b889e   Al Viro   fold d_kill() and...
563
564
565
  	this_cpu_dec(nr_dentry);
  	if (dentry->d_op && dentry->d_op->d_release)
  		dentry->d_op->d_release(dentry);
41edf278f   Al Viro   dentry_kill(): do...
566
567
568
569
570
571
  	spin_lock(&dentry->d_lock);
  	if (dentry->d_flags & DCACHE_SHRINK_LIST) {
  		dentry->d_flags |= DCACHE_MAY_FREE;
  		can_free = false;
  	}
  	spin_unlock(&dentry->d_lock);
41edf278f   Al Viro   dentry_kill(): do...
572
573
  	if (likely(can_free))
  		dentry_free(dentry);
e55fd0115   Al Viro   split dentry_kill()
574
575
576
577
578
579
580
581
  }
  
  /*
   * 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.
   */
8cbf74da4   Al Viro   dentry_kill() doe...
582
  static struct dentry *dentry_kill(struct dentry *dentry)
e55fd0115   Al Viro   split dentry_kill()
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
  	__releases(dentry->d_lock)
  {
  	struct inode *inode = dentry->d_inode;
  	struct dentry *parent = NULL;
  
  	if (inode && unlikely(!spin_trylock(&inode->i_lock)))
  		goto failed;
  
  	if (!IS_ROOT(dentry)) {
  		parent = dentry->d_parent;
  		if (unlikely(!spin_trylock(&parent->d_lock))) {
  			if (inode)
  				spin_unlock(&inode->i_lock);
  			goto failed;
  		}
  	}
  
  	__dentry_kill(dentry);
03b3b889e   Al Viro   fold d_kill() and...
601
  	return parent;
e55fd0115   Al Viro   split dentry_kill()
602
603
  
  failed:
8cbf74da4   Al Viro   dentry_kill() doe...
604
  	spin_unlock(&dentry->d_lock);
e55fd0115   Al Viro   split dentry_kill()
605
  	return dentry; /* try again with same dentry */
77812a1ef   Nick Piggin   fs: consolidate d...
606
  }
046b961b4   Al Viro   shrink_dentry_lis...
607
608
609
610
611
  static inline struct dentry *lock_parent(struct dentry *dentry)
  {
  	struct dentry *parent = dentry->d_parent;
  	if (IS_ROOT(dentry))
  		return NULL;
360f54796   Linus Torvalds   dcache: let the d...
612
  	if (unlikely(dentry->d_lockref.count < 0))
c2338f2dc   Al Viro   lock_parent: don'...
613
  		return NULL;
046b961b4   Al Viro   shrink_dentry_lis...
614
615
  	if (likely(spin_trylock(&parent->d_lock)))
  		return parent;
046b961b4   Al Viro   shrink_dentry_lis...
616
  	rcu_read_lock();
c2338f2dc   Al Viro   lock_parent: don'...
617
  	spin_unlock(&dentry->d_lock);
046b961b4   Al Viro   shrink_dentry_lis...
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
  again:
  	parent = ACCESS_ONCE(dentry->d_parent);
  	spin_lock(&parent->d_lock);
  	/*
  	 * We can't blindly lock dentry until we are sure
  	 * that we won't violate the locking order.
  	 * Any changes of dentry->d_parent must have
  	 * been done with parent->d_lock held, so
  	 * spin_lock() above is enough of a barrier
  	 * for checking if it's still our child.
  	 */
  	if (unlikely(parent != dentry->d_parent)) {
  		spin_unlock(&parent->d_lock);
  		goto again;
  	}
b071bce3f   Al Viro   lock_parent() nee...
633
  	if (parent != dentry) {
9f12600fe   Linus Torvalds   dcache: add missi...
634
  		spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
b071bce3f   Al Viro   lock_parent() nee...
635
636
637
638
639
  		if (unlikely(dentry->d_lockref.count < 0)) {
  			spin_unlock(&parent->d_lock);
  			parent = NULL;
  		}
  	} else {
046b961b4   Al Viro   shrink_dentry_lis...
640
  		parent = NULL;
b071bce3f   Al Viro   lock_parent() nee...
641
642
  	}
  	rcu_read_unlock();
046b961b4   Al Viro   shrink_dentry_lis...
643
644
  	return parent;
  }
360f54796   Linus Torvalds   dcache: let the d...
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
  /*
   * Try to do a lockless dput(), and return whether that was successful.
   *
   * If unsuccessful, we return false, having already taken the dentry lock.
   *
   * The caller needs to hold the RCU read lock, so that the dentry is
   * guaranteed to stay around even if the refcount goes down to zero!
   */
  static inline bool fast_dput(struct dentry *dentry)
  {
  	int ret;
  	unsigned int d_flags;
  
  	/*
  	 * If we have a d_op->d_delete() operation, we sould not
75a6f82a0   Al Viro   freeing unlinked ...
660
  	 * let the dentry count go to zero, so use "put_or_lock".
360f54796   Linus Torvalds   dcache: let the d...
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
  	 */
  	if (unlikely(dentry->d_flags & DCACHE_OP_DELETE))
  		return lockref_put_or_lock(&dentry->d_lockref);
  
  	/*
  	 * .. otherwise, we can try to just decrement the
  	 * lockref optimistically.
  	 */
  	ret = lockref_put_return(&dentry->d_lockref);
  
  	/*
  	 * If the lockref_put_return() failed due to the lock being held
  	 * by somebody else, the fast path has failed. We will need to
  	 * get the lock, and then check the count again.
  	 */
  	if (unlikely(ret < 0)) {
  		spin_lock(&dentry->d_lock);
  		if (dentry->d_lockref.count > 1) {
  			dentry->d_lockref.count--;
  			spin_unlock(&dentry->d_lock);
  			return 1;
  		}
  		return 0;
  	}
  
  	/*
  	 * If we weren't the last ref, we're done.
  	 */
  	if (ret)
  		return 1;
  
  	/*
  	 * Careful, careful. The reference count went down
  	 * to zero, but we don't hold the dentry lock, so
  	 * somebody else could get it again, and do another
  	 * dput(), and we need to not race with that.
  	 *
  	 * However, there is a very special and common case
  	 * where we don't care, because there is nothing to
  	 * do: the dentry is still hashed, it does not have
  	 * a 'delete' op, and it's referenced and already on
  	 * the LRU list.
  	 *
  	 * NOTE! Since we aren't locked, these values are
  	 * not "stable". However, it is sufficient that at
  	 * some point after we dropped the reference the
  	 * dentry was hashed and the flags had the proper
  	 * value. Other dentry users may have re-gotten
  	 * a reference to the dentry and change that, but
  	 * our work is done - we can leave the dentry
  	 * around with a zero refcount.
  	 */
  	smp_rmb();
  	d_flags = ACCESS_ONCE(dentry->d_flags);
75a6f82a0   Al Viro   freeing unlinked ...
715
  	d_flags &= DCACHE_REFERENCED | DCACHE_LRU_LIST | DCACHE_DISCONNECTED;
360f54796   Linus Torvalds   dcache: let the d...
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
  
  	/* Nothing to do? Dropping the reference was all we needed? */
  	if (d_flags == (DCACHE_REFERENCED | DCACHE_LRU_LIST) && !d_unhashed(dentry))
  		return 1;
  
  	/*
  	 * Not the fast normal case? Get the lock. We've already decremented
  	 * the refcount, but we'll need to re-check the situation after
  	 * getting the lock.
  	 */
  	spin_lock(&dentry->d_lock);
  
  	/*
  	 * Did somebody else grab a reference to it in the meantime, and
  	 * we're no longer the last user after all? Alternatively, somebody
  	 * else could have killed it and marked it dead. Either way, we
  	 * don't need to do anything else.
  	 */
  	if (dentry->d_lockref.count) {
  		spin_unlock(&dentry->d_lock);
  		return 1;
  	}
  
  	/*
  	 * Re-get the reference we optimistically dropped. We hold the
  	 * lock, and we just tested that it was zero, so we can just
  	 * set it to 1.
  	 */
  	dentry->d_lockref.count = 1;
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
  /* 
   * 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
772
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
773
774
  void dput(struct dentry *dentry)
  {
8aab6a273   Linus Torvalds   vfs: reorganize d...
775
  	if (unlikely(!dentry))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
776
777
778
  		return;
  
  repeat:
47be61845   Wei Fang   fs/dcache.c: avoi...
779
  	might_sleep();
360f54796   Linus Torvalds   dcache: let the d...
780
781
782
  	rcu_read_lock();
  	if (likely(fast_dput(dentry))) {
  		rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
783
  		return;
360f54796   Linus Torvalds   dcache: let the d...
784
785
786
787
  	}
  
  	/* Slow case: now with the dentry lock held */
  	rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
788

85c7f8104   Al Viro   beginning of tran...
789
  	WARN_ON(d_in_lookup(dentry));
8aab6a273   Linus Torvalds   vfs: reorganize d...
790
791
792
  	/* Unreachable? Get rid of it */
  	if (unlikely(d_unhashed(dentry)))
  		goto kill_it;
75a6f82a0   Al Viro   freeing unlinked ...
793
794
  	if (unlikely(dentry->d_flags & DCACHE_DISCONNECTED))
  		goto kill_it;
8aab6a273   Linus Torvalds   vfs: reorganize d...
795
  	if (unlikely(dentry->d_flags & DCACHE_OP_DELETE)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
796
  		if (dentry->d_op->d_delete(dentry))
61f3dee4a   Nick Piggin   fs: dcache reduce...
797
  			goto kill_it;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
798
  	}
265ac9023   Nick Piggin   fs: improve DCACH...
799

a4633357a   Christoph Hellwig   fs: clean up dent...
800
  	dentry_lru_add(dentry);
265ac9023   Nick Piggin   fs: improve DCACH...
801

98474236f   Waiman Long   vfs: make the den...
802
  	dentry->d_lockref.count--;
61f3dee4a   Nick Piggin   fs: dcache reduce...
803
  	spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
804
  	return;
d52b90864   Miklos Szeredi   fix quadratic beh...
805
  kill_it:
8cbf74da4   Al Viro   dentry_kill() doe...
806
  	dentry = dentry_kill(dentry);
47be61845   Wei Fang   fs/dcache.c: avoi...
807
808
  	if (dentry) {
  		cond_resched();
d52b90864   Miklos Szeredi   fix quadratic beh...
809
  		goto repeat;
47be61845   Wei Fang   fs/dcache.c: avoi...
810
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
811
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
812
  EXPORT_SYMBOL(dput);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
813

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
814

b5c84bf6f   Nick Piggin   fs: dcache remove...
815
  /* This must be called with d_lock held */
dc0474be3   Nick Piggin   fs: dcache ration...
816
  static inline void __dget_dlock(struct dentry *dentry)
230445078   Nick Piggin   fs: dcache scale lru
817
  {
98474236f   Waiman Long   vfs: make the den...
818
  	dentry->d_lockref.count++;
230445078   Nick Piggin   fs: dcache scale lru
819
  }
dc0474be3   Nick Piggin   fs: dcache ration...
820
  static inline void __dget(struct dentry *dentry)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
821
  {
98474236f   Waiman Long   vfs: make the den...
822
  	lockref_get(&dentry->d_lockref);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
823
  }
b7ab39f63   Nick Piggin   fs: dcache scale ...
824
825
  struct dentry *dget_parent(struct dentry *dentry)
  {
df3d0bbcd   Waiman Long   vfs: use lockref_...
826
  	int gotref;
b7ab39f63   Nick Piggin   fs: dcache scale ...
827
  	struct dentry *ret;
df3d0bbcd   Waiman Long   vfs: use lockref_...
828
829
830
831
832
833
834
835
836
837
838
839
840
  	/*
  	 * Do optimistic parent lookup without any
  	 * locking.
  	 */
  	rcu_read_lock();
  	ret = ACCESS_ONCE(dentry->d_parent);
  	gotref = lockref_get_not_zero(&ret->d_lockref);
  	rcu_read_unlock();
  	if (likely(gotref)) {
  		if (likely(ret == ACCESS_ONCE(dentry->d_parent)))
  			return ret;
  		dput(ret);
  	}
b7ab39f63   Nick Piggin   fs: dcache scale ...
841
  repeat:
a734eb458   Nick Piggin   fs: dcache reduce...
842
843
844
845
846
  	/*
  	 * Don't need rcu_dereference because we re-check it was correct under
  	 * the lock.
  	 */
  	rcu_read_lock();
b7ab39f63   Nick Piggin   fs: dcache scale ...
847
  	ret = dentry->d_parent;
a734eb458   Nick Piggin   fs: dcache reduce...
848
849
850
851
  	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 ...
852
853
  		goto repeat;
  	}
a734eb458   Nick Piggin   fs: dcache reduce...
854
  	rcu_read_unlock();
98474236f   Waiman Long   vfs: make the den...
855
856
  	BUG_ON(!ret->d_lockref.count);
  	ret->d_lockref.count++;
b7ab39f63   Nick Piggin   fs: dcache scale ...
857
  	spin_unlock(&ret->d_lock);
b7ab39f63   Nick Piggin   fs: dcache scale ...
858
859
860
  	return ret;
  }
  EXPORT_SYMBOL(dget_parent);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
861
862
863
  /**
   * d_find_alias - grab a hashed alias of inode
   * @inode: inode in question
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
864
865
866
867
868
   *
   * 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
3ccb354d6   Eric W. Biederman   vfs: Document the...
869
870
   * of a filesystem, or if the directory was renamed and d_revalidate
   * was the first vfs operation to notice.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
871
   *
21c0d8fdd   NeilBrown   [PATCH] knfsd: cl...
872
   * If the inode has an IS_ROOT, DCACHE_DISCONNECTED alias, then prefer
52ed46f0f   J. Bruce Fields   dcache: remove un...
873
   * any other hashed alias over that one.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
874
   */
52ed46f0f   J. Bruce Fields   dcache: remove un...
875
  static struct dentry *__d_find_alias(struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
876
  {
da5029563   Nick Piggin   fs: dcache scale ...
877
  	struct dentry *alias, *discon_alias;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
878

da5029563   Nick Piggin   fs: dcache scale ...
879
880
  again:
  	discon_alias = NULL;
946e51f2b   Al Viro   move d_rcu from o...
881
  	hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
da5029563   Nick Piggin   fs: dcache scale ...
882
  		spin_lock(&alias->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
883
   		if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) {
21c0d8fdd   NeilBrown   [PATCH] knfsd: cl...
884
  			if (IS_ROOT(alias) &&
da5029563   Nick Piggin   fs: dcache scale ...
885
  			    (alias->d_flags & DCACHE_DISCONNECTED)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
886
  				discon_alias = alias;
52ed46f0f   J. Bruce Fields   dcache: remove un...
887
  			} else {
dc0474be3   Nick Piggin   fs: dcache ration...
888
  				__dget_dlock(alias);
da5029563   Nick Piggin   fs: dcache scale ...
889
890
891
892
893
894
895
896
897
898
  				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)) {
8d80d7dab   J. Bruce Fields   dcache: d_find_al...
899
900
901
  			__dget_dlock(alias);
  			spin_unlock(&alias->d_lock);
  			return alias;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
902
  		}
da5029563   Nick Piggin   fs: dcache scale ...
903
904
  		spin_unlock(&alias->d_lock);
  		goto again;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
905
  	}
da5029563   Nick Piggin   fs: dcache scale ...
906
  	return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
907
  }
da5029563   Nick Piggin   fs: dcache scale ...
908
  struct dentry *d_find_alias(struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
909
  {
214fda1f6   David Howells   [PATCH] Optimise ...
910
  	struct dentry *de = NULL;
b3d9b7a3c   Al Viro   vfs: switch i_den...
911
  	if (!hlist_empty(&inode->i_dentry)) {
873feea09   Nick Piggin   fs: dcache per-in...
912
  		spin_lock(&inode->i_lock);
52ed46f0f   J. Bruce Fields   dcache: remove un...
913
  		de = __d_find_alias(inode);
873feea09   Nick Piggin   fs: dcache per-in...
914
  		spin_unlock(&inode->i_lock);
214fda1f6   David Howells   [PATCH] Optimise ...
915
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
916
917
  	return de;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
918
  EXPORT_SYMBOL(d_find_alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
919
920
921
922
923
924
925
  
  /*
   *	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: ...
926
  	struct dentry *dentry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
927
  restart:
873feea09   Nick Piggin   fs: dcache per-in...
928
  	spin_lock(&inode->i_lock);
946e51f2b   Al Viro   move d_rcu from o...
929
  	hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
930
  		spin_lock(&dentry->d_lock);
98474236f   Waiman Long   vfs: make the den...
931
  		if (!dentry->d_lockref.count) {
29355c390   Al Viro   d_prune_alias(): ...
932
933
934
  			struct dentry *parent = lock_parent(dentry);
  			if (likely(!dentry->d_lockref.count)) {
  				__dentry_kill(dentry);
4a7795d35   Yan, Zheng   vfs: fix referenc...
935
  				dput(parent);
29355c390   Al Viro   d_prune_alias(): ...
936
937
938
939
  				goto restart;
  			}
  			if (parent)
  				spin_unlock(&parent->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
940
941
942
  		}
  		spin_unlock(&dentry->d_lock);
  	}
873feea09   Nick Piggin   fs: dcache per-in...
943
  	spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
944
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
945
  EXPORT_SYMBOL(d_prune_aliases);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
946

3049cfe24   Christoph Hellwig   fs: split __shrin...
947
  static void shrink_dentry_list(struct list_head *list)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
948
  {
5c47e6d0a   Al Viro   fold try_prune_on...
949
  	struct dentry *dentry, *parent;
da3bbdd46   Kentaro Makita   fix soft lock up ...
950

60942f2f2   Miklos Szeredi   dcache: don't nee...
951
  	while (!list_empty(list)) {
ff2fde992   Al Viro   expand dentry_kil...
952
  		struct inode *inode;
60942f2f2   Miklos Szeredi   dcache: don't nee...
953
  		dentry = list_entry(list->prev, struct dentry, d_lru);
ec33679d7   Nick Piggin   fs: use RCU in sh...
954
  		spin_lock(&dentry->d_lock);
046b961b4   Al Viro   shrink_dentry_lis...
955
  		parent = lock_parent(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
956
  		/*
dd1f6b2e4   Dave Chinner   dcache: remove de...
957
958
959
960
  		 * The dispose list is isolated and dentries are not accounted
  		 * to the LRU here, so we can simply remove it from the list
  		 * here regardless of whether it is referenced or not.
  		 */
89dc77bcd   Linus Torvalds   vfs: fix dentry L...
961
  		d_shrink_del(dentry);
dd1f6b2e4   Dave Chinner   dcache: remove de...
962
963
  
  		/*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
964
  		 * We found an inuse dentry which was not removed from
dd1f6b2e4   Dave Chinner   dcache: remove de...
965
  		 * the LRU because of laziness during lookup. Do not free it.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
966
  		 */
360f54796   Linus Torvalds   dcache: let the d...
967
  		if (dentry->d_lockref.count > 0) {
da3bbdd46   Kentaro Makita   fix soft lock up ...
968
  			spin_unlock(&dentry->d_lock);
046b961b4   Al Viro   shrink_dentry_lis...
969
970
  			if (parent)
  				spin_unlock(&parent->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
971
972
  			continue;
  		}
77812a1ef   Nick Piggin   fs: consolidate d...
973

64fd72e0a   Al Viro   lift the "already...
974
975
976
977
  
  		if (unlikely(dentry->d_flags & DCACHE_DENTRY_KILLED)) {
  			bool can_free = dentry->d_flags & DCACHE_MAY_FREE;
  			spin_unlock(&dentry->d_lock);
046b961b4   Al Viro   shrink_dentry_lis...
978
979
  			if (parent)
  				spin_unlock(&parent->d_lock);
64fd72e0a   Al Viro   lift the "already...
980
981
982
983
  			if (can_free)
  				dentry_free(dentry);
  			continue;
  		}
ff2fde992   Al Viro   expand dentry_kil...
984
985
  		inode = dentry->d_inode;
  		if (inode && unlikely(!spin_trylock(&inode->i_lock))) {
89dc77bcd   Linus Torvalds   vfs: fix dentry L...
986
  			d_shrink_add(dentry, list);
dd1f6b2e4   Dave Chinner   dcache: remove de...
987
  			spin_unlock(&dentry->d_lock);
046b961b4   Al Viro   shrink_dentry_lis...
988
989
  			if (parent)
  				spin_unlock(&parent->d_lock);
5c47e6d0a   Al Viro   fold try_prune_on...
990
  			continue;
dd1f6b2e4   Dave Chinner   dcache: remove de...
991
  		}
ff2fde992   Al Viro   expand dentry_kil...
992

ff2fde992   Al Viro   expand dentry_kil...
993
  		__dentry_kill(dentry);
046b961b4   Al Viro   shrink_dentry_lis...
994

5c47e6d0a   Al Viro   fold try_prune_on...
995
996
997
998
999
1000
1001
  		/*
  		 * 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.
  		 */
  		dentry = parent;
b2b80195d   Al Viro   dealing with the ...
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
  		while (dentry && !lockref_put_or_lock(&dentry->d_lockref)) {
  			parent = lock_parent(dentry);
  			if (dentry->d_lockref.count != 1) {
  				dentry->d_lockref.count--;
  				spin_unlock(&dentry->d_lock);
  				if (parent)
  					spin_unlock(&parent->d_lock);
  				break;
  			}
  			inode = dentry->d_inode;	/* can't be NULL */
  			if (unlikely(!spin_trylock(&inode->i_lock))) {
  				spin_unlock(&dentry->d_lock);
  				if (parent)
  					spin_unlock(&parent->d_lock);
  				cpu_relax();
  				continue;
  			}
  			__dentry_kill(dentry);
  			dentry = parent;
  		}
da3bbdd46   Kentaro Makita   fix soft lock up ...
1022
  	}
3049cfe24   Christoph Hellwig   fs: split __shrin...
1023
  }
3f97b1632   Vladimir Davydov   list_lru: add hel...
1024
1025
  static enum lru_status dentry_lru_isolate(struct list_head *item,
  		struct list_lru_one *lru, spinlock_t *lru_lock, void *arg)
f60415675   Dave Chinner   dcache: convert t...
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
  {
  	struct list_head *freeable = arg;
  	struct dentry	*dentry = container_of(item, struct dentry, d_lru);
  
  
  	/*
  	 * we are inverting the lru lock/dentry->d_lock here,
  	 * so use a trylock. If we fail to get the lock, just skip
  	 * it
  	 */
  	if (!spin_trylock(&dentry->d_lock))
  		return LRU_SKIP;
  
  	/*
  	 * Referenced dentries are still in use. If they have active
  	 * counts, just remove them from the LRU. Otherwise give them
  	 * another pass through the LRU.
  	 */
  	if (dentry->d_lockref.count) {
3f97b1632   Vladimir Davydov   list_lru: add hel...
1045
  		d_lru_isolate(lru, dentry);
f60415675   Dave Chinner   dcache: convert t...
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
  		spin_unlock(&dentry->d_lock);
  		return LRU_REMOVED;
  	}
  
  	if (dentry->d_flags & DCACHE_REFERENCED) {
  		dentry->d_flags &= ~DCACHE_REFERENCED;
  		spin_unlock(&dentry->d_lock);
  
  		/*
  		 * The list move itself will be made by the common LRU code. At
  		 * this point, we've dropped the dentry->d_lock but keep the
  		 * lru lock. This is safe to do, since every list movement is
  		 * protected by the lru lock even if both locks are held.
  		 *
  		 * This is guaranteed by the fact that all LRU management
  		 * functions are intermediated by the LRU API calls like
  		 * list_lru_add and list_lru_del. List movement in this file
  		 * only ever occur through this functions or through callbacks
  		 * like this one, that are called from the LRU API.
  		 *
  		 * The only exceptions to this are functions like
  		 * shrink_dentry_list, and code that first checks for the
  		 * DCACHE_SHRINK_LIST flag.  Those are guaranteed to be
  		 * operating only with stack provided lists after they are
  		 * properly isolated from the main list.  It is thus, always a
  		 * local access.
  		 */
  		return LRU_ROTATE;
  	}
3f97b1632   Vladimir Davydov   list_lru: add hel...
1075
  	d_lru_shrink_move(lru, dentry, freeable);
f60415675   Dave Chinner   dcache: convert t...
1076
1077
1078
1079
  	spin_unlock(&dentry->d_lock);
  
  	return LRU_REMOVED;
  }
3049cfe24   Christoph Hellwig   fs: split __shrin...
1080
  /**
b48f03b31   Dave Chinner   dcache: use a dis...
1081
1082
   * prune_dcache_sb - shrink the dcache
   * @sb: superblock
503c358cf   Vladimir Davydov   list_lru: introdu...
1083
   * @sc: shrink control, passed to list_lru_shrink_walk()
b48f03b31   Dave Chinner   dcache: use a dis...
1084
   *
503c358cf   Vladimir Davydov   list_lru: introdu...
1085
1086
   * Attempt to shrink the superblock dcache LRU by @sc->nr_to_scan entries. This
   * is done when we need more memory and called from the superblock shrinker
b48f03b31   Dave Chinner   dcache: use a dis...
1087
   * function.
3049cfe24   Christoph Hellwig   fs: split __shrin...
1088
   *
b48f03b31   Dave Chinner   dcache: use a dis...
1089
1090
   * This function may fail to free any resources if all the dentries are in
   * use.
3049cfe24   Christoph Hellwig   fs: split __shrin...
1091
   */
503c358cf   Vladimir Davydov   list_lru: introdu...
1092
  long prune_dcache_sb(struct super_block *sb, struct shrink_control *sc)
3049cfe24   Christoph Hellwig   fs: split __shrin...
1093
  {
f60415675   Dave Chinner   dcache: convert t...
1094
1095
  	LIST_HEAD(dispose);
  	long freed;
3049cfe24   Christoph Hellwig   fs: split __shrin...
1096

503c358cf   Vladimir Davydov   list_lru: introdu...
1097
1098
  	freed = list_lru_shrink_walk(&sb->s_dentry_lru, sc,
  				     dentry_lru_isolate, &dispose);
f60415675   Dave Chinner   dcache: convert t...
1099
  	shrink_dentry_list(&dispose);
0a234c6dc   Dave Chinner   shrinker: convert...
1100
  	return freed;
da3bbdd46   Kentaro Makita   fix soft lock up ...
1101
  }
230445078   Nick Piggin   fs: dcache scale lru
1102

4e717f5c1   Glauber Costa   list_lru: remove ...
1103
  static enum lru_status dentry_lru_isolate_shrink(struct list_head *item,
3f97b1632   Vladimir Davydov   list_lru: add hel...
1104
  		struct list_lru_one *lru, spinlock_t *lru_lock, void *arg)
dd1f6b2e4   Dave Chinner   dcache: remove de...
1105
  {
4e717f5c1   Glauber Costa   list_lru: remove ...
1106
1107
  	struct list_head *freeable = arg;
  	struct dentry	*dentry = container_of(item, struct dentry, d_lru);
dd1f6b2e4   Dave Chinner   dcache: remove de...
1108

4e717f5c1   Glauber Costa   list_lru: remove ...
1109
1110
1111
1112
1113
1114
1115
  	/*
  	 * we are inverting the lru lock/dentry->d_lock here,
  	 * so use a trylock. If we fail to get the lock, just skip
  	 * it
  	 */
  	if (!spin_trylock(&dentry->d_lock))
  		return LRU_SKIP;
3f97b1632   Vladimir Davydov   list_lru: add hel...
1116
  	d_lru_shrink_move(lru, dentry, freeable);
4e717f5c1   Glauber Costa   list_lru: remove ...
1117
  	spin_unlock(&dentry->d_lock);
ec33679d7   Nick Piggin   fs: use RCU in sh...
1118

4e717f5c1   Glauber Costa   list_lru: remove ...
1119
  	return LRU_REMOVED;
da3bbdd46   Kentaro Makita   fix soft lock up ...
1120
  }
4e717f5c1   Glauber Costa   list_lru: remove ...
1121

da3bbdd46   Kentaro Makita   fix soft lock up ...
1122
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1123
1124
1125
   * shrink_dcache_sb - shrink dcache for a superblock
   * @sb: superblock
   *
3049cfe24   Christoph Hellwig   fs: split __shrin...
1126
1127
   * 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
1128
   */
3049cfe24   Christoph Hellwig   fs: split __shrin...
1129
  void shrink_dcache_sb(struct super_block *sb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1130
  {
4e717f5c1   Glauber Costa   list_lru: remove ...
1131
1132
  	do {
  		LIST_HEAD(dispose);
b30b0fdaa   Waiman Long   fs/dcache: Fix in...
1133
  		list_lru_walk(&sb->s_dentry_lru,
b17c070fb   Sahitya Tummala   fs/dcache.c: fix ...
1134
  			dentry_lru_isolate_shrink, &dispose, 1024);
4e717f5c1   Glauber Costa   list_lru: remove ...
1135
  		shrink_dentry_list(&dispose);
b17c070fb   Sahitya Tummala   fs/dcache.c: fix ...
1136
1137
  		cond_resched();
  	} while (list_lru_count(&sb->s_dentry_lru) > 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1138
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1139
  EXPORT_SYMBOL(shrink_dcache_sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1140

db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
  /**
   * enum d_walk_ret - action to talke during tree walk
   * @D_WALK_CONTINUE:	contrinue walk
   * @D_WALK_QUIT:	quit walk
   * @D_WALK_NORETRY:	quit when retry is needed
   * @D_WALK_SKIP:	skip this dentry and its children
   */
  enum d_walk_ret {
  	D_WALK_CONTINUE,
  	D_WALK_QUIT,
  	D_WALK_NORETRY,
  	D_WALK_SKIP,
  };
c826cb7df   Linus Torvalds   dcache.c: create ...
1154

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1155
  /**
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1156
1157
1158
1159
1160
   * d_walk - walk the dentry tree
   * @parent:	start of walk
   * @data:	data passed to @enter() and @finish()
   * @enter:	callback when first entering the dentry
   * @finish:	callback when successfully finished the walk
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1161
   *
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1162
   * The @enter() and @finish() callbacks are called with d_lock held.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1163
   */
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1164
1165
1166
  static void d_walk(struct dentry *parent, void *data,
  		   enum d_walk_ret (*enter)(void *, struct dentry *),
  		   void (*finish)(void *))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1167
  {
949854d02   Nick Piggin   fs: Use rename lo...
1168
  	struct dentry *this_parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1169
  	struct list_head *next;
48f5ec21d   Al Viro   split read_seqret...
1170
  	unsigned seq = 0;
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1171
1172
  	enum d_walk_ret ret;
  	bool retry = true;
949854d02   Nick Piggin   fs: Use rename lo...
1173

58db63d08   Nick Piggin   fs: dcache avoid ...
1174
  again:
48f5ec21d   Al Viro   split read_seqret...
1175
  	read_seqbegin_or_lock(&rename_lock, &seq);
58db63d08   Nick Piggin   fs: dcache avoid ...
1176
  	this_parent = parent;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1177
  	spin_lock(&this_parent->d_lock);
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
  
  	ret = enter(data, this_parent);
  	switch (ret) {
  	case D_WALK_CONTINUE:
  		break;
  	case D_WALK_QUIT:
  	case D_WALK_SKIP:
  		goto out_unlock;
  	case D_WALK_NORETRY:
  		retry = false;
  		break;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1190
1191
1192
1193
1194
  repeat:
  	next = this_parent->d_subdirs.next;
  resume:
  	while (next != &this_parent->d_subdirs) {
  		struct list_head *tmp = next;
946e51f2b   Al Viro   move d_rcu from o...
1195
  		struct dentry *dentry = list_entry(tmp, struct dentry, d_child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1196
  		next = tmp->next;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1197

ba65dc5ef   Al Viro   much milder d_wal...
1198
1199
  		if (unlikely(dentry->d_flags & DCACHE_DENTRY_CURSOR))
  			continue;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1200
  		spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1201
1202
1203
1204
1205
1206
  
  		ret = enter(data, dentry);
  		switch (ret) {
  		case D_WALK_CONTINUE:
  			break;
  		case D_WALK_QUIT:
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1207
  			spin_unlock(&dentry->d_lock);
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1208
1209
1210
1211
1212
1213
1214
  			goto out_unlock;
  		case D_WALK_NORETRY:
  			retry = false;
  			break;
  		case D_WALK_SKIP:
  			spin_unlock(&dentry->d_lock);
  			continue;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1215
  		}
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1216

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1217
  		if (!list_empty(&dentry->d_subdirs)) {
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1218
1219
  			spin_unlock(&this_parent->d_lock);
  			spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1220
  			this_parent = dentry;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1221
  			spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1222
1223
  			goto repeat;
  		}
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1224
  		spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1225
1226
1227
1228
  	}
  	/*
  	 * All done at this level ... ascend and resume the search.
  	 */
ca5358ef7   Al Viro   deal with deadloc...
1229
1230
  	rcu_read_lock();
  ascend:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1231
  	if (this_parent != parent) {
c826cb7df   Linus Torvalds   dcache.c: create ...
1232
  		struct dentry *child = this_parent;
31dec1327   Al Viro   fold try_to_ascen...
1233
  		this_parent = child->d_parent;
31dec1327   Al Viro   fold try_to_ascen...
1234
1235
  		spin_unlock(&child->d_lock);
  		spin_lock(&this_parent->d_lock);
ca5358ef7   Al Viro   deal with deadloc...
1236
1237
  		/* might go back up the wrong parent if we have had a rename. */
  		if (need_seqretry(&rename_lock, seq))
949854d02   Nick Piggin   fs: Use rename lo...
1238
  			goto rename_retry;
2159184ea   Al Viro   d_walk() might sk...
1239
1240
1241
  		/* go into the first sibling still alive */
  		do {
  			next = child->d_child.next;
ca5358ef7   Al Viro   deal with deadloc...
1242
1243
1244
  			if (next == &this_parent->d_subdirs)
  				goto ascend;
  			child = list_entry(next, struct dentry, d_child);
2159184ea   Al Viro   d_walk() might sk...
1245
  		} while (unlikely(child->d_flags & DCACHE_DENTRY_KILLED));
31dec1327   Al Viro   fold try_to_ascen...
1246
  		rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1247
1248
  		goto resume;
  	}
ca5358ef7   Al Viro   deal with deadloc...
1249
  	if (need_seqretry(&rename_lock, seq))
949854d02   Nick Piggin   fs: Use rename lo...
1250
  		goto rename_retry;
ca5358ef7   Al Viro   deal with deadloc...
1251
  	rcu_read_unlock();
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1252
1253
1254
1255
1256
  	if (finish)
  		finish(data);
  
  out_unlock:
  	spin_unlock(&this_parent->d_lock);
48f5ec21d   Al Viro   split read_seqret...
1257
  	done_seqretry(&rename_lock, seq);
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1258
  	return;
58db63d08   Nick Piggin   fs: dcache avoid ...
1259
1260
  
  rename_retry:
ca5358ef7   Al Viro   deal with deadloc...
1261
1262
1263
  	spin_unlock(&this_parent->d_lock);
  	rcu_read_unlock();
  	BUG_ON(seq & 1);
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1264
1265
  	if (!retry)
  		return;
48f5ec21d   Al Viro   split read_seqret...
1266
  	seq = 1;
58db63d08   Nick Piggin   fs: dcache avoid ...
1267
  	goto again;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1268
  }
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1269

01619491a   Ian Kent   vfs: add path_has...
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
  struct check_mount {
  	struct vfsmount *mnt;
  	unsigned int mounted;
  };
  
  static enum d_walk_ret path_check_mount(void *data, struct dentry *dentry)
  {
  	struct check_mount *info = data;
  	struct path path = { .mnt = info->mnt, .dentry = dentry };
  
  	if (likely(!d_mountpoint(dentry)))
  		return D_WALK_CONTINUE;
  	if (__path_is_mountpoint(&path)) {
  		info->mounted = 1;
  		return D_WALK_QUIT;
  	}
  	return D_WALK_CONTINUE;
  }
  
  /**
   * path_has_submounts - check for mounts over a dentry in the
   *                      current namespace.
   * @parent: path to check.
   *
   * Return true if the parent or its subdirectories contain
   * a mount point in the current namespace.
   */
  int path_has_submounts(const struct path *parent)
  {
  	struct check_mount data = { .mnt = parent->mnt, .mounted = 0 };
  
  	read_seqlock_excl(&mount_lock);
  	d_walk(parent->dentry, &data, path_check_mount, NULL);
  	read_sequnlock_excl(&mount_lock);
  
  	return data.mounted;
  }
  EXPORT_SYMBOL(path_has_submounts);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1308
  /*
eed810076   Miklos Szeredi   vfs: check unlink...
1309
1310
1311
1312
   * Called by mount code to set a mountpoint and check if the mountpoint is
   * reachable (e.g. NFS can unhash a directory dentry and then the complete
   * subtree can become unreachable).
   *
1ffe46d11   Eric W. Biederman   vfs: Merge check_...
1313
   * Only one of d_invalidate() and d_set_mounted() must succeed.  For
eed810076   Miklos Szeredi   vfs: check unlink...
1314
1315
1316
1317
1318
1319
1320
1321
   * this reason take rename_lock and d_lock on dentry and ancestors.
   */
  int d_set_mounted(struct dentry *dentry)
  {
  	struct dentry *p;
  	int ret = -ENOENT;
  	write_seqlock(&rename_lock);
  	for (p = dentry->d_parent; !IS_ROOT(p); p = p->d_parent) {
1ffe46d11   Eric W. Biederman   vfs: Merge check_...
1322
  		/* Need exclusion wrt. d_invalidate() */
eed810076   Miklos Szeredi   vfs: check unlink...
1323
1324
1325
1326
1327
1328
1329
1330
1331
  		spin_lock(&p->d_lock);
  		if (unlikely(d_unhashed(p))) {
  			spin_unlock(&p->d_lock);
  			goto out;
  		}
  		spin_unlock(&p->d_lock);
  	}
  	spin_lock(&dentry->d_lock);
  	if (!d_unlinked(dentry)) {
3895dbf89   Eric W. Biederman   mnt: Protect the ...
1332
1333
1334
1335
1336
  		ret = -EBUSY;
  		if (!d_mountpoint(dentry)) {
  			dentry->d_flags |= DCACHE_MOUNTED;
  			ret = 0;
  		}
eed810076   Miklos Szeredi   vfs: check unlink...
1337
1338
1339
1340
1341
1342
1343
1344
  	}
   	spin_unlock(&dentry->d_lock);
  out:
  	write_sequnlock(&rename_lock);
  	return ret;
  }
  
  /*
fd5179094   J. Bruce Fields   trivial select_pa...
1345
   * Search the dentry child list of the specified parent,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
   * 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.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1358

db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1359
1360
1361
1362
1363
  struct select_data {
  	struct dentry *start;
  	struct list_head dispose;
  	int found;
  };
230445078   Nick Piggin   fs: dcache scale lru
1364

db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1365
1366
1367
1368
  static enum d_walk_ret select_collect(void *_data, struct dentry *dentry)
  {
  	struct select_data *data = _data;
  	enum d_walk_ret ret = D_WALK_CONTINUE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1369

db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1370
1371
  	if (data->start == dentry)
  		goto out;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
1372

fe91522a7   Al Viro   don't remove from...
1373
  	if (dentry->d_flags & DCACHE_SHRINK_LIST) {
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1374
  		data->found++;
fe91522a7   Al Viro   don't remove from...
1375
1376
1377
1378
1379
1380
1381
  	} else {
  		if (dentry->d_flags & DCACHE_LRU_LIST)
  			d_lru_del(dentry);
  		if (!dentry->d_lockref.count) {
  			d_shrink_add(dentry, &data->dispose);
  			data->found++;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1382
  	}
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1383
1384
1385
1386
1387
  	/*
  	 * We can return to the caller if we have found some (this
  	 * ensures forward progress). We'll be coming back to find
  	 * the rest.
  	 */
fe91522a7   Al Viro   don't remove from...
1388
1389
  	if (!list_empty(&data->dispose))
  		ret = need_resched() ? D_WALK_QUIT : D_WALK_NORETRY;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1390
  out:
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1391
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1392
1393
1394
1395
1396
1397
1398
1399
  }
  
  /**
   * shrink_dcache_parent - prune dcache
   * @parent: parent of entries to prune
   *
   * Prune the dcache to remove unused children of the parent dentry.
   */
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1400
  void shrink_dcache_parent(struct dentry *parent)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1401
  {
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1402
1403
  	for (;;) {
  		struct select_data data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1404

db14fc3ab   Miklos Szeredi   vfs: add d_walk()
1405
1406
1407
1408
1409
1410
1411
1412
1413
  		INIT_LIST_HEAD(&data.dispose);
  		data.start = parent;
  		data.found = 0;
  
  		d_walk(parent, &data, select_collect, NULL);
  		if (!data.found)
  			break;
  
  		shrink_dentry_list(&data.dispose);
421348f1c   Greg Thelen   fs/dcache.c: add ...
1414
1415
  		cond_resched();
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1416
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1417
  EXPORT_SYMBOL(shrink_dcache_parent);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1418

9c8c10e26   Al Viro   more graceful rec...
1419
  static enum d_walk_ret umount_check(void *_data, struct dentry *dentry)
42c326082   Al Viro   switch shrink_dca...
1420
  {
9c8c10e26   Al Viro   more graceful rec...
1421
1422
1423
  	/* it has busy descendents; complain about those instead */
  	if (!list_empty(&dentry->d_subdirs))
  		return D_WALK_CONTINUE;
42c326082   Al Viro   switch shrink_dca...
1424

9c8c10e26   Al Viro   more graceful rec...
1425
1426
1427
1428
1429
1430
1431
  	/* root with refcount 1 is fine */
  	if (dentry == _data && dentry->d_lockref.count == 1)
  		return D_WALK_CONTINUE;
  
  	printk(KERN_ERR "BUG: Dentry %p{i=%lx,n=%pd} "
  			" still in use (%d) [unmount of %s %s]
  ",
42c326082   Al Viro   switch shrink_dca...
1432
1433
1434
  		       dentry,
  		       dentry->d_inode ?
  		       dentry->d_inode->i_ino : 0UL,
9c8c10e26   Al Viro   more graceful rec...
1435
  		       dentry,
42c326082   Al Viro   switch shrink_dca...
1436
1437
1438
  		       dentry->d_lockref.count,
  		       dentry->d_sb->s_type->name,
  		       dentry->d_sb->s_id);
9c8c10e26   Al Viro   more graceful rec...
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
  	WARN_ON(1);
  	return D_WALK_CONTINUE;
  }
  
  static void do_one_tree(struct dentry *dentry)
  {
  	shrink_dcache_parent(dentry);
  	d_walk(dentry, dentry, umount_check, NULL);
  	d_drop(dentry);
  	dput(dentry);
42c326082   Al Viro   switch shrink_dca...
1449
1450
1451
1452
1453
1454
1455
1456
  }
  
  /*
   * destroy the dentries attached to a superblock on unmounting
   */
  void shrink_dcache_for_umount(struct super_block *sb)
  {
  	struct dentry *dentry;
9c8c10e26   Al Viro   more graceful rec...
1457
  	WARN(down_read_trylock(&sb->s_umount), "s_umount should've been locked");
42c326082   Al Viro   switch shrink_dca...
1458
1459
1460
  
  	dentry = sb->s_root;
  	sb->s_root = NULL;
9c8c10e26   Al Viro   more graceful rec...
1461
  	do_one_tree(dentry);
42c326082   Al Viro   switch shrink_dca...
1462
1463
  
  	while (!hlist_bl_empty(&sb->s_anon)) {
9c8c10e26   Al Viro   more graceful rec...
1464
1465
  		dentry = dget(hlist_bl_entry(hlist_bl_first(&sb->s_anon), struct dentry, d_hash));
  		do_one_tree(dentry);
42c326082   Al Viro   switch shrink_dca...
1466
1467
  	}
  }
8ed936b56   Eric W. Biederman   vfs: Lazily remov...
1468
1469
1470
1471
1472
  struct detach_data {
  	struct select_data select;
  	struct dentry *mountpoint;
  };
  static enum d_walk_ret detach_and_collect(void *_data, struct dentry *dentry)
848ac114e   Miklos Szeredi   vfs: check submou...
1473
  {
8ed936b56   Eric W. Biederman   vfs: Lazily remov...
1474
  	struct detach_data *data = _data;
848ac114e   Miklos Szeredi   vfs: check submou...
1475
1476
  
  	if (d_mountpoint(dentry)) {
8ed936b56   Eric W. Biederman   vfs: Lazily remov...
1477
1478
  		__dget_dlock(dentry);
  		data->mountpoint = dentry;
848ac114e   Miklos Szeredi   vfs: check submou...
1479
1480
  		return D_WALK_QUIT;
  	}
8ed936b56   Eric W. Biederman   vfs: Lazily remov...
1481
  	return select_collect(&data->select, dentry);
848ac114e   Miklos Szeredi   vfs: check submou...
1482
1483
1484
1485
  }
  
  static void check_and_drop(void *_data)
  {
8ed936b56   Eric W. Biederman   vfs: Lazily remov...
1486
  	struct detach_data *data = _data;
848ac114e   Miklos Szeredi   vfs: check submou...
1487

81be24d26   Al Viro   Hang/soft lockup ...
1488
  	if (!data->mountpoint && list_empty(&data->select.dispose))
8ed936b56   Eric W. Biederman   vfs: Lazily remov...
1489
  		__d_drop(data->select.start);
848ac114e   Miklos Szeredi   vfs: check submou...
1490
1491
1492
  }
  
  /**
1ffe46d11   Eric W. Biederman   vfs: Merge check_...
1493
1494
1495
   * d_invalidate - detach submounts, prune dcache, and drop
   * @dentry: dentry to invalidate (aka detach, prune and drop)
   *
1ffe46d11   Eric W. Biederman   vfs: Merge check_...
1496
   * no dcache lock.
848ac114e   Miklos Szeredi   vfs: check submou...
1497
   *
8ed936b56   Eric W. Biederman   vfs: Lazily remov...
1498
1499
1500
   * The final d_drop is done as an atomic operation relative to
   * rename_lock ensuring there are no races with d_set_mounted.  This
   * ensures there are no unhashed dentries on the path to a mountpoint.
848ac114e   Miklos Szeredi   vfs: check submou...
1501
   */
5542aa2fa   Eric W. Biederman   vfs: Make d_inval...
1502
  void d_invalidate(struct dentry *dentry)
848ac114e   Miklos Szeredi   vfs: check submou...
1503
  {
1ffe46d11   Eric W. Biederman   vfs: Merge check_...
1504
1505
1506
1507
1508
1509
  	/*
  	 * If it's already been dropped, return OK.
  	 */
  	spin_lock(&dentry->d_lock);
  	if (d_unhashed(dentry)) {
  		spin_unlock(&dentry->d_lock);
5542aa2fa   Eric W. Biederman   vfs: Make d_inval...
1510
  		return;
1ffe46d11   Eric W. Biederman   vfs: Merge check_...
1511
1512
  	}
  	spin_unlock(&dentry->d_lock);
848ac114e   Miklos Szeredi   vfs: check submou...
1513
1514
1515
  	/* Negative dentries can be dropped without further checks */
  	if (!dentry->d_inode) {
  		d_drop(dentry);
5542aa2fa   Eric W. Biederman   vfs: Make d_inval...
1516
  		return;
848ac114e   Miklos Szeredi   vfs: check submou...
1517
1518
1519
  	}
  
  	for (;;) {
8ed936b56   Eric W. Biederman   vfs: Lazily remov...
1520
  		struct detach_data data;
848ac114e   Miklos Szeredi   vfs: check submou...
1521

8ed936b56   Eric W. Biederman   vfs: Lazily remov...
1522
1523
1524
1525
1526
1527
  		data.mountpoint = NULL;
  		INIT_LIST_HEAD(&data.select.dispose);
  		data.select.start = dentry;
  		data.select.found = 0;
  
  		d_walk(dentry, &data, detach_and_collect, check_and_drop);
848ac114e   Miklos Szeredi   vfs: check submou...
1528

81be24d26   Al Viro   Hang/soft lockup ...
1529
  		if (!list_empty(&data.select.dispose))
8ed936b56   Eric W. Biederman   vfs: Lazily remov...
1530
  			shrink_dentry_list(&data.select.dispose);
81be24d26   Al Viro   Hang/soft lockup ...
1531
1532
  		else if (!data.mountpoint)
  			return;
848ac114e   Miklos Szeredi   vfs: check submou...
1533

8ed936b56   Eric W. Biederman   vfs: Lazily remov...
1534
1535
1536
1537
  		if (data.mountpoint) {
  			detach_mounts(data.mountpoint);
  			dput(data.mountpoint);
  		}
848ac114e   Miklos Szeredi   vfs: check submou...
1538
1539
  		cond_resched();
  	}
848ac114e   Miklos Szeredi   vfs: check submou...
1540
  }
1ffe46d11   Eric W. Biederman   vfs: Merge check_...
1541
  EXPORT_SYMBOL(d_invalidate);
848ac114e   Miklos Szeredi   vfs: check submou...
1542

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1543
  /**
a4464dbc0   Al Viro   Make ->d_sb assig...
1544
1545
   * __d_alloc	-	allocate a dcache entry
   * @sb: filesystem it will belong to
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1546
1547
1548
1549
1550
1551
1552
   * @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...
1553
  struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1554
  {
6d7942377   Roman Gushchin   dcache: account e...
1555
  	struct external_name *ext = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1556
1557
  	struct dentry *dentry;
  	char *dname;
285b102d3   Miklos Szeredi   vfs: new d_init m...
1558
  	int err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1559

e12ba74d8   Mel Gorman   Group short-lived...
1560
  	dentry = kmem_cache_alloc(dentry_cache, GFP_KERNEL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1561
1562
  	if (!dentry)
  		return NULL;
6326c71fd   Linus Torvalds   vfs: be even more...
1563
1564
1565
1566
1567
1568
1569
  	/*
  	 * We guarantee that the inline name is always NUL-terminated.
  	 * This way the memcpy() done by the name switching in rename
  	 * will still always have a NUL at the end, even if we might
  	 * be overwriting an internal NUL character
  	 */
  	dentry->d_iname[DNAME_INLINE_LEN-1] = 0;
798434bda   Al Viro   __d_alloc(): trea...
1570
  	if (unlikely(!name)) {
cdf01226b   David Howells   VFS: Provide empt...
1571
  		name = &slash_name;
798434bda   Al Viro   __d_alloc(): trea...
1572
1573
  		dname = dentry->d_iname;
  	} else if (name->len > DNAME_INLINE_LEN-1) {
8d85b4845   Al Viro   Allow sharing ext...
1574
  		size_t size = offsetof(struct external_name, name[1]);
6d7942377   Roman Gushchin   dcache: account e...
1575
1576
  		ext = kmalloc(size + name->len, GFP_KERNEL_ACCOUNT);
  		if (!ext) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1577
1578
1579
  			kmem_cache_free(dentry_cache, dentry); 
  			return NULL;
  		}
6d7942377   Roman Gushchin   dcache: account e...
1580
1581
  		atomic_set(&ext->u.count, 1);
  		dname = ext->name;
df4c0e36f   Andrey Ryabinin   fs: dcache: manua...
1582
1583
1584
  		if (IS_ENABLED(CONFIG_DCACHE_WORD_ACCESS))
  			kasan_unpoison_shadow(dname,
  				round_up(name->len + 1,	sizeof(unsigned long)));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1585
1586
1587
  	} else  {
  		dname = dentry->d_iname;
  	}	
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1588
1589
1590
1591
1592
  
  	dentry->d_name.len = name->len;
  	dentry->d_name.hash = name->hash;
  	memcpy(dname, name->name, name->len);
  	dname[name->len] = 0;
6326c71fd   Linus Torvalds   vfs: be even more...
1593
1594
1595
  	/* Make sure we always see the terminating NUL character */
  	smp_wmb();
  	dentry->d_name.name = dname;
98474236f   Waiman Long   vfs: make the den...
1596
  	dentry->d_lockref.count = 1;
dea3667bc   Linus Torvalds   vfs: get rid of i...
1597
  	dentry->d_flags = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1598
  	spin_lock_init(&dentry->d_lock);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
1599
  	seqcount_init(&dentry->d_seq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1600
  	dentry->d_inode = NULL;
a4464dbc0   Al Viro   Make ->d_sb assig...
1601
1602
  	dentry->d_parent = dentry;
  	dentry->d_sb = sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1603
1604
  	dentry->d_op = NULL;
  	dentry->d_fsdata = NULL;
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
1605
  	INIT_HLIST_BL_NODE(&dentry->d_hash);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1606
1607
  	INIT_LIST_HEAD(&dentry->d_lru);
  	INIT_LIST_HEAD(&dentry->d_subdirs);
946e51f2b   Al Viro   move d_rcu from o...
1608
1609
  	INIT_HLIST_NODE(&dentry->d_u.d_alias);
  	INIT_LIST_HEAD(&dentry->d_child);
a4464dbc0   Al Viro   Make ->d_sb assig...
1610
  	d_set_d_op(dentry, dentry->d_sb->s_d_op);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1611

285b102d3   Miklos Szeredi   vfs: new d_init m...
1612
1613
1614
1615
1616
1617
1618
1619
1620
  	if (dentry->d_op && dentry->d_op->d_init) {
  		err = dentry->d_op->d_init(dentry);
  		if (err) {
  			if (dname_external(dentry))
  				kfree(external_name(dentry));
  			kmem_cache_free(dentry_cache, dentry);
  			return NULL;
  		}
  	}
6d7942377   Roman Gushchin   dcache: account e...
1621
1622
1623
1624
1625
  	if (unlikely(ext)) {
  		pg_data_t *pgdat = page_pgdat(virt_to_page(ext));
  		mod_node_page_state(pgdat, NR_INDIRECTLY_RECLAIMABLE_BYTES,
  				    ksize(ext));
  	}
3e880fb5e   Nick Piggin   fs: use fast coun...
1626
  	this_cpu_inc(nr_dentry);
312d3ca85   Christoph Hellwig   fs: use percpu co...
1627

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1628
1629
  	return dentry;
  }
a4464dbc0   Al Viro   Make ->d_sb assig...
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
  
  /**
   * 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;
3d56c25e3   Al Viro   fix d_walk()/non-...
1645
  	dentry->d_flags |= DCACHE_RCUACCESS;
a4464dbc0   Al Viro   Make ->d_sb assig...
1646
1647
1648
1649
1650
1651
1652
  	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;
946e51f2b   Al Viro   move d_rcu from o...
1653
  	list_add(&dentry->d_child, &parent->d_subdirs);
a4464dbc0   Al Viro   Make ->d_sb assig...
1654
1655
1656
1657
  	spin_unlock(&parent->d_lock);
  
  	return dentry;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1658
  EXPORT_SYMBOL(d_alloc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1659

ba65dc5ef   Al Viro   much milder d_wal...
1660
1661
1662
1663
1664
1665
1666
1667
1668
  struct dentry *d_alloc_cursor(struct dentry * parent)
  {
  	struct dentry *dentry = __d_alloc(parent->d_sb, NULL);
  	if (dentry) {
  		dentry->d_flags |= DCACHE_RCUACCESS | DCACHE_DENTRY_CURSOR;
  		dentry->d_parent = dget(parent);
  	}
  	return dentry;
  }
e1a24bb0a   J. Bruce Fields   dcache: Don't set...
1669
1670
1671
1672
1673
1674
1675
1676
  /**
   * d_alloc_pseudo - allocate a dentry (for lookup-less filesystems)
   * @sb: the superblock
   * @name: qstr of the name
   *
   * For a filesystem that just pins its dentries in memory and never
   * performs lookups at all, return an unhashed IS_ROOT dentry.
   */
4b936885a   Nick Piggin   fs: improve scala...
1677
1678
  struct dentry *d_alloc_pseudo(struct super_block *sb, const struct qstr *name)
  {
e1a24bb0a   J. Bruce Fields   dcache: Don't set...
1679
  	return __d_alloc(sb, name);
4b936885a   Nick Piggin   fs: improve scala...
1680
1681
  }
  EXPORT_SYMBOL(d_alloc_pseudo);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1682
1683
1684
1685
1686
  struct dentry *d_alloc_name(struct dentry *parent, const char *name)
  {
  	struct qstr q;
  
  	q.name = name;
8387ff257   Linus Torvalds   vfs: make the str...
1687
  	q.hash_len = hashlen_string(parent, name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1688
1689
  	return d_alloc(parent, &q);
  }
ef26ca97e   H Hartley Sweeten   libfs: move EXPOR...
1690
  EXPORT_SYMBOL(d_alloc_name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1691

fb045adb9   Nick Piggin   fs: dcache reduce...
1692
1693
  void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op)
  {
6f7f7caab   Linus Torvalds   Turn d_set_d_op()...
1694
1695
  	WARN_ON_ONCE(dentry->d_op);
  	WARN_ON_ONCE(dentry->d_flags & (DCACHE_OP_HASH	|
fb045adb9   Nick Piggin   fs: dcache reduce...
1696
1697
  				DCACHE_OP_COMPARE	|
  				DCACHE_OP_REVALIDATE	|
ecf3d1f1a   Jeff Layton   vfs: kill FS_REVA...
1698
  				DCACHE_OP_WEAK_REVALIDATE	|
4bacc9c92   David Howells   overlayfs: Make f...
1699
  				DCACHE_OP_DELETE	|
d101a1259   Miklos Szeredi   fs: add file_dent...
1700
  				DCACHE_OP_REAL));
fb045adb9   Nick Piggin   fs: dcache reduce...
1701
1702
1703
1704
1705
1706
1707
1708
1709
  	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;
ecf3d1f1a   Jeff Layton   vfs: kill FS_REVA...
1710
1711
  	if (op->d_weak_revalidate)
  		dentry->d_flags |= DCACHE_OP_WEAK_REVALIDATE;
fb045adb9   Nick Piggin   fs: dcache reduce...
1712
1713
  	if (op->d_delete)
  		dentry->d_flags |= DCACHE_OP_DELETE;
f0023bc61   Sage Weil   vfs: add d_prune ...
1714
1715
  	if (op->d_prune)
  		dentry->d_flags |= DCACHE_OP_PRUNE;
d101a1259   Miklos Szeredi   fs: add file_dent...
1716
1717
  	if (op->d_real)
  		dentry->d_flags |= DCACHE_OP_REAL;
fb045adb9   Nick Piggin   fs: dcache reduce...
1718
1719
1720
  
  }
  EXPORT_SYMBOL(d_set_d_op);
df1a085af   David Howells   VFS: Add a fallth...
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
  
  /*
   * d_set_fallthru - Mark a dentry as falling through to a lower layer
   * @dentry - The dentry to mark
   *
   * Mark a dentry as falling through to the lower layer (as set with
   * d_pin_lower()).  This flag may be recorded on the medium.
   */
  void d_set_fallthru(struct dentry *dentry)
  {
  	spin_lock(&dentry->d_lock);
  	dentry->d_flags |= DCACHE_FALLTHRU;
  	spin_unlock(&dentry->d_lock);
  }
  EXPORT_SYMBOL(d_set_fallthru);
b18825a7c   David Howells   VFS: Put a small ...
1736
1737
  static unsigned d_flags_for_inode(struct inode *inode)
  {
44bdb5e5f   David Howells   VFS: Split DCACHE...
1738
  	unsigned add_flags = DCACHE_REGULAR_TYPE;
b18825a7c   David Howells   VFS: Put a small ...
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
  
  	if (!inode)
  		return DCACHE_MISS_TYPE;
  
  	if (S_ISDIR(inode->i_mode)) {
  		add_flags = DCACHE_DIRECTORY_TYPE;
  		if (unlikely(!(inode->i_opflags & IOP_LOOKUP))) {
  			if (unlikely(!inode->i_op->lookup))
  				add_flags = DCACHE_AUTODIR_TYPE;
  			else
  				inode->i_opflags |= IOP_LOOKUP;
  		}
44bdb5e5f   David Howells   VFS: Split DCACHE...
1751
1752
1753
1754
  		goto type_determined;
  	}
  
  	if (unlikely(!(inode->i_opflags & IOP_NOFOLLOW))) {
6b2553918   Al Viro   replace ->follow_...
1755
  		if (unlikely(inode->i_op->get_link)) {
b18825a7c   David Howells   VFS: Put a small ...
1756
  			add_flags = DCACHE_SYMLINK_TYPE;
44bdb5e5f   David Howells   VFS: Split DCACHE...
1757
1758
1759
  			goto type_determined;
  		}
  		inode->i_opflags |= IOP_NOFOLLOW;
b18825a7c   David Howells   VFS: Put a small ...
1760
  	}
44bdb5e5f   David Howells   VFS: Split DCACHE...
1761
1762
1763
1764
  	if (unlikely(!S_ISREG(inode->i_mode)))
  		add_flags = DCACHE_SPECIAL_TYPE;
  
  type_determined:
b18825a7c   David Howells   VFS: Put a small ...
1765
1766
1767
1768
  	if (unlikely(IS_AUTOMOUNT(inode)))
  		add_flags |= DCACHE_NEED_AUTOMOUNT;
  	return add_flags;
  }
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1769
1770
  static void __d_instantiate(struct dentry *dentry, struct inode *inode)
  {
b18825a7c   David Howells   VFS: Put a small ...
1771
  	unsigned add_flags = d_flags_for_inode(inode);
85c7f8104   Al Viro   beginning of tran...
1772
  	WARN_ON(d_in_lookup(dentry));
b18825a7c   David Howells   VFS: Put a small ...
1773

b23fb0a60   Nick Piggin   fs: scale inode a...
1774
  	spin_lock(&dentry->d_lock);
de689f5e3   Al Viro   don't bother with...
1775
  	hlist_add_head(&dentry->d_u.d_alias, &inode->i_dentry);
a528aca7f   Al Viro   use ->d_seq to ge...
1776
  	raw_write_seqcount_begin(&dentry->d_seq);
4bf46a272   David Howells   VFS: Impose order...
1777
  	__d_set_inode_and_type(dentry, inode, add_flags);
a528aca7f   Al Viro   use ->d_seq to ge...
1778
  	raw_write_seqcount_end(&dentry->d_seq);
affda4841   Al Viro   trim fsnotify hoo...
1779
  	fsnotify_update_flags(dentry);
b23fb0a60   Nick Piggin   fs: scale inode a...
1780
  	spin_unlock(&dentry->d_lock);
360da9002   OGAWA Hirofumi   [PATCH vfs-2.6 3/...
1781
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
  /**
   * 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)
  {
946e51f2b   Al Viro   move d_rcu from o...
1799
  	BUG_ON(!hlist_unhashed(&entry->d_u.d_alias));
de689f5e3   Al Viro   don't bother with...
1800
  	if (inode) {
b96809173   Al Viro   security_d_instan...
1801
  		security_d_instantiate(entry, inode);
873feea09   Nick Piggin   fs: dcache per-in...
1802
  		spin_lock(&inode->i_lock);
de689f5e3   Al Viro   don't bother with...
1803
  		__d_instantiate(entry, inode);
873feea09   Nick Piggin   fs: dcache per-in...
1804
  		spin_unlock(&inode->i_lock);
de689f5e3   Al Viro   don't bother with...
1805
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1806
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
1807
  EXPORT_SYMBOL(d_instantiate);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1808

f440ea85d   Al Viro   do d_instantiate/...
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
  /*
   * This should be equivalent to d_instantiate() + unlock_new_inode(),
   * with lockdep-related part of unlock_new_inode() done before
   * anything else.  Use that instead of open-coding d_instantiate()/
   * unlock_new_inode() combinations.
   */
  void d_instantiate_new(struct dentry *entry, struct inode *inode)
  {
  	BUG_ON(!hlist_unhashed(&entry->d_u.d_alias));
  	BUG_ON(!inode);
  	lockdep_annotate_inode_mutex_key(inode);
  	security_d_instantiate(entry, inode);
  	spin_lock(&inode->i_lock);
  	__d_instantiate(entry, inode);
  	WARN_ON(!(inode->i_state & I_NEW));
  	inode->i_state &= ~I_NEW;
  	smp_mb();
  	wake_up_bit(&inode->i_state, __I_NEW);
  	spin_unlock(&inode->i_lock);
  }
  EXPORT_SYMBOL(d_instantiate_new);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1830
  /**
b70a80e7a   Miklos Szeredi   vfs: introduce d_...
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
   * d_instantiate_no_diralias - instantiate a non-aliased dentry
   * @entry: dentry to complete
   * @inode: inode to attach to this dentry
   *
   * Fill in inode information in the entry.  If a directory alias is found, then
   * return an error (and drop inode).  Together with d_materialise_unique() this
   * guarantees that a directory inode may never have more than one alias.
   */
  int d_instantiate_no_diralias(struct dentry *entry, struct inode *inode)
  {
946e51f2b   Al Viro   move d_rcu from o...
1841
  	BUG_ON(!hlist_unhashed(&entry->d_u.d_alias));
b70a80e7a   Miklos Szeredi   vfs: introduce d_...
1842

b96809173   Al Viro   security_d_instan...
1843
  	security_d_instantiate(entry, inode);
b70a80e7a   Miklos Szeredi   vfs: introduce d_...
1844
1845
1846
1847
1848
1849
1850
1851
  	spin_lock(&inode->i_lock);
  	if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry)) {
  		spin_unlock(&inode->i_lock);
  		iput(inode);
  		return -EBUSY;
  	}
  	__d_instantiate(entry, inode);
  	spin_unlock(&inode->i_lock);
b70a80e7a   Miklos Szeredi   vfs: introduce d_...
1852
1853
1854
1855
  
  	return 0;
  }
  EXPORT_SYMBOL(d_instantiate_no_diralias);
adc0e91ab   Al Viro   vfs: new helper -...
1856
1857
1858
1859
1860
  struct dentry *d_make_root(struct inode *root_inode)
  {
  	struct dentry *res = NULL;
  
  	if (root_inode) {
798434bda   Al Viro   __d_alloc(): trea...
1861
  		res = __d_alloc(root_inode->i_sb, NULL);
abfc0ec69   Al Viro   root dentries nee...
1862
1863
  		if (res) {
  			res->d_flags |= DCACHE_RCUACCESS;
adc0e91ab   Al Viro   vfs: new helper -...
1864
  			d_instantiate(res, root_inode);
abfc0ec69   Al Viro   root dentries nee...
1865
  		} else {
adc0e91ab   Al Viro   vfs: new helper -...
1866
  			iput(root_inode);
abfc0ec69   Al Viro   root dentries nee...
1867
  		}
adc0e91ab   Al Viro   vfs: new helper -...
1868
1869
1870
1871
  	}
  	return res;
  }
  EXPORT_SYMBOL(d_make_root);
d891eedbc   J. Bruce Fields   fs/dcache: allow ...
1872
1873
1874
  static struct dentry * __d_find_any_alias(struct inode *inode)
  {
  	struct dentry *alias;
b3d9b7a3c   Al Viro   vfs: switch i_den...
1875
  	if (hlist_empty(&inode->i_dentry))
d891eedbc   J. Bruce Fields   fs/dcache: allow ...
1876
  		return NULL;
946e51f2b   Al Viro   move d_rcu from o...
1877
  	alias = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);
d891eedbc   J. Bruce Fields   fs/dcache: allow ...
1878
1879
1880
  	__dget(alias);
  	return alias;
  }
46f72b349   Sage Weil   vfs: export symbo...
1881
1882
1883
1884
1885
1886
1887
1888
  /**
   * d_find_any_alias - find any alias for a given inode
   * @inode: inode to find an alias for
   *
   * If any aliases exist for the given inode, take and return a
   * reference for one of them.  If no aliases exist, return %NULL.
   */
  struct dentry *d_find_any_alias(struct inode *inode)
d891eedbc   J. Bruce Fields   fs/dcache: allow ...
1889
1890
1891
1892
1893
1894
1895
1896
  {
  	struct dentry *de;
  
  	spin_lock(&inode->i_lock);
  	de = __d_find_any_alias(inode);
  	spin_unlock(&inode->i_lock);
  	return de;
  }
46f72b349   Sage Weil   vfs: export symbo...
1897
  EXPORT_SYMBOL(d_find_any_alias);
d891eedbc   J. Bruce Fields   fs/dcache: allow ...
1898

49c7dd287   Fengguang Wu   fs: mark __d_obta...
1899
  static struct dentry *__d_obtain_alias(struct inode *inode, int disconnected)
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1900
  {
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1901
1902
  	struct dentry *tmp;
  	struct dentry *res;
b18825a7c   David Howells   VFS: Put a small ...
1903
  	unsigned add_flags;
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1904
1905
  
  	if (!inode)
440037287   Christoph Hellwig   [PATCH] switch al...
1906
  		return ERR_PTR(-ESTALE);
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1907
1908
  	if (IS_ERR(inode))
  		return ERR_CAST(inode);
d891eedbc   J. Bruce Fields   fs/dcache: allow ...
1909
  	res = d_find_any_alias(inode);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1910
1911
  	if (res)
  		goto out_iput;
798434bda   Al Viro   __d_alloc(): trea...
1912
  	tmp = __d_alloc(inode->i_sb, NULL);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1913
1914
1915
  	if (!tmp) {
  		res = ERR_PTR(-ENOMEM);
  		goto out_iput;
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1916
  	}
b5c84bf6f   Nick Piggin   fs: dcache remove...
1917

b96809173   Al Viro   security_d_instan...
1918
  	security_d_instantiate(tmp, inode);
873feea09   Nick Piggin   fs: dcache per-in...
1919
  	spin_lock(&inode->i_lock);
d891eedbc   J. Bruce Fields   fs/dcache: allow ...
1920
  	res = __d_find_any_alias(inode);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1921
  	if (res) {
873feea09   Nick Piggin   fs: dcache per-in...
1922
  		spin_unlock(&inode->i_lock);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1923
1924
1925
1926
1927
  		dput(tmp);
  		goto out_iput;
  	}
  
  	/* attach a disconnected dentry */
1a0a397e4   J. Bruce Fields   dcache: d_obtain_...
1928
1929
1930
1931
  	add_flags = d_flags_for_inode(inode);
  
  	if (disconnected)
  		add_flags |= DCACHE_DISCONNECTED;
b18825a7c   David Howells   VFS: Put a small ...
1932

9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1933
  	spin_lock(&tmp->d_lock);
4bf46a272   David Howells   VFS: Impose order...
1934
  	__d_set_inode_and_type(tmp, inode, add_flags);
946e51f2b   Al Viro   move d_rcu from o...
1935
  	hlist_add_head(&tmp->d_u.d_alias, &inode->i_dentry);
1879fd6a2   Christoph Hellwig   add hlist_bl_lock...
1936
  	hlist_bl_lock(&tmp->d_sb->s_anon);
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
1937
  	hlist_bl_add_head(&tmp->d_hash, &tmp->d_sb->s_anon);
1879fd6a2   Christoph Hellwig   add hlist_bl_lock...
1938
  	hlist_bl_unlock(&tmp->d_sb->s_anon);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1939
  	spin_unlock(&tmp->d_lock);
873feea09   Nick Piggin   fs: dcache per-in...
1940
  	spin_unlock(&inode->i_lock);
9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1941

9308a6128   Christoph Hellwig   [PATCH] kill d_al...
1942
1943
1944
1945
1946
  	return tmp;
  
   out_iput:
  	iput(inode);
  	return res;
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1947
  }
1a0a397e4   J. Bruce Fields   dcache: d_obtain_...
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
  
  /**
   * d_obtain_alias - find or allocate a DISCONNECTED 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
   * 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 the error will be propagated to the return value,
   * with a %NULL @inode replaced by ERR_PTR(-ESTALE).
   */
  struct dentry *d_obtain_alias(struct inode *inode)
  {
  	return __d_obtain_alias(inode, 1);
  }
adc487204   Benny Halevy   EXPORT_SYMBOL(d_o...
1971
  EXPORT_SYMBOL(d_obtain_alias);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1972
1973
  
  /**
1a0a397e4   J. Bruce Fields   dcache: d_obtain_...
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
   * d_obtain_root - find or allocate a dentry for a given inode
   * @inode: inode to allocate the dentry for
   *
   * Obtain an IS_ROOT dentry for the root of a filesystem.
   *
   * We must ensure that directory inodes only ever have one dentry.  If a
   * dentry is found, that is returned instead of allocating a new one.
   *
   * On successful return, the reference to the inode has been transferred
   * to the dentry.  In case of an error the reference on the inode is
   * released.  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).
   */
  struct dentry *d_obtain_root(struct inode *inode)
  {
  	return __d_obtain_alias(inode, 0);
  }
  EXPORT_SYMBOL(d_obtain_root);
  
  /**
9403540c0   Barry Naujok   dcache: Add case-...
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
   * 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_...
2010
  struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode,
9403540c0   Barry Naujok   dcache: Add case-...
2011
2012
  			struct qstr *name)
  {
d9171b934   Al Viro   parallel lookups ...
2013
  	struct dentry *found, *res;
9403540c0   Barry Naujok   dcache: Add case-...
2014

b6520c819   Christoph Hellwig   cleanup d_add_ci
2015
2016
2017
2018
  	/*
  	 * First check if a dentry matching the name already exists,
  	 * if not go ahead and create it now.
  	 */
9403540c0   Barry Naujok   dcache: Add case-...
2019
  	found = d_hash_and_lookup(dentry->d_parent, name);
d9171b934   Al Viro   parallel lookups ...
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
  	if (found) {
  		iput(inode);
  		return found;
  	}
  	if (d_in_lookup(dentry)) {
  		found = d_alloc_parallel(dentry->d_parent, name,
  					dentry->d_wait);
  		if (IS_ERR(found) || !d_in_lookup(found)) {
  			iput(inode);
  			return found;
9403540c0   Barry Naujok   dcache: Add case-...
2030
  		}
d9171b934   Al Viro   parallel lookups ...
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
  	} else {
  		found = d_alloc(dentry->d_parent, name);
  		if (!found) {
  			iput(inode);
  			return ERR_PTR(-ENOMEM);
  		} 
  	}
  	res = d_splice_alias(inode, found);
  	if (res) {
  		dput(found);
  		return res;
9403540c0   Barry Naujok   dcache: Add case-...
2042
  	}
4f522a247   Al Viro   d_hash_and_lookup...
2043
  	return found;
9403540c0   Barry Naujok   dcache: Add case-...
2044
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2045
  EXPORT_SYMBOL(d_add_ci);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2046

12f8ad4b0   Linus Torvalds   vfs: clean up __d...
2047

d4c91a8f7   Al Viro   new helper: d_sam...
2048
2049
2050
  static inline bool d_same_name(const struct dentry *dentry,
  				const struct dentry *parent,
  				const struct qstr *name)
12f8ad4b0   Linus Torvalds   vfs: clean up __d...
2051
  {
d4c91a8f7   Al Viro   new helper: d_sam...
2052
2053
2054
2055
  	if (likely(!(parent->d_flags & DCACHE_OP_COMPARE))) {
  		if (dentry->d_name.len != name->len)
  			return false;
  		return dentry_cmp(dentry, name->name, name->len) == 0;
12f8ad4b0   Linus Torvalds   vfs: clean up __d...
2056
  	}
6fa67e707   Al Viro   get rid of 'paren...
2057
  	return parent->d_op->d_compare(dentry,
d4c91a8f7   Al Viro   new helper: d_sam...
2058
2059
  				       dentry->d_name.len, dentry->d_name.name,
  				       name) == 0;
12f8ad4b0   Linus Torvalds   vfs: clean up __d...
2060
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2061
  /**
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2062
2063
2064
   * __d_lookup_rcu - search for a dentry (racy, store-free)
   * @parent: parent dentry
   * @name: qstr of name we wish to find
1f1e6e523   Randy Dunlap   fs: fix kernel-do...
2065
   * @seqp: returns d_seq value at the point where the dentry was found
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
   * 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.
   *
15570086b   Linus Torvalds   vfs: reimplement ...
2079
   * A refcount may be taken on the found dentry with the d_rcu_to_refcount
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2080
2081
2082
2083
2084
2085
   * 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.
12f8ad4b0   Linus Torvalds   vfs: clean up __d...
2086
2087
2088
   *
   * NOTE! The caller *has* to check the resulting dentry against the sequence
   * number we've returned before using any of the resulting dentry state!
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2089
   */
8966be903   Linus Torvalds   vfs: trivial __d_...
2090
2091
  struct dentry *__d_lookup_rcu(const struct dentry *parent,
  				const struct qstr *name,
da53be12b   Linus Torvalds   Don't pass inode ...
2092
  				unsigned *seqp)
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2093
  {
26fe57502   Linus Torvalds   vfs: make it poss...
2094
  	u64 hashlen = name->hash_len;
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2095
  	const unsigned char *str = name->name;
8387ff257   Linus Torvalds   vfs: make the str...
2096
  	struct hlist_bl_head *b = d_hash(hashlen_hash(hashlen));
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
2097
  	struct hlist_bl_node *node;
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
  	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...
2118
  	 * See Documentation/filesystems/path-lookup.txt for more details.
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2119
  	 */
b07ad9967   Linus Torvalds   vfs: get rid of '...
2120
  	hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) {
8966be903   Linus Torvalds   vfs: trivial __d_...
2121
  		unsigned seq;
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2122

31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2123
  seqretry:
12f8ad4b0   Linus Torvalds   vfs: clean up __d...
2124
2125
  		/*
  		 * The dentry sequence count protects us from concurrent
da53be12b   Linus Torvalds   Don't pass inode ...
2126
  		 * renames, and thus protects parent and name fields.
12f8ad4b0   Linus Torvalds   vfs: clean up __d...
2127
2128
  		 *
  		 * The caller must perform a seqcount check in order
da53be12b   Linus Torvalds   Don't pass inode ...
2129
  		 * to do anything useful with the returned dentry.
12f8ad4b0   Linus Torvalds   vfs: clean up __d...
2130
2131
2132
2133
2134
2135
2136
  		 *
  		 * NOTE! We do a "raw" seqcount_begin here. That means that
  		 * we don't wait for the sequence count to stabilize if it
  		 * is in the middle of a sequence change. If we do the slow
  		 * dentry compare, we will do seqretries until it is stable,
  		 * and if we end up with a successful lookup, we actually
  		 * want to exit RCU lookup anyway.
d4c91a8f7   Al Viro   new helper: d_sam...
2137
2138
2139
  		 *
  		 * Note that raw_seqcount_begin still *does* smp_rmb(), so
  		 * we are still guaranteed NUL-termination of ->d_name.name.
12f8ad4b0   Linus Torvalds   vfs: clean up __d...
2140
2141
  		 */
  		seq = raw_seqcount_begin(&dentry->d_seq);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2142
2143
  		if (dentry->d_parent != parent)
  			continue;
2e321806b   Linus Torvalds   Revert "vfs: remo...
2144
2145
  		if (d_unhashed(dentry))
  			continue;
12f8ad4b0   Linus Torvalds   vfs: clean up __d...
2146

830c0f0ed   Linus Torvalds   vfs: renumber DCA...
2147
  		if (unlikely(parent->d_flags & DCACHE_OP_COMPARE)) {
d4c91a8f7   Al Viro   new helper: d_sam...
2148
2149
  			int tlen;
  			const char *tname;
26fe57502   Linus Torvalds   vfs: make it poss...
2150
2151
  			if (dentry->d_name.hash != hashlen_hash(hashlen))
  				continue;
d4c91a8f7   Al Viro   new helper: d_sam...
2152
2153
2154
2155
2156
  			tlen = dentry->d_name.len;
  			tname = dentry->d_name.name;
  			/* we want a consistent (name,len) pair */
  			if (read_seqcount_retry(&dentry->d_seq, seq)) {
  				cpu_relax();
12f8ad4b0   Linus Torvalds   vfs: clean up __d...
2157
2158
  				goto seqretry;
  			}
6fa67e707   Al Viro   get rid of 'paren...
2159
  			if (parent->d_op->d_compare(dentry,
d4c91a8f7   Al Viro   new helper: d_sam...
2160
2161
2162
2163
2164
2165
2166
  						    tlen, tname, name) != 0)
  				continue;
  		} else {
  			if (dentry->d_name.hash_len != hashlen)
  				continue;
  			if (dentry_cmp(dentry, str, hashlen_len(hashlen)) != 0)
  				continue;
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2167
  		}
da53be12b   Linus Torvalds   Don't pass inode ...
2168
  		*seqp = seq;
d4c91a8f7   Al Viro   new helper: d_sam...
2169
  		return dentry;
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2170
2171
2172
2173
2174
  	}
  	return NULL;
  }
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2175
2176
2177
   * d_lookup - search for a dentry
   * @parent: parent dentry
   * @name: qstr of name we wish to find
b04f784e5   Nick Piggin   fs: remove extra ...
2178
   * Returns: dentry, or NULL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2179
   *
b04f784e5   Nick Piggin   fs: remove extra ...
2180
2181
2182
2183
   * 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
2184
   */
da2d8455e   Al Viro   constify d_lookup...
2185
  struct dentry *d_lookup(const struct dentry *parent, const struct qstr *name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2186
  {
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2187
  	struct dentry *dentry;
949854d02   Nick Piggin   fs: Use rename lo...
2188
  	unsigned seq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2189

b8314f930   Daeseok Youn   dcache: Fix no sp...
2190
2191
2192
2193
  	do {
  		seq = read_seqbegin(&rename_lock);
  		dentry = __d_lookup(parent, name);
  		if (dentry)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2194
2195
2196
2197
  			break;
  	} while (read_seqretry(&rename_lock, seq));
  	return dentry;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2198
  EXPORT_SYMBOL(d_lookup);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2199

31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2200
  /**
b04f784e5   Nick Piggin   fs: remove extra ...
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
   * __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.
   */
a713ca2ab   Al Viro   constify __d_look...
2215
  struct dentry *__d_lookup(const struct dentry *parent, const struct qstr *name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2216
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2217
  	unsigned int hash = name->hash;
8387ff257   Linus Torvalds   vfs: make the str...
2218
  	struct hlist_bl_head *b = d_hash(hash);
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
2219
  	struct hlist_bl_node *node;
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2220
  	struct dentry *found = NULL;
665a7583f   Paul E. McKenney   [PATCH] Remove hl...
2221
  	struct dentry *dentry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2222

b04f784e5   Nick Piggin   fs: remove extra ...
2223
  	/*
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2224
2225
2226
2227
2228
2229
2230
  	 * 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 ...
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
  	 * 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...
2241
  	 * See Documentation/filesystems/path-lookup.txt for more details.
b04f784e5   Nick Piggin   fs: remove extra ...
2242
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2243
2244
  	rcu_read_lock();
  	
b07ad9967   Linus Torvalds   vfs: get rid of '...
2245
  	hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2246

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2247
2248
  		if (dentry->d_name.hash != hash)
  			continue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2249
2250
  
  		spin_lock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2251
2252
  		if (dentry->d_parent != parent)
  			goto next;
d0185c088   Linus Torvalds   Fix NULL pointer ...
2253
2254
  		if (d_unhashed(dentry))
  			goto next;
d4c91a8f7   Al Viro   new helper: d_sam...
2255
2256
  		if (!d_same_name(dentry, parent, name))
  			goto next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2257

98474236f   Waiman Long   vfs: make the den...
2258
  		dentry->d_lockref.count++;
d0185c088   Linus Torvalds   Fix NULL pointer ...
2259
  		found = dentry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
  		spin_unlock(&dentry->d_lock);
  		break;
  next:
  		spin_unlock(&dentry->d_lock);
   	}
   	rcu_read_unlock();
  
   	return found;
  }
  
  /**
3e7e241f8   Eric W. Biederman   [PATCH] dcache: A...
2271
2272
2273
2274
   * 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
   *
4f522a247   Al Viro   d_hash_and_lookup...
2275
   * On lookup failure NULL is returned; on bad name - ERR_PTR(-error)
3e7e241f8   Eric W. Biederman   [PATCH] dcache: A...
2276
2277
2278
   */
  struct dentry *d_hash_and_lookup(struct dentry *dir, struct qstr *name)
  {
3e7e241f8   Eric W. Biederman   [PATCH] dcache: A...
2279
2280
2281
2282
2283
  	/*
  	 * 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.
  	 */
8387ff257   Linus Torvalds   vfs: make the str...
2284
  	name->hash = full_name_hash(dir, name->name, name->len);
fb045adb9   Nick Piggin   fs: dcache reduce...
2285
  	if (dir->d_flags & DCACHE_OP_HASH) {
da53be12b   Linus Torvalds   Don't pass inode ...
2286
  		int err = dir->d_op->d_hash(dir, name);
4f522a247   Al Viro   d_hash_and_lookup...
2287
2288
  		if (unlikely(err < 0))
  			return ERR_PTR(err);
3e7e241f8   Eric W. Biederman   [PATCH] dcache: A...
2289
  	}
4f522a247   Al Viro   d_hash_and_lookup...
2290
  	return d_lookup(dir, name);
3e7e241f8   Eric W. Biederman   [PATCH] dcache: A...
2291
  }
4f522a247   Al Viro   d_hash_and_lookup...
2292
  EXPORT_SYMBOL(d_hash_and_lookup);
3e7e241f8   Eric W. Biederman   [PATCH] dcache: A...
2293

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
  /*
   * 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...
2317
  	struct inode *inode;
7a91bf7f5   John McCutchan   [PATCH] fsnotify_...
2318
  	int isdir = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2319
2320
2321
  	/*
  	 * Are we the only user?
  	 */
357f8e658   Nick Piggin   fs: dcache reduce...
2322
  again:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2323
  	spin_lock(&dentry->d_lock);
873feea09   Nick Piggin   fs: dcache per-in...
2324
2325
  	inode = dentry->d_inode;
  	isdir = S_ISDIR(inode->i_mode);
98474236f   Waiman Long   vfs: make the den...
2326
  	if (dentry->d_lockref.count == 1) {
1fe0c0230   Alan Cox   vfs: delete surpl...
2327
  		if (!spin_trylock(&inode->i_lock)) {
357f8e658   Nick Piggin   fs: dcache reduce...
2328
2329
2330
2331
  			spin_unlock(&dentry->d_lock);
  			cpu_relax();
  			goto again;
  		}
13e3c5e5b   Al Viro   clean DCACHE_CANT...
2332
  		dentry->d_flags &= ~DCACHE_CANT_MOUNT;
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2333
  		dentry_unlink_inode(dentry);
7a91bf7f5   John McCutchan   [PATCH] fsnotify_...
2334
  		fsnotify_nameremove(dentry, isdir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2335
2336
2337
2338
2339
2340
2341
  		return;
  	}
  
  	if (!d_unhashed(dentry))
  		__d_drop(dentry);
  
  	spin_unlock(&dentry->d_lock);
7a91bf7f5   John McCutchan   [PATCH] fsnotify_...
2342
2343
  
  	fsnotify_nameremove(dentry, isdir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2344
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2345
  EXPORT_SYMBOL(d_delete);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2346

15d3c589f   Al Viro   fold _d_rehash() ...
2347
  static void __d_rehash(struct dentry *entry)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2348
  {
15d3c589f   Al Viro   fold _d_rehash() ...
2349
  	struct hlist_bl_head *b = d_hash(entry->d_name.hash);
db470ce8c   NeilBrown   VFS: close race b...
2350

1879fd6a2   Christoph Hellwig   add hlist_bl_lock...
2351
  	hlist_bl_lock(b);
b07ad9967   Linus Torvalds   vfs: get rid of '...
2352
  	hlist_bl_add_head_rcu(&entry->d_hash, b);
1879fd6a2   Christoph Hellwig   add hlist_bl_lock...
2353
  	hlist_bl_unlock(b);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
  }
  
  /**
   * 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
2365
  	spin_lock(&entry->d_lock);
15d3c589f   Al Viro   fold _d_rehash() ...
2366
  	__d_rehash(entry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2367
  	spin_unlock(&entry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2368
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2369
  EXPORT_SYMBOL(d_rehash);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2370

84e710da2   Al Viro   parallel lookups ...
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
  static inline unsigned start_dir_add(struct inode *dir)
  {
  
  	for (;;) {
  		unsigned n = dir->i_dir_seq;
  		if (!(n & 1) && cmpxchg(&dir->i_dir_seq, n, n + 1) == n)
  			return n;
  		cpu_relax();
  	}
  }
  
  static inline void end_dir_add(struct inode *dir, unsigned n)
  {
  	smp_store_release(&dir->i_dir_seq, n + 2);
  }
d9171b934   Al Viro   parallel lookups ...
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
  static void d_wait_lookup(struct dentry *dentry)
  {
  	if (d_in_lookup(dentry)) {
  		DECLARE_WAITQUEUE(wait, current);
  		add_wait_queue(dentry->d_wait, &wait);
  		do {
  			set_current_state(TASK_UNINTERRUPTIBLE);
  			spin_unlock(&dentry->d_lock);
  			schedule();
  			spin_lock(&dentry->d_lock);
  		} while (d_in_lookup(dentry));
  	}
  }
94bdd655c   Al Viro   parallel lookups ...
2399
  struct dentry *d_alloc_parallel(struct dentry *parent,
d9171b934   Al Viro   parallel lookups ...
2400
2401
  				const struct qstr *name,
  				wait_queue_head_t *wq)
94bdd655c   Al Viro   parallel lookups ...
2402
  {
94bdd655c   Al Viro   parallel lookups ...
2403
  	unsigned int hash = name->hash;
94bdd655c   Al Viro   parallel lookups ...
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
  	struct hlist_bl_head *b = in_lookup_hash(parent, hash);
  	struct hlist_bl_node *node;
  	struct dentry *new = d_alloc(parent, name);
  	struct dentry *dentry;
  	unsigned seq, r_seq, d_seq;
  
  	if (unlikely(!new))
  		return ERR_PTR(-ENOMEM);
  
  retry:
  	rcu_read_lock();
3623c1f37   Will Deacon   fs: dcache: Avoid...
2415
  	seq = smp_load_acquire(&parent->d_inode->i_dir_seq);
94bdd655c   Al Viro   parallel lookups ...
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
  	r_seq = read_seqbegin(&rename_lock);
  	dentry = __d_lookup_rcu(parent, name, &d_seq);
  	if (unlikely(dentry)) {
  		if (!lockref_get_not_dead(&dentry->d_lockref)) {
  			rcu_read_unlock();
  			goto retry;
  		}
  		if (read_seqcount_retry(&dentry->d_seq, d_seq)) {
  			rcu_read_unlock();
  			dput(dentry);
  			goto retry;
  		}
  		rcu_read_unlock();
  		dput(new);
  		return dentry;
  	}
  	if (unlikely(read_seqretry(&rename_lock, r_seq))) {
  		rcu_read_unlock();
  		goto retry;
  	}
3623c1f37   Will Deacon   fs: dcache: Avoid...
2436
2437
2438
2439
2440
  
  	if (unlikely(seq & 1)) {
  		rcu_read_unlock();
  		goto retry;
  	}
94bdd655c   Al Viro   parallel lookups ...
2441
  	hlist_bl_lock(b);
2565b271a   Will Deacon   fs: dcache: Use R...
2442
  	if (unlikely(READ_ONCE(parent->d_inode->i_dir_seq) != seq)) {
94bdd655c   Al Viro   parallel lookups ...
2443
2444
2445
2446
  		hlist_bl_unlock(b);
  		rcu_read_unlock();
  		goto retry;
  	}
94bdd655c   Al Viro   parallel lookups ...
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
  	/*
  	 * No changes for the parent since the beginning of d_lookup().
  	 * Since all removals from the chain happen with hlist_bl_lock(),
  	 * any potential in-lookup matches are going to stay here until
  	 * we unlock the chain.  All fields are stable in everything
  	 * we encounter.
  	 */
  	hlist_bl_for_each_entry(dentry, node, b, d_u.d_in_lookup_hash) {
  		if (dentry->d_name.hash != hash)
  			continue;
  		if (dentry->d_parent != parent)
  			continue;
d4c91a8f7   Al Viro   new helper: d_sam...
2459
2460
  		if (!d_same_name(dentry, parent, name))
  			continue;
94bdd655c   Al Viro   parallel lookups ...
2461
  		hlist_bl_unlock(b);
e7d6ef979   Al Viro   fix idiotic brain...
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
  		/* now we can try to grab a reference */
  		if (!lockref_get_not_dead(&dentry->d_lockref)) {
  			rcu_read_unlock();
  			goto retry;
  		}
  
  		rcu_read_unlock();
  		/*
  		 * somebody is likely to be still doing lookup for it;
  		 * wait for them to finish
  		 */
d9171b934   Al Viro   parallel lookups ...
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
  		spin_lock(&dentry->d_lock);
  		d_wait_lookup(dentry);
  		/*
  		 * it's not in-lookup anymore; in principle we should repeat
  		 * everything from dcache lookup, but it's likely to be what
  		 * d_lookup() would've found anyway.  If it is, just return it;
  		 * otherwise we really have to repeat the whole thing.
  		 */
  		if (unlikely(dentry->d_name.hash != hash))
  			goto mismatch;
  		if (unlikely(dentry->d_parent != parent))
  			goto mismatch;
  		if (unlikely(d_unhashed(dentry)))
  			goto mismatch;
d4c91a8f7   Al Viro   new helper: d_sam...
2487
2488
  		if (unlikely(!d_same_name(dentry, parent, name)))
  			goto mismatch;
d9171b934   Al Viro   parallel lookups ...
2489
2490
  		/* OK, it *is* a hashed match; return it */
  		spin_unlock(&dentry->d_lock);
94bdd655c   Al Viro   parallel lookups ...
2491
2492
2493
  		dput(new);
  		return dentry;
  	}
e7d6ef979   Al Viro   fix idiotic brain...
2494
  	rcu_read_unlock();
94bdd655c   Al Viro   parallel lookups ...
2495
2496
  	/* we can't take ->d_lock here; it's OK, though. */
  	new->d_flags |= DCACHE_PAR_LOOKUP;
d9171b934   Al Viro   parallel lookups ...
2497
  	new->d_wait = wq;
94bdd655c   Al Viro   parallel lookups ...
2498
2499
2500
  	hlist_bl_add_head_rcu(&new->d_u.d_in_lookup_hash, b);
  	hlist_bl_unlock(b);
  	return new;
d9171b934   Al Viro   parallel lookups ...
2501
2502
2503
2504
  mismatch:
  	spin_unlock(&dentry->d_lock);
  	dput(dentry);
  	goto retry;
94bdd655c   Al Viro   parallel lookups ...
2505
2506
  }
  EXPORT_SYMBOL(d_alloc_parallel);
85c7f8104   Al Viro   beginning of tran...
2507
2508
  void __d_lookup_done(struct dentry *dentry)
  {
94bdd655c   Al Viro   parallel lookups ...
2509
2510
2511
  	struct hlist_bl_head *b = in_lookup_hash(dentry->d_parent,
  						 dentry->d_name.hash);
  	hlist_bl_lock(b);
85c7f8104   Al Viro   beginning of tran...
2512
  	dentry->d_flags &= ~DCACHE_PAR_LOOKUP;
94bdd655c   Al Viro   parallel lookups ...
2513
  	__hlist_bl_del(&dentry->d_u.d_in_lookup_hash);
d9171b934   Al Viro   parallel lookups ...
2514
2515
  	wake_up_all(dentry->d_wait);
  	dentry->d_wait = NULL;
94bdd655c   Al Viro   parallel lookups ...
2516
2517
  	hlist_bl_unlock(b);
  	INIT_HLIST_NODE(&dentry->d_u.d_alias);
d9171b934   Al Viro   parallel lookups ...
2518
  	INIT_LIST_HEAD(&dentry->d_lru);
85c7f8104   Al Viro   beginning of tran...
2519
2520
  }
  EXPORT_SYMBOL(__d_lookup_done);
ed782b5a7   Al Viro   dcache.c: new hel...
2521
2522
2523
2524
2525
  
  /* inode->i_lock held if inode is non-NULL */
  
  static inline void __d_add(struct dentry *dentry, struct inode *inode)
  {
84e710da2   Al Viro   parallel lookups ...
2526
2527
  	struct inode *dir = NULL;
  	unsigned n;
0568d705b   Al Viro   __d_add(): don't ...
2528
  	spin_lock(&dentry->d_lock);
84e710da2   Al Viro   parallel lookups ...
2529
2530
2531
  	if (unlikely(d_in_lookup(dentry))) {
  		dir = dentry->d_parent->d_inode;
  		n = start_dir_add(dir);
85c7f8104   Al Viro   beginning of tran...
2532
  		__d_lookup_done(dentry);
84e710da2   Al Viro   parallel lookups ...
2533
  	}
ed782b5a7   Al Viro   dcache.c: new hel...
2534
  	if (inode) {
0568d705b   Al Viro   __d_add(): don't ...
2535
2536
2537
2538
2539
  		unsigned add_flags = d_flags_for_inode(inode);
  		hlist_add_head(&dentry->d_u.d_alias, &inode->i_dentry);
  		raw_write_seqcount_begin(&dentry->d_seq);
  		__d_set_inode_and_type(dentry, inode, add_flags);
  		raw_write_seqcount_end(&dentry->d_seq);
affda4841   Al Viro   trim fsnotify hoo...
2540
  		fsnotify_update_flags(dentry);
ed782b5a7   Al Viro   dcache.c: new hel...
2541
  	}
15d3c589f   Al Viro   fold _d_rehash() ...
2542
  	__d_rehash(dentry);
84e710da2   Al Viro   parallel lookups ...
2543
2544
  	if (dir)
  		end_dir_add(dir, n);
0568d705b   Al Viro   __d_add(): don't ...
2545
2546
2547
  	spin_unlock(&dentry->d_lock);
  	if (inode)
  		spin_unlock(&inode->i_lock);
ed782b5a7   Al Viro   dcache.c: new hel...
2548
  }
fb2d5b86a   Nick Piggin   fs: name case upd...
2549
  /**
34d0d19dc   Al Viro   uninline d_add()
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
   * d_add - add dentry to hash queues
   * @entry: dentry to add
   * @inode: The inode to attach to this dentry
   *
   * This adds the entry to the hash queues and initializes @inode.
   * The entry was actually filled in earlier during d_alloc().
   */
  
  void d_add(struct dentry *entry, struct inode *inode)
  {
b96809173   Al Viro   security_d_instan...
2560
2561
  	if (inode) {
  		security_d_instantiate(entry, inode);
ed782b5a7   Al Viro   dcache.c: new hel...
2562
  		spin_lock(&inode->i_lock);
b96809173   Al Viro   security_d_instan...
2563
  	}
ed782b5a7   Al Viro   dcache.c: new hel...
2564
  	__d_add(entry, inode);
34d0d19dc   Al Viro   uninline d_add()
2565
2566
2567
2568
  }
  EXPORT_SYMBOL(d_add);
  
  /**
668d0cd56   Al Viro   replace d_add_uni...
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
   * d_exact_alias - find and hash an exact unhashed alias
   * @entry: dentry to add
   * @inode: The inode to go with this dentry
   *
   * If an unhashed dentry with the same name/parent and desired
   * inode already exists, hash and return it.  Otherwise, return
   * NULL.
   *
   * Parent directory should be locked.
   */
  struct dentry *d_exact_alias(struct dentry *entry, struct inode *inode)
  {
  	struct dentry *alias;
668d0cd56   Al Viro   replace d_add_uni...
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
  	unsigned int hash = entry->d_name.hash;
  
  	spin_lock(&inode->i_lock);
  	hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
  		/*
  		 * 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.
  		 */
  		if (alias->d_name.hash != hash)
  			continue;
  		if (alias->d_parent != entry->d_parent)
  			continue;
d4c91a8f7   Al Viro   new helper: d_sam...
2595
  		if (!d_same_name(alias, entry->d_parent, &entry->d_name))
668d0cd56   Al Viro   replace d_add_uni...
2596
2597
2598
2599
2600
2601
2602
  			continue;
  		spin_lock(&alias->d_lock);
  		if (!d_unhashed(alias)) {
  			spin_unlock(&alias->d_lock);
  			alias = NULL;
  		} else {
  			__dget_dlock(alias);
15d3c589f   Al Viro   fold _d_rehash() ...
2603
  			__d_rehash(alias);
668d0cd56   Al Viro   replace d_add_uni...
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
  			spin_unlock(&alias->d_lock);
  		}
  		spin_unlock(&inode->i_lock);
  		return alias;
  	}
  	spin_unlock(&inode->i_lock);
  	return NULL;
  }
  EXPORT_SYMBOL(d_exact_alias);
  
  /**
fb2d5b86a   Nick Piggin   fs: name case upd...
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
   * 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).
   */
9aba36dea   Al Viro   qstr constify ins...
2628
  void dentry_update_name_case(struct dentry *dentry, const struct qstr *name)
fb2d5b86a   Nick Piggin   fs: name case upd...
2629
  {
5955102c9   Al Viro   wrappers for ->i_...
2630
  	BUG_ON(!inode_is_locked(dentry->d_parent->d_inode));
fb2d5b86a   Nick Piggin   fs: name case upd...
2631
  	BUG_ON(dentry->d_name.len != name->len); /* d_lookup gives this */
fb2d5b86a   Nick Piggin   fs: name case upd...
2632
  	spin_lock(&dentry->d_lock);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2633
  	write_seqcount_begin(&dentry->d_seq);
fb2d5b86a   Nick Piggin   fs: name case upd...
2634
  	memcpy((unsigned char *)dentry->d_name.name, name->name, name->len);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2635
  	write_seqcount_end(&dentry->d_seq);
fb2d5b86a   Nick Piggin   fs: name case upd...
2636
  	spin_unlock(&dentry->d_lock);
fb2d5b86a   Nick Piggin   fs: name case upd...
2637
2638
  }
  EXPORT_SYMBOL(dentry_update_name_case);
8d85b4845   Al Viro   Allow sharing ext...
2639
  static void swap_names(struct dentry *dentry, struct dentry *target)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2640
  {
8d85b4845   Al Viro   Allow sharing ext...
2641
2642
  	if (unlikely(dname_external(target))) {
  		if (unlikely(dname_external(dentry))) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2643
2644
2645
  			/*
  			 * Both external: swap the pointers
  			 */
9a8d5bb4a   Wu Fengguang   generic swap(): d...
2646
  			swap(target->d_name.name, dentry->d_name.name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2647
2648
2649
2650
2651
  		} else {
  			/*
  			 * dentry:internal, target:external.  Steal target's
  			 * storage and make target internal.
  			 */
321bcf921   J. Bruce Fields   dcache: don't exp...
2652
2653
  			memcpy(target->d_iname, dentry->d_name.name,
  					dentry->d_name.len + 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2654
2655
2656
2657
  			dentry->d_name.name = target->d_name.name;
  			target->d_name.name = target->d_iname;
  		}
  	} else {
8d85b4845   Al Viro   Allow sharing ext...
2658
  		if (unlikely(dname_external(dentry))) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
  			/*
  			 * 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 {
  			/*
da1ce0670   Miklos Szeredi   vfs: add cross-re...
2669
  			 * Both are internal.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2670
  			 */
da1ce0670   Miklos Szeredi   vfs: add cross-re...
2671
2672
2673
2674
2675
2676
  			unsigned int i;
  			BUILD_BUG_ON(!IS_ALIGNED(DNAME_INLINE_LEN, sizeof(long)));
  			for (i = 0; i < DNAME_INLINE_LEN / sizeof(long); i++) {
  				swap(((long *) &dentry->d_iname)[i],
  				     ((long *) &target->d_iname)[i]);
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2677
2678
  		}
  	}
a28ddb87c   Linus Torvalds   fold swapping ->d...
2679
  	swap(dentry->d_name.hash_len, target->d_name.hash_len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2680
  }
8d85b4845   Al Viro   Allow sharing ext...
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
  static void copy_name(struct dentry *dentry, struct dentry *target)
  {
  	struct external_name *old_name = NULL;
  	if (unlikely(dname_external(dentry)))
  		old_name = external_name(dentry);
  	if (unlikely(dname_external(target))) {
  		atomic_inc(&external_name(target)->u.count);
  		dentry->d_name = target->d_name;
  	} else {
  		memcpy(dentry->d_iname, target->d_name.name,
  				target->d_name.len + 1);
  		dentry->d_name.name = dentry->d_iname;
  		dentry->d_name.hash_len = target->d_name.hash_len;
  	}
  	if (old_name && likely(atomic_dec_and_test(&old_name->u.count)))
6d7942377   Roman Gushchin   dcache: account e...
2696
  		call_rcu(&old_name->u.head, __d_free_external_name);
8d85b4845   Al Viro   Allow sharing ext...
2697
  }
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
  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);
  	}
  }
986c01942   Al Viro   fold unlocking th...
2724
  static void dentry_unlock_for_move(struct dentry *dentry, struct dentry *target)
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2725
2726
2727
2728
2729
  {
  	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);
986c01942   Al Viro   fold unlocking th...
2730
2731
  	spin_unlock(&target->d_lock);
  	spin_unlock(&dentry->d_lock);
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2732
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2733
  /*
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2734
2735
2736
   * 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
d2fa4a847   Mikhail Efremov   vfs: Don't exchan...
2737
2738
2739
2740
2741
2742
2743
2744
2745
   * the new name before we switch, unless we are going to rehash
   * it.  Note that if we *do* unhash the target, we are not allowed
   * to rehash it without giving it a new name/hash key - whether
   * we swap or overwrite the names here, resulting name won't match
   * the reality in filesystem; it's only there for d_path() purposes.
   * Note that all of this is happening under rename_lock, so the
   * any hash lookup seeing it in the middle of manipulations will
   * be discarded anyway.  So we do not care what happens to the hash
   * key in that case.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2746
   */
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2747
  /*
183675011   Al Viro   fix loop checks i...
2748
   * __d_move - move a dentry
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2749
2750
   * @dentry: entry to move
   * @target: new dentry
da1ce0670   Miklos Szeredi   vfs: add cross-re...
2751
   * @exchange: exchange the two dentries
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2752
2753
   *
   * Update the dcache to reflect the move of a file name. Negative
c46c88774   Jeff Layton   vfs: document loc...
2754
2755
2756
   * 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
2757
   */
da1ce0670   Miklos Szeredi   vfs: add cross-re...
2758
2759
  static void __d_move(struct dentry *dentry, struct dentry *target,
  		     bool exchange)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2760
  {
84e710da2   Al Viro   parallel lookups ...
2761
2762
  	struct inode *dir = NULL;
  	unsigned n;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2763
2764
2765
  	if (!dentry->d_inode)
  		printk(KERN_WARNING "VFS: moving negative dcache entry
  ");
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2766
2767
  	BUG_ON(d_ancestor(dentry, target));
  	BUG_ON(d_ancestor(target, dentry));
2fd6b7f50   Nick Piggin   fs: dcache scale ...
2768
  	dentry_lock_for_move(dentry, target);
84e710da2   Al Viro   parallel lookups ...
2769
2770
2771
  	if (unlikely(d_in_lookup(target))) {
  		dir = target->d_parent->d_inode;
  		n = start_dir_add(dir);
85c7f8104   Al Viro   beginning of tran...
2772
  		__d_lookup_done(target);
84e710da2   Al Viro   parallel lookups ...
2773
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2774

31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2775
  	write_seqcount_begin(&dentry->d_seq);
1ca7d67cf   John Stultz   seqcount: Add loc...
2776
  	write_seqcount_begin_nested(&target->d_seq, DENTRY_D_LOCK_NESTED);
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2777

15d3c589f   Al Viro   fold _d_rehash() ...
2778
  	/* unhash both */
db470ce8c   NeilBrown   VFS: close race b...
2779
2780
2781
  	/* ___d_drop does write_seqcount_barrier, but they're OK to nest. */
  	___d_drop(dentry);
  	___d_drop(target);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2782

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2783
  	/* Switch the names.. */
8d85b4845   Al Viro   Allow sharing ext...
2784
2785
2786
2787
  	if (exchange)
  		swap_names(dentry, target);
  	else
  		copy_name(dentry, target);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2788

15d3c589f   Al Viro   fold _d_rehash() ...
2789
2790
2791
2792
  	/* rehash in new place(s) */
  	__d_rehash(dentry);
  	if (exchange)
  		__d_rehash(target);
db470ce8c   NeilBrown   VFS: close race b...
2793
2794
  	else
  		target->d_hash.pprev = NULL;
15d3c589f   Al Viro   fold _d_rehash() ...
2795

63cf427a5   Al Viro   kill __d_material...
2796
  	/* ... and switch them in the tree */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2797
  	if (IS_ROOT(dentry)) {
63cf427a5   Al Viro   kill __d_material...
2798
  		/* splicing a tree */
3d56c25e3   Al Viro   fix d_walk()/non-...
2799
  		dentry->d_flags |= DCACHE_RCUACCESS;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2800
2801
  		dentry->d_parent = target->d_parent;
  		target->d_parent = target;
946e51f2b   Al Viro   move d_rcu from o...
2802
2803
  		list_del_init(&target->d_child);
  		list_move(&dentry->d_child, &dentry->d_parent->d_subdirs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2804
  	} else {
63cf427a5   Al Viro   kill __d_material...
2805
  		/* swapping two dentries */
9a8d5bb4a   Wu Fengguang   generic swap(): d...
2806
  		swap(dentry->d_parent, target->d_parent);
946e51f2b   Al Viro   move d_rcu from o...
2807
2808
  		list_move(&target->d_child, &target->d_parent->d_subdirs);
  		list_move(&dentry->d_child, &dentry->d_parent->d_subdirs);
63cf427a5   Al Viro   kill __d_material...
2809
  		if (exchange)
affda4841   Al Viro   trim fsnotify hoo...
2810
2811
  			fsnotify_update_flags(target);
  		fsnotify_update_flags(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2812
  	}
31e6b01f4   Nick Piggin   fs: rcu-walk for ...
2813
2814
  	write_seqcount_end(&target->d_seq);
  	write_seqcount_end(&dentry->d_seq);
84e710da2   Al Viro   parallel lookups ...
2815
2816
  	if (dir)
  		end_dir_add(dir, n);
986c01942   Al Viro   fold unlocking th...
2817
  	dentry_unlock_for_move(dentry, target);
183675011   Al Viro   fix loop checks i...
2818
2819
2820
2821
2822
2823
2824
2825
  }
  
  /*
   * 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...
2826
2827
   * dcache entries should not be moved in this way. See the locking
   * requirements for __d_move.
183675011   Al Viro   fix loop checks i...
2828
2829
2830
2831
   */
  void d_move(struct dentry *dentry, struct dentry *target)
  {
  	write_seqlock(&rename_lock);
da1ce0670   Miklos Szeredi   vfs: add cross-re...
2832
  	__d_move(dentry, target, false);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2833
  	write_sequnlock(&rename_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2834
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
2835
  EXPORT_SYMBOL(d_move);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2836

da1ce0670   Miklos Szeredi   vfs: add cross-re...
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
  /*
   * d_exchange - exchange two dentries
   * @dentry1: first dentry
   * @dentry2: second dentry
   */
  void d_exchange(struct dentry *dentry1, struct dentry *dentry2)
  {
  	write_seqlock(&rename_lock);
  
  	WARN_ON(!dentry1->d_inode);
  	WARN_ON(!dentry2->d_inode);
  	WARN_ON(IS_ROOT(dentry1));
  	WARN_ON(IS_ROOT(dentry2));
  
  	__d_move(dentry1, dentry2, true);
  
  	write_sequnlock(&rename_lock);
  }
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2855
2856
2857
2858
2859
2860
2861
  /**
   * 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...
2862
   */
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2863
  struct dentry *d_ancestor(struct dentry *p1, struct dentry *p2)
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2864
2865
  {
  	struct dentry *p;
871c0067d   OGAWA Hirofumi   [PATCH vfs-2.6 1/...
2866
  	for (p = p2; !IS_ROOT(p); p = p->d_parent) {
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2867
  		if (p->d_parent == p1)
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2868
  			return p;
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2869
  	}
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
2870
  	return NULL;
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2871
2872
2873
2874
2875
2876
  }
  
  /*
   * This helper attempts to cope with remotely renamed directories
   *
   * It assumes that the caller is already holding
a03e283bf   Eric W. Biederman   dcache: Reduce th...
2877
   * dentry->d_parent->d_inode->i_mutex, and rename_lock
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2878
2879
2880
   *
   * Note: If ever the locking in lock_rename() changes, then please
   * remember to update this too...
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2881
   */
b5ae6b15b   Al Viro   merge d_materiali...
2882
  static int __d_unalias(struct inode *inode,
873feea09   Nick Piggin   fs: dcache per-in...
2883
  		struct dentry *dentry, struct dentry *alias)
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2884
  {
9902af79c   Al Viro   parallel lookups:...
2885
2886
  	struct mutex *m1 = NULL;
  	struct rw_semaphore *m2 = NULL;
3d330dc17   J. Bruce Fields   dcache: return -E...
2887
  	int ret = -ESTALE;
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2888
2889
2890
2891
  
  	/* 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...
2892
  	/* See lock_rename() */
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2893
2894
2895
  	if (!mutex_trylock(&dentry->d_sb->s_vfs_rename_mutex))
  		goto out_err;
  	m1 = &dentry->d_sb->s_vfs_rename_mutex;
9902af79c   Al Viro   parallel lookups:...
2896
  	if (!inode_trylock_shared(alias->d_parent->d_inode))
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2897
  		goto out_err;
9902af79c   Al Viro   parallel lookups:...
2898
  	m2 = &alias->d_parent->d_inode->i_rwsem;
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2899
  out_unalias:
8ed936b56   Eric W. Biederman   vfs: Lazily remov...
2900
  	__d_move(alias, dentry, false);
b5ae6b15b   Al Viro   merge d_materiali...
2901
  	ret = 0;
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2902
  out_err:
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2903
  	if (m2)
9902af79c   Al Viro   parallel lookups:...
2904
  		up_read(m2);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2905
2906
2907
2908
  	if (m1)
  		mutex_unlock(m1);
  	return ret;
  }
770bfad84   David Howells   NFS: Add dentry m...
2909
  /**
3f70bd51c   J. Bruce Fields   dcache: move d_sp...
2910
2911
2912
2913
   * 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.
   *
da093a9b7   J. Bruce Fields   dcache: d_splice_...
2914
2915
2916
   * If inode is a directory and has an IS_ROOT alias, 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.
3f70bd51c   J. Bruce Fields   dcache: move d_sp...
2917
   *
908790fa3   J. Bruce Fields   dcache: d_splice_...
2918
2919
2920
   * If a non-IS_ROOT directory is found, the filesystem is corrupt, and
   * we should error out: directories can't have multiple aliases.
   *
3f70bd51c   J. Bruce Fields   dcache: move d_sp...
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
   * 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.
   *
   * Cluster filesystems may call this function with a negative, hashed dentry.
   * In that case, we know that the inode will be a regular file, and also this
   * will only occur during atomic_open. So we need to check for the dentry
   * being already hashed only in the final case.
   */
  struct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry)
  {
3f70bd51c   J. Bruce Fields   dcache: move d_sp...
2934
2935
  	if (IS_ERR(inode))
  		return ERR_CAST(inode);
770bfad84   David Howells   NFS: Add dentry m...
2936
  	BUG_ON(!d_unhashed(dentry));
de689f5e3   Al Viro   don't bother with...
2937
  	if (!inode)
b5ae6b15b   Al Viro   merge d_materiali...
2938
  		goto out;
de689f5e3   Al Viro   don't bother with...
2939

b96809173   Al Viro   security_d_instan...
2940
  	security_d_instantiate(dentry, inode);
873feea09   Nick Piggin   fs: dcache per-in...
2941
  	spin_lock(&inode->i_lock);
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2942
  	if (S_ISDIR(inode->i_mode)) {
b5ae6b15b   Al Viro   merge d_materiali...
2943
2944
  		struct dentry *new = __d_find_any_alias(inode);
  		if (unlikely(new)) {
a03e283bf   Eric W. Biederman   dcache: Reduce th...
2945
2946
  			/* The reference to new ensures it remains an alias */
  			spin_unlock(&inode->i_lock);
183675011   Al Viro   fix loop checks i...
2947
  			write_seqlock(&rename_lock);
b5ae6b15b   Al Viro   merge d_materiali...
2948
2949
  			if (unlikely(d_ancestor(new, dentry))) {
  				write_sequnlock(&rename_lock);
b5ae6b15b   Al Viro   merge d_materiali...
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
  				dput(new);
  				new = ERR_PTR(-ELOOP);
  				pr_warn_ratelimited(
  					"VFS: Lookup of '%s' in %s %s"
  					" would have caused loop
  ",
  					dentry->d_name.name,
  					inode->i_sb->s_type->name,
  					inode->i_sb->s_id);
  			} else if (!IS_ROOT(new)) {
  				int err = __d_unalias(inode, dentry, new);
183675011   Al Viro   fix loop checks i...
2961
  				write_sequnlock(&rename_lock);
b5ae6b15b   Al Viro   merge d_materiali...
2962
2963
2964
2965
  				if (err) {
  					dput(new);
  					new = ERR_PTR(err);
  				}
183675011   Al Viro   fix loop checks i...
2966
  			} else {
b5ae6b15b   Al Viro   merge d_materiali...
2967
2968
  				__d_move(new, dentry, false);
  				write_sequnlock(&rename_lock);
dd179946d   David Howells   VFS: Log the fact...
2969
  			}
b5ae6b15b   Al Viro   merge d_materiali...
2970
2971
  			iput(inode);
  			return new;
9eaef27b3   Trond Myklebust   [PATCH] VFS: Make...
2972
  		}
770bfad84   David Howells   NFS: Add dentry m...
2973
  	}
b5ae6b15b   Al Viro   merge d_materiali...
2974
  out:
ed782b5a7   Al Viro   dcache.c: new hel...
2975
  	__d_add(dentry, inode);
b5ae6b15b   Al Viro   merge d_materiali...
2976
  	return NULL;
770bfad84   David Howells   NFS: Add dentry m...
2977
  }
b5ae6b15b   Al Viro   merge d_materiali...
2978
  EXPORT_SYMBOL(d_splice_alias);
770bfad84   David Howells   NFS: Add dentry m...
2979

cdd16d026   Miklos Szeredi   [patch 2/3] vfs: ...
2980
  static int prepend(char **buffer, int *buflen, const char *str, int namelen)
6092d0481   Ram Pai   [patch 1/7] vfs: ...
2981
2982
2983
2984
2985
2986
2987
2988
  {
  	*buflen -= namelen;
  	if (*buflen < 0)
  		return -ENAMETOOLONG;
  	*buffer -= namelen;
  	memcpy(*buffer, str, namelen);
  	return 0;
  }
232d2d60a   Waiman Long   dcache: Translati...
2989
2990
  /**
   * prepend_name - prepend a pathname in front of current buffer pointer
181299772   Waiman Long   dcache: get/relea...
2991
2992
2993
   * @buffer: buffer pointer
   * @buflen: allocated length of the buffer
   * @name:   name string and length qstr structure
232d2d60a   Waiman Long   dcache: Translati...
2994
2995
2996
2997
2998
2999
3000
3001
3002
   *
   * With RCU path tracing, it may race with d_move(). Use ACCESS_ONCE() to
   * make sure that either the old or the new name pointer and length are
   * fetched. However, there may be mismatch between length and pointer.
   * The length cannot be trusted, we need to copy it byte-by-byte until
   * the length is reached or a null byte is found. It also prepends "/" at
   * the beginning of the name. The sequence number check at the caller will
   * retry it again when a d_move() does happen. So any garbage in the buffer
   * due to mismatched pointer and length will be discarded.
6d13f6944   Al Viro   missing data depe...
3003
3004
3005
   *
   * Data dependency barrier is needed to make sure that we see that terminating
   * NUL.  Alpha strikes again, film at 11...
232d2d60a   Waiman Long   dcache: Translati...
3006
   */
9aba36dea   Al Viro   qstr constify ins...
3007
  static int prepend_name(char **buffer, int *buflen, const struct qstr *name)
cdd16d026   Miklos Szeredi   [patch 2/3] vfs: ...
3008
  {
232d2d60a   Waiman Long   dcache: Translati...
3009
3010
3011
  	const char *dname = ACCESS_ONCE(name->name);
  	u32 dlen = ACCESS_ONCE(name->len);
  	char *p;
6d13f6944   Al Viro   missing data depe...
3012
  	smp_read_barrier_depends();
232d2d60a   Waiman Long   dcache: Translati...
3013
  	*buflen -= dlen + 1;
e825196d4   Al Viro   make prepend_name...
3014
3015
  	if (*buflen < 0)
  		return -ENAMETOOLONG;
232d2d60a   Waiman Long   dcache: Translati...
3016
3017
3018
3019
3020
3021
3022
3023
3024
  	p = *buffer -= dlen + 1;
  	*p++ = '/';
  	while (dlen--) {
  		char c = *dname++;
  		if (!c)
  			break;
  		*p++ = c;
  	}
  	return 0;
cdd16d026   Miklos Szeredi   [patch 2/3] vfs: ...
3025
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3026
  /**
208898c17   Randy Dunlap   fs: fix kernel-do...
3027
   * prepend_path - Prepend path string to a buffer
9d1bc6013   Miklos Szeredi   [patch 2/7] vfs: ...
3028
   * @path: the dentry/vfsmount to report
02125a826   Al Viro   fix apparmor dere...
3029
   * @root: root vfsmnt/dentry
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
3030
3031
   * @buffer: pointer to the end of the buffer
   * @buflen: pointer to buffer length
552ce544e   Linus Torvalds   Revert "[PATCH] F...
3032
   *
181299772   Waiman Long   dcache: get/relea...
3033
3034
3035
3036
3037
3038
3039
3040
3041
   * The function will first try to write out the pathname without taking any
   * lock other than the RCU read lock to make sure that dentries won't go away.
   * It only checks the sequence number of the global rename_lock as any change
   * in the dentry's d_seq will be preceded by changes in the rename_lock
   * sequence number. If the sequence number had been changed, it will restart
   * the whole pathname back-tracing sequence again by taking the rename_lock.
   * In this case, there is no need to take the RCU read lock as the recursive
   * parent pointer references will keep the dentry chain alive as long as no
   * rename operation is performed.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3042
   */
02125a826   Al Viro   fix apparmor dere...
3043
3044
  static int prepend_path(const struct path *path,
  			const struct path *root,
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
3045
  			char **buffer, int *buflen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3046
  {
ede4cebce   Al Viro   prepend_path() ne...
3047
3048
3049
  	struct dentry *dentry;
  	struct vfsmount *vfsmnt;
  	struct mount *mnt;
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
3050
  	int error = 0;
48a066e72   Al Viro   RCU'd vfsmounts
3051
  	unsigned seq, m_seq = 0;
232d2d60a   Waiman Long   dcache: Translati...
3052
3053
  	char *bptr;
  	int blen;
6092d0481   Ram Pai   [patch 1/7] vfs: ...
3054

48f5ec21d   Al Viro   split read_seqret...
3055
  	rcu_read_lock();
48a066e72   Al Viro   RCU'd vfsmounts
3056
3057
3058
  restart_mnt:
  	read_seqbegin_or_lock(&mount_lock, &m_seq);
  	seq = 0;
4ec6c2aea   Li Zhong   fix unpaired rcu ...
3059
  	rcu_read_lock();
232d2d60a   Waiman Long   dcache: Translati...
3060
3061
3062
  restart:
  	bptr = *buffer;
  	blen = *buflen;
48a066e72   Al Viro   RCU'd vfsmounts
3063
  	error = 0;
ede4cebce   Al Viro   prepend_path() ne...
3064
3065
3066
  	dentry = path->dentry;
  	vfsmnt = path->mnt;
  	mnt = real_mount(vfsmnt);
232d2d60a   Waiman Long   dcache: Translati...
3067
  	read_seqbegin_or_lock(&rename_lock, &seq);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
3068
  	while (dentry != root->dentry || vfsmnt != root->mnt) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3069
  		struct dentry * parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3070
  		if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) {
48a066e72   Al Viro   RCU'd vfsmounts
3071
  			struct mount *parent = ACCESS_ONCE(mnt->mnt_parent);
cde93be45   Eric W. Biederman   dcache: Handle es...
3072
3073
3074
3075
3076
3077
3078
  			/* Escaped? */
  			if (dentry != vfsmnt->mnt_root) {
  				bptr = *buffer;
  				blen = *buflen;
  				error = 3;
  				break;
  			}
552ce544e   Linus Torvalds   Revert "[PATCH] F...
3079
  			/* Global root? */
48a066e72   Al Viro   RCU'd vfsmounts
3080
3081
3082
  			if (mnt != parent) {
  				dentry = ACCESS_ONCE(mnt->mnt_mountpoint);
  				mnt = parent;
232d2d60a   Waiman Long   dcache: Translati...
3083
3084
3085
  				vfsmnt = &mnt->mnt;
  				continue;
  			}
232d2d60a   Waiman Long   dcache: Translati...
3086
3087
3088
  			if (!error)
  				error = is_mounted(vfsmnt) ? 1 : 2;
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3089
3090
3091
  		}
  		parent = dentry->d_parent;
  		prefetch(parent);
232d2d60a   Waiman Long   dcache: Translati...
3092
  		error = prepend_name(&bptr, &blen, &dentry->d_name);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
3093
3094
  		if (error)
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3095
3096
  		dentry = parent;
  	}
48f5ec21d   Al Viro   split read_seqret...
3097
3098
3099
3100
  	if (!(seq & 1))
  		rcu_read_unlock();
  	if (need_seqretry(&rename_lock, seq)) {
  		seq = 1;
232d2d60a   Waiman Long   dcache: Translati...
3101
  		goto restart;
48f5ec21d   Al Viro   split read_seqret...
3102
3103
  	}
  	done_seqretry(&rename_lock, seq);
4ec6c2aea   Li Zhong   fix unpaired rcu ...
3104
3105
3106
  
  	if (!(m_seq & 1))
  		rcu_read_unlock();
48a066e72   Al Viro   RCU'd vfsmounts
3107
3108
3109
3110
3111
  	if (need_seqretry(&mount_lock, m_seq)) {
  		m_seq = 1;
  		goto restart_mnt;
  	}
  	done_seqretry(&mount_lock, m_seq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3112

232d2d60a   Waiman Long   dcache: Translati...
3113
3114
3115
3116
3117
3118
3119
3120
  	if (error >= 0 && bptr == *buffer) {
  		if (--blen < 0)
  			error = -ENAMETOOLONG;
  		else
  			*--bptr = '/';
  	}
  	*buffer = bptr;
  	*buflen = blen;
7ea600b53   Al Viro   Nest rename_lock ...
3121
  	return error;
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
3122
  }
be285c712   Andreas Gruenbacher   [patch 3/3] vfs: ...
3123

f2eb6575d   Miklos Szeredi   vfs: add prepend_...
3124
3125
3126
  /**
   * __d_path - return the path of a dentry
   * @path: the dentry/vfsmount to report
02125a826   Al Viro   fix apparmor dere...
3127
   * @root: root vfsmnt/dentry
cd956a1c0   Randy Dunlap   fs/dcache: fix fu...
3128
   * @buf: buffer to return value in
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
3129
3130
   * @buflen: buffer length
   *
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
3131
   * Convert a dentry into an ASCII path name.
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
3132
3133
3134
3135
   *
   * Returns a pointer into the buffer or an error code if the
   * path was too long.
   *
be148247c   Christoph Hellwig   fs: take dcache_l...
3136
   * "buflen" should be positive.
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
3137
   *
02125a826   Al Viro   fix apparmor dere...
3138
   * If the path is not reachable from the supplied root, return %NULL.
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
3139
   */
02125a826   Al Viro   fix apparmor dere...
3140
3141
  char *__d_path(const struct path *path,
  	       const struct path *root,
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
3142
3143
3144
3145
3146
3147
  	       char *buf, int buflen)
  {
  	char *res = buf + buflen;
  	int error;
  
  	prepend(&res, &buflen, "\0", 1);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
3148
  	error = prepend_path(path, root, &res, &buflen);
be148247c   Christoph Hellwig   fs: take dcache_l...
3149

02125a826   Al Viro   fix apparmor dere...
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
  	if (error < 0)
  		return ERR_PTR(error);
  	if (error > 0)
  		return NULL;
  	return res;
  }
  
  char *d_absolute_path(const struct path *path,
  	       char *buf, int buflen)
  {
  	struct path root = {};
  	char *res = buf + buflen;
  	int error;
  
  	prepend(&res, &buflen, "\0", 1);
02125a826   Al Viro   fix apparmor dere...
3165
  	error = prepend_path(path, &root, &res, &buflen);
02125a826   Al Viro   fix apparmor dere...
3166
3167
3168
3169
  
  	if (error > 1)
  		error = -EINVAL;
  	if (error < 0)
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
3170
  		return ERR_PTR(error);
f2eb6575d   Miklos Szeredi   vfs: add prepend_...
3171
  	return res;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3172
  }
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
3173
3174
3175
  /*
   * same as __d_path but appends "(deleted)" for unlinked files.
   */
02125a826   Al Viro   fix apparmor dere...
3176
3177
3178
  static int path_with_deleted(const struct path *path,
  			     const struct path *root,
  			     char **buf, int *buflen)
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
  {
  	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...
3189
3190
3191
3192
  static int prepend_unreachable(char **buffer, int *buflen)
  {
  	return prepend(buffer, buflen, "(unreachable)", 13);
  }
68f0d9d92   Linus Torvalds   vfs: make d_path(...
3193
3194
3195
3196
3197
3198
3199
3200
3201
  static void get_fs_root_rcu(struct fs_struct *fs, struct path *root)
  {
  	unsigned seq;
  
  	do {
  		seq = read_seqcount_begin(&fs->seq);
  		*root = fs->root;
  	} while (read_seqcount_retry(&fs->seq, seq));
  }
a03a8a709   Jan Blunck   d_path: kerneldoc...
3202
3203
  /**
   * d_path - return the path of a dentry
cf28b4863   Jan Blunck   d_path: Make d_pa...
3204
   * @path: path to report
a03a8a709   Jan Blunck   d_path: kerneldoc...
3205
3206
3207
3208
3209
3210
   * @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...
3211
3212
3213
3214
   * 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...
3215
   *
31f3e0b3a   Miklos Szeredi   [patch 1/3] vfs: ...
3216
   * "buflen" should be positive.
a03a8a709   Jan Blunck   d_path: kerneldoc...
3217
   */
20d4fdc1a   Jan Engelhardt   [patch 2/4] fs: m...
3218
  char *d_path(const struct path *path, char *buf, int buflen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3219
  {
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
3220
  	char *res = buf + buflen;
6ac08c39a   Jan Blunck   Use struct path i...
3221
  	struct path root;
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
3222
  	int error;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3223

c23fbb6bc   Eric Dumazet   VFS: delay the de...
3224
3225
3226
3227
3228
3229
  	/*
  	 * 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:
f48cfddc6   Eric W. Biederman   vfs: In d_path do...
3230
3231
3232
3233
  	 *
  	 * Some pseudo inodes are mountable.  When they are mounted
  	 * path->dentry == path->mnt->mnt_root.  In that case don't call d_dname
  	 * and instead have d_path return the mounted path.
c23fbb6bc   Eric Dumazet   VFS: delay the de...
3234
  	 */
f48cfddc6   Eric W. Biederman   vfs: In d_path do...
3235
3236
  	if (path->dentry->d_op && path->dentry->d_op->d_dname &&
  	    (!IS_ROOT(path->dentry) || path->dentry != path->mnt->mnt_root))
cf28b4863   Jan Blunck   d_path: Make d_pa...
3237
  		return path->dentry->d_op->d_dname(path->dentry, buf, buflen);
c23fbb6bc   Eric Dumazet   VFS: delay the de...
3238

68f0d9d92   Linus Torvalds   vfs: make d_path(...
3239
3240
  	rcu_read_lock();
  	get_fs_root_rcu(current->fs, &root);
02125a826   Al Viro   fix apparmor dere...
3241
  	error = path_with_deleted(path, &root, &res, &buflen);
68f0d9d92   Linus Torvalds   vfs: make d_path(...
3242
  	rcu_read_unlock();
02125a826   Al Viro   fix apparmor dere...
3243
  	if (error < 0)
ffd1f4ed5   Miklos Szeredi   vfs: only add " (...
3244
  		res = ERR_PTR(error);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3245
3246
  	return res;
  }
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
3247
  EXPORT_SYMBOL(d_path);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3248
3249
  
  /*
c23fbb6bc   Eric Dumazet   VFS: delay the de...
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
   * 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);
  }
118b23022   Al Viro   cope with potenti...
3269
3270
3271
3272
3273
  char *simple_dname(struct dentry *dentry, char *buffer, int buflen)
  {
  	char *end = buffer + buflen;
  	/* these dentries are never renamed, so d_lock is not needed */
  	if (prepend(&end, &buflen, " (deleted)", 11) ||
232d2d60a   Waiman Long   dcache: Translati...
3274
  	    prepend(&end, &buflen, dentry->d_name.name, dentry->d_name.len) ||
118b23022   Al Viro   cope with potenti...
3275
3276
  	    prepend(&end, &buflen, "/", 1))  
  		end = ERR_PTR(-ENAMETOOLONG);
232d2d60a   Waiman Long   dcache: Translati...
3277
  	return end;
118b23022   Al Viro   cope with potenti...
3278
  }
31bbe16f6   David Herrmann   drm: add pseudo f...
3279
  EXPORT_SYMBOL(simple_dname);
118b23022   Al Viro   cope with potenti...
3280

c23fbb6bc   Eric Dumazet   VFS: delay the de...
3281
  /*
6092d0481   Ram Pai   [patch 1/7] vfs: ...
3282
3283
   * Write full pathname from the root of the filesystem into the buffer.
   */
f65008015   Al Viro   __dentry_path() f...
3284
  static char *__dentry_path(struct dentry *d, char *buf, int buflen)
6092d0481   Ram Pai   [patch 1/7] vfs: ...
3285
  {
f65008015   Al Viro   __dentry_path() f...
3286
  	struct dentry *dentry;
232d2d60a   Waiman Long   dcache: Translati...
3287
3288
3289
  	char *end, *retval;
  	int len, seq = 0;
  	int error = 0;
6092d0481   Ram Pai   [patch 1/7] vfs: ...
3290

f65008015   Al Viro   __dentry_path() f...
3291
3292
  	if (buflen < 2)
  		goto Elong;
48f5ec21d   Al Viro   split read_seqret...
3293
  	rcu_read_lock();
232d2d60a   Waiman Long   dcache: Translati...
3294
  restart:
f65008015   Al Viro   __dentry_path() f...
3295
  	dentry = d;
232d2d60a   Waiman Long   dcache: Translati...
3296
3297
3298
  	end = buf + buflen;
  	len = buflen;
  	prepend(&end, &len, "\0", 1);
6092d0481   Ram Pai   [patch 1/7] vfs: ...
3299
3300
3301
  	/* Get '/' right */
  	retval = end-1;
  	*retval = '/';
232d2d60a   Waiman Long   dcache: Translati...
3302
  	read_seqbegin_or_lock(&rename_lock, &seq);
cdd16d026   Miklos Szeredi   [patch 2/3] vfs: ...
3303
3304
  	while (!IS_ROOT(dentry)) {
  		struct dentry *parent = dentry->d_parent;
6092d0481   Ram Pai   [patch 1/7] vfs: ...
3305

6092d0481   Ram Pai   [patch 1/7] vfs: ...
3306
  		prefetch(parent);
232d2d60a   Waiman Long   dcache: Translati...
3307
3308
3309
  		error = prepend_name(&end, &len, &dentry->d_name);
  		if (error)
  			break;
6092d0481   Ram Pai   [patch 1/7] vfs: ...
3310
3311
3312
3313
  
  		retval = end;
  		dentry = parent;
  	}
48f5ec21d   Al Viro   split read_seqret...
3314
3315
3316
3317
  	if (!(seq & 1))
  		rcu_read_unlock();
  	if (need_seqretry(&rename_lock, seq)) {
  		seq = 1;
232d2d60a   Waiman Long   dcache: Translati...
3318
  		goto restart;
48f5ec21d   Al Viro   split read_seqret...
3319
3320
  	}
  	done_seqretry(&rename_lock, seq);
232d2d60a   Waiman Long   dcache: Translati...
3321
3322
  	if (error)
  		goto Elong;
c103135c1   Al Viro   new helper: __den...
3323
3324
3325
3326
  	return retval;
  Elong:
  	return ERR_PTR(-ENAMETOOLONG);
  }
ec2447c27   Nick Piggin   hostfs: simplify ...
3327
3328
3329
  
  char *dentry_path_raw(struct dentry *dentry, char *buf, int buflen)
  {
232d2d60a   Waiman Long   dcache: Translati...
3330
  	return __dentry_path(dentry, buf, buflen);
ec2447c27   Nick Piggin   hostfs: simplify ...
3331
3332
  }
  EXPORT_SYMBOL(dentry_path_raw);
c103135c1   Al Viro   new helper: __den...
3333
3334
3335
3336
3337
  
  char *dentry_path(struct dentry *dentry, char *buf, int buflen)
  {
  	char *p = NULL;
  	char *retval;
c103135c1   Al Viro   new helper: __den...
3338
3339
3340
3341
3342
3343
3344
  	if (d_unlinked(dentry)) {
  		p = buf + buflen;
  		if (prepend(&p, &buflen, "//deleted", 10) != 0)
  			goto Elong;
  		buflen++;
  	}
  	retval = __dentry_path(dentry, buf, buflen);
c103135c1   Al Viro   new helper: __den...
3345
3346
  	if (!IS_ERR(retval) && p)
  		*p = '/';	/* restore '/' overriden with '\0' */
6092d0481   Ram Pai   [patch 1/7] vfs: ...
3347
3348
  	return retval;
  Elong:
6092d0481   Ram Pai   [patch 1/7] vfs: ...
3349
3350
  	return ERR_PTR(-ENAMETOOLONG);
  }
8b19e3418   Linus Torvalds   vfs: make getcwd(...
3351
3352
  static void get_fs_root_and_pwd_rcu(struct fs_struct *fs, struct path *root,
  				    struct path *pwd)
5762482f5   Linus Torvalds   vfs: move get_fs_...
3353
  {
8b19e3418   Linus Torvalds   vfs: make getcwd(...
3354
3355
3356
3357
3358
3359
3360
  	unsigned seq;
  
  	do {
  		seq = read_seqcount_begin(&fs->seq);
  		*root = fs->root;
  		*pwd = fs->pwd;
  	} while (read_seqcount_retry(&fs->seq, seq));
5762482f5   Linus Torvalds   vfs: move get_fs_...
3361
  }
6092d0481   Ram Pai   [patch 1/7] vfs: ...
3362
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
   * 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...
3380
  SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3381
  {
552ce544e   Linus Torvalds   Revert "[PATCH] F...
3382
  	int error;
6ac08c39a   Jan Blunck   Use struct path i...
3383
  	struct path pwd, root;
3272c544d   Linus Torvalds   vfs: use __getnam...
3384
  	char *page = __getname();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3385
3386
3387
  
  	if (!page)
  		return -ENOMEM;
8b19e3418   Linus Torvalds   vfs: make getcwd(...
3388
3389
  	rcu_read_lock();
  	get_fs_root_and_pwd_rcu(current->fs, &root, &pwd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3390

552ce544e   Linus Torvalds   Revert "[PATCH] F...
3391
  	error = -ENOENT;
f3da392e9   Alexey Dobriyan   dcache: extrace a...
3392
  	if (!d_unlinked(pwd.dentry)) {
552ce544e   Linus Torvalds   Revert "[PATCH] F...
3393
  		unsigned long len;
3272c544d   Linus Torvalds   vfs: use __getnam...
3394
3395
  		char *cwd = page + PATH_MAX;
  		int buflen = PATH_MAX;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3396

8df9d1a41   Miklos Szeredi   vfs: show unreach...
3397
  		prepend(&cwd, &buflen, "\0", 1);
02125a826   Al Viro   fix apparmor dere...
3398
  		error = prepend_path(&pwd, &root, &cwd, &buflen);
ff812d724   Linus Torvalds   vfs: don't copy t...
3399
  		rcu_read_unlock();
552ce544e   Linus Torvalds   Revert "[PATCH] F...
3400

02125a826   Al Viro   fix apparmor dere...
3401
  		if (error < 0)
552ce544e   Linus Torvalds   Revert "[PATCH] F...
3402
  			goto out;
8df9d1a41   Miklos Szeredi   vfs: show unreach...
3403
  		/* Unreachable from current root */
02125a826   Al Viro   fix apparmor dere...
3404
  		if (error > 0) {
8df9d1a41   Miklos Szeredi   vfs: show unreach...
3405
3406
3407
3408
  			error = prepend_unreachable(&cwd, &buflen);
  			if (error)
  				goto out;
  		}
552ce544e   Linus Torvalds   Revert "[PATCH] F...
3409
  		error = -ERANGE;
3272c544d   Linus Torvalds   vfs: use __getnam...
3410
  		len = PATH_MAX + page - cwd;
552ce544e   Linus Torvalds   Revert "[PATCH] F...
3411
3412
3413
3414
3415
  		if (len <= size) {
  			error = len;
  			if (copy_to_user(buf, cwd, len))
  				error = -EFAULT;
  		}
949854d02   Nick Piggin   fs: Use rename lo...
3416
  	} else {
ff812d724   Linus Torvalds   vfs: don't copy t...
3417
  		rcu_read_unlock();
949854d02   Nick Piggin   fs: Use rename lo...
3418
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3419
3420
  
  out:
3272c544d   Linus Torvalds   vfs: use __getnam...
3421
  	__putname(page);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
  	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
   *
a6e5787fc   Yaowei Bai   fs/dcache.c: is_s...
3436
3437
   * Returns true if new_dentry is a subdirectory of the parent (at any depth).
   * Returns false otherwise.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3438
3439
3440
   * Caller must ensure that "new_dentry" is pinned before calling is_subdir()
   */
    
a6e5787fc   Yaowei Bai   fs/dcache.c: is_s...
3441
  bool is_subdir(struct dentry *new_dentry, struct dentry *old_dentry)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3442
  {
a6e5787fc   Yaowei Bai   fs/dcache.c: is_s...
3443
  	bool result;
949854d02   Nick Piggin   fs: Use rename lo...
3444
  	unsigned seq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3445

e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
3446
  	if (new_dentry == old_dentry)
a6e5787fc   Yaowei Bai   fs/dcache.c: is_s...
3447
  		return true;
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
3448

e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
3449
  	do {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3450
  		/* for restarting inner loop in case of seq retry */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3451
  		seq = read_seqbegin(&rename_lock);
949854d02   Nick Piggin   fs: Use rename lo...
3452
3453
3454
3455
3456
  		/*
  		 * 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/...
3457
  		if (d_ancestor(old_dentry, new_dentry))
a6e5787fc   Yaowei Bai   fs/dcache.c: is_s...
3458
  			result = true;
e2761a116   OGAWA Hirofumi   [PATCH vfs-2.6 2/...
3459
  		else
a6e5787fc   Yaowei Bai   fs/dcache.c: is_s...
3460
  			result = false;
949854d02   Nick Piggin   fs: Use rename lo...
3461
  		rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3462
  	} while (read_seqretry(&rename_lock, seq));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3463
3464
3465
  
  	return result;
  }
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
3466
  static enum d_walk_ret d_genocide_kill(void *data, struct dentry *dentry)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3467
  {
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
3468
3469
3470
3471
  	struct dentry *root = data;
  	if (dentry != root) {
  		if (d_unhashed(dentry) || !dentry->d_inode)
  			return D_WALK_SKIP;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3472

01ddc4ede   Miklos Szeredi   vfs: restructure ...
3473
3474
3475
3476
  		if (!(dentry->d_flags & DCACHE_GENOCIDE)) {
  			dentry->d_flags |= DCACHE_GENOCIDE;
  			dentry->d_lockref.count--;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3477
  	}
db14fc3ab   Miklos Szeredi   vfs: add d_walk()
3478
3479
  	return D_WALK_CONTINUE;
  }
58db63d08   Nick Piggin   fs: dcache avoid ...
3480

db14fc3ab   Miklos Szeredi   vfs: add d_walk()
3481
3482
3483
  void d_genocide(struct dentry *parent)
  {
  	d_walk(parent, parent, d_genocide_kill, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3484
  }
60545d0d4   Al Viro   [O_TMPFILE] it's ...
3485
  void d_tmpfile(struct dentry *dentry, struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3486
  {
60545d0d4   Al Viro   [O_TMPFILE] it's ...
3487
3488
  	inode_dec_link_count(inode);
  	BUG_ON(dentry->d_name.name != dentry->d_iname ||
946e51f2b   Al Viro   move d_rcu from o...
3489
  		!hlist_unhashed(&dentry->d_u.d_alias) ||
60545d0d4   Al Viro   [O_TMPFILE] it's ...
3490
3491
3492
3493
3494
3495
3496
3497
  		!d_unlinked(dentry));
  	spin_lock(&dentry->d_parent->d_lock);
  	spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
  	dentry->d_name.len = sprintf(dentry->d_iname, "#%llu",
  				(unsigned long long)inode->i_ino);
  	spin_unlock(&dentry->d_lock);
  	spin_unlock(&dentry->d_parent->d_lock);
  	d_instantiate(dentry, inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3498
  }
60545d0d4   Al Viro   [O_TMPFILE] it's ...
3499
  EXPORT_SYMBOL(d_tmpfile);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
  
  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)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3513
3514
3515
3516
3517
3518
3519
3520
  	/* 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 '...
3521
  					sizeof(struct hlist_bl_head),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3522
3523
  					dhash_entries,
  					13,
3d375d785   Pavel Tatashin   mm: update caller...
3524
  					HASH_EARLY | HASH_ZERO,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3525
3526
  					&d_hash_shift,
  					&d_hash_mask,
31fe62b95   Tim Bird   mm: add a low lim...
3527
  					0,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3528
  					0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3529
  }
74bf17cff   Denis Cheng   fs: remove the un...
3530
  static void __init dcache_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3531
  {
3d375d785   Pavel Tatashin   mm: update caller...
3532
  	/*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3533
3534
  	 * A constructor could be added for stable state like the lists,
  	 * but it is probably not worth it because of the cache nature
3d375d785   Pavel Tatashin   mm: update caller...
3535
  	 * of the dcache.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3536
  	 */
0a31bd5f2   Christoph Lameter   KMEM_CACHE(): sim...
3537
  	dentry_cache = KMEM_CACHE(dentry,
5d097056c   Vladimir Davydov   kmemcg: account c...
3538
  		SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_MEM_SPREAD|SLAB_ACCOUNT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3539
3540
3541
3542
3543
3544
3545
  
  	/* 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 '...
3546
  					sizeof(struct hlist_bl_head),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3547
3548
  					dhash_entries,
  					13,
3d375d785   Pavel Tatashin   mm: update caller...
3549
  					HASH_ZERO,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3550
3551
  					&d_hash_shift,
  					&d_hash_mask,
31fe62b95   Tim Bird   mm: add a low lim...
3552
  					0,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3553
  					0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3554
3555
3556
  }
  
  /* SLAB cache for __getname() consumers */
e18b890bb   Christoph Lameter   [PATCH] slab: rem...
3557
  struct kmem_cache *names_cachep __read_mostly;
ec4f86059   H Hartley Sweeten   fs/dcache.c: Codi...
3558
  EXPORT_SYMBOL(names_cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3559

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3560
  EXPORT_SYMBOL(d_genocide);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3561
3562
  void __init vfs_caches_init_early(void)
  {
6916363f3   Sebastian Andrzej Siewior   fs/dcache: init i...
3563
3564
3565
3566
  	int i;
  
  	for (i = 0; i < ARRAY_SIZE(in_lookup_hashtable); i++)
  		INIT_HLIST_BL_HEAD(&in_lookup_hashtable[i]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3567
3568
3569
  	dcache_init_early();
  	inode_init_early();
  }
4248b0da4   Mel Gorman   fs, file table: r...
3570
  void __init vfs_caches_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3571
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3572
  	names_cachep = kmem_cache_create("names_cache", PATH_MAX, 0,
20c2df83d   Paul Mundt   mm: Remove slab d...
3573
  			SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3574

74bf17cff   Denis Cheng   fs: remove the un...
3575
3576
  	dcache_init();
  	inode_init();
4248b0da4   Mel Gorman   fs, file table: r...
3577
3578
  	files_init();
  	files_maxfiles_init();
74bf17cff   Denis Cheng   fs: remove the un...
3579
  	mnt_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3580
3581
3582
  	bdev_cache_init();
  	chrdev_init();
  }