blob: b4d2e28eef5b1e0ee9a78e8d9b58566312300f5d [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * fs/dcache.c
3 *
4 * Complete reimplementation
5 * (C) 1997 Thomas Schoebel-Theuer,
6 * with heavy changes by Linus Torvalds
7 */
8
9/*
10 * Notes on the allocation strategy:
11 *
12 * The dcache is a master of the icache - whenever a dcache entry
13 * exists, the inode will always exist. "iput()" is done either when
14 * the dcache entry is deleted or garbage collected.
15 */
16
Linus Torvalds1da177e2005-04-16 15:20:36 -070017#include <linux/syscalls.h>
18#include <linux/string.h>
19#include <linux/mm.h>
20#include <linux/fs.h>
John McCutchan7a91bf72005-08-08 13:52:16 -040021#include <linux/fsnotify.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070022#include <linux/slab.h>
23#include <linux/init.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070024#include <linux/hash.h>
25#include <linux/cache.h>
26#include <linux/module.h>
27#include <linux/mount.h>
28#include <linux/file.h>
29#include <asm/uaccess.h>
30#include <linux/security.h>
31#include <linux/seqlock.h>
32#include <linux/swap.h>
33#include <linux/bootmem.h>
Al Viro5ad4e532009-03-29 19:50:06 -040034#include <linux/fs_struct.h>
Frederic Weisbecker613afbf2009-07-16 15:44:29 +020035#include <linux/hardirq.h>
David Howells07f3f052006-09-30 20:52:18 +020036#include "internal.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070037
Nick Piggin789680d2011-01-07 17:49:30 +110038/*
39 * Usage:
Nick Pigginb23fb0a2011-01-07 17:49:35 +110040 * dcache_inode_lock protects:
41 * - i_dentry, d_alias, d_inode
Nick Piggin23044502011-01-07 17:49:31 +110042 * dcache_hash_lock protects:
43 * - the dcache hash table, s_anon lists
44 * dcache_lru_lock protects:
45 * - the dcache lru lists and counters
46 * d_lock protects:
47 * - d_flags
48 * - d_name
49 * - d_lru
Nick Pigginb7ab39f2011-01-07 17:49:32 +110050 * - d_count
Nick Pigginda502952011-01-07 17:49:33 +110051 * - d_unhashed()
Nick Piggin2fd6b7f2011-01-07 17:49:34 +110052 * - d_parent and d_subdirs
53 * - childrens' d_child and d_parent
Nick Pigginb23fb0a2011-01-07 17:49:35 +110054 * - d_alias, d_inode
Nick Piggin789680d2011-01-07 17:49:30 +110055 *
56 * Ordering:
Nick Pigginb5c84bf2011-01-07 17:49:38 +110057 * dcache_inode_lock
58 * dentry->d_lock
59 * dcache_lru_lock
60 * dcache_hash_lock
Nick Piggin789680d2011-01-07 17:49:30 +110061 *
Nick Pigginda502952011-01-07 17:49:33 +110062 * If there is an ancestor relationship:
63 * dentry->d_parent->...->d_parent->d_lock
64 * ...
65 * dentry->d_parent->d_lock
66 * dentry->d_lock
67 *
68 * If no ancestor relationship:
Nick Piggin789680d2011-01-07 17:49:30 +110069 * if (dentry1 < dentry2)
70 * dentry1->d_lock
71 * dentry2->d_lock
72 */
Eric Dumazetfa3536c2006-03-26 01:37:24 -080073int sysctl_vfs_cache_pressure __read_mostly = 100;
Linus Torvalds1da177e2005-04-16 15:20:36 -070074EXPORT_SYMBOL_GPL(sysctl_vfs_cache_pressure);
75
Nick Pigginb23fb0a2011-01-07 17:49:35 +110076__cacheline_aligned_in_smp DEFINE_SPINLOCK(dcache_inode_lock);
Nick Piggin789680d2011-01-07 17:49:30 +110077static __cacheline_aligned_in_smp DEFINE_SPINLOCK(dcache_hash_lock);
Nick Piggin23044502011-01-07 17:49:31 +110078static __cacheline_aligned_in_smp DEFINE_SPINLOCK(dcache_lru_lock);
Al Viro74c3cbe2007-07-22 08:04:18 -040079__cacheline_aligned_in_smp DEFINE_SEQLOCK(rename_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -070080
Nick Piggin949854d2011-01-07 17:49:37 +110081EXPORT_SYMBOL(rename_lock);
Nick Pigginb23fb0a2011-01-07 17:49:35 +110082EXPORT_SYMBOL(dcache_inode_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -070083
Christoph Lametere18b8902006-12-06 20:33:20 -080084static struct kmem_cache *dentry_cache __read_mostly;
Linus Torvalds1da177e2005-04-16 15:20:36 -070085
86#define DNAME_INLINE_LEN (sizeof(struct dentry)-offsetof(struct dentry,d_iname))
87
88/*
89 * This is the single most critical data structure when it comes
90 * to the dcache: the hashtable for lookups. Somebody should try
91 * to make this good - I've just made it work.
92 *
93 * This hash-function tries to avoid losing too many bits of hash
94 * information, yet avoid using a prime hash-size or similar.
95 */
96#define D_HASHBITS d_hash_shift
97#define D_HASHMASK d_hash_mask
98
Eric Dumazetfa3536c2006-03-26 01:37:24 -080099static unsigned int d_hash_mask __read_mostly;
100static unsigned int d_hash_shift __read_mostly;
101static struct hlist_head *dentry_hashtable __read_mostly;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102
103/* Statistics gathering. */
104struct dentry_stat_t dentry_stat = {
105 .age_limit = 45,
106};
107
Nick Piggin3e880fb2011-01-07 17:49:19 +1100108static DEFINE_PER_CPU(unsigned int, nr_dentry);
Christoph Hellwig312d3ca2010-10-10 05:36:23 -0400109
110#if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS)
Nick Piggin3e880fb2011-01-07 17:49:19 +1100111static int get_nr_dentry(void)
112{
113 int i;
114 int sum = 0;
115 for_each_possible_cpu(i)
116 sum += per_cpu(nr_dentry, i);
117 return sum < 0 ? 0 : sum;
118}
119
Christoph Hellwig312d3ca2010-10-10 05:36:23 -0400120int proc_nr_dentry(ctl_table *table, int write, void __user *buffer,
121 size_t *lenp, loff_t *ppos)
122{
Nick Piggin3e880fb2011-01-07 17:49:19 +1100123 dentry_stat.nr_dentry = get_nr_dentry();
Christoph Hellwig312d3ca2010-10-10 05:36:23 -0400124 return proc_dointvec(table, write, buffer, lenp, ppos);
125}
126#endif
127
Christoph Hellwig9c82ab92010-10-10 05:36:22 -0400128static void __d_free(struct rcu_head *head)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700129{
Christoph Hellwig9c82ab92010-10-10 05:36:22 -0400130 struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu);
131
Arjan van de Venfd217f42008-10-21 06:47:33 -0700132 WARN_ON(!list_empty(&dentry->d_alias));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133 if (dname_external(dentry))
134 kfree(dentry->d_name.name);
135 kmem_cache_free(dentry_cache, dentry);
136}
137
138/*
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100139 * no locks, please.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700140 */
141static void d_free(struct dentry *dentry)
142{
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100143 BUG_ON(dentry->d_count);
Nick Piggin3e880fb2011-01-07 17:49:19 +1100144 this_cpu_dec(nr_dentry);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700145 if (dentry->d_op && dentry->d_op->d_release)
146 dentry->d_op->d_release(dentry);
Christoph Hellwig312d3ca2010-10-10 05:36:23 -0400147
Eric Dumazetb3423412006-12-06 20:38:48 -0800148 /* if dentry was never inserted into hash, immediate free is OK */
Akinobu Mitae8462ca2008-02-06 01:37:07 -0800149 if (hlist_unhashed(&dentry->d_hash))
Christoph Hellwig9c82ab92010-10-10 05:36:22 -0400150 __d_free(&dentry->d_u.d_rcu);
Eric Dumazetb3423412006-12-06 20:38:48 -0800151 else
Christoph Hellwig9c82ab92010-10-10 05:36:22 -0400152 call_rcu(&dentry->d_u.d_rcu, __d_free);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700153}
154
155/*
156 * Release the dentry's inode, using the filesystem
157 * d_iput() operation if defined.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700158 */
Arjan van de Ven858119e2006-01-14 13:20:43 -0800159static void dentry_iput(struct dentry * dentry)
Miklos Szeredi31f3e0b2008-06-23 18:11:52 +0200160 __releases(dentry->d_lock)
Nick Pigginb23fb0a2011-01-07 17:49:35 +1100161 __releases(dcache_inode_lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700162{
163 struct inode *inode = dentry->d_inode;
164 if (inode) {
165 dentry->d_inode = NULL;
166 list_del_init(&dentry->d_alias);
167 spin_unlock(&dentry->d_lock);
Nick Pigginb23fb0a2011-01-07 17:49:35 +1100168 spin_unlock(&dcache_inode_lock);
Linus Torvaldsf805fbd2005-09-19 19:54:29 -0700169 if (!inode->i_nlink)
170 fsnotify_inoderemove(inode);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700171 if (dentry->d_op && dentry->d_op->d_iput)
172 dentry->d_op->d_iput(dentry, inode);
173 else
174 iput(inode);
175 } else {
176 spin_unlock(&dentry->d_lock);
Nick Pigginb23fb0a2011-01-07 17:49:35 +1100177 spin_unlock(&dcache_inode_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700178 }
179}
180
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700181/*
Nick Piggin23044502011-01-07 17:49:31 +1100182 * dentry_lru_(add|del|move_tail) must be called with d_lock held.
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700183 */
184static void dentry_lru_add(struct dentry *dentry)
185{
Christoph Hellwiga4633352010-10-10 05:36:26 -0400186 if (list_empty(&dentry->d_lru)) {
Nick Piggin23044502011-01-07 17:49:31 +1100187 spin_lock(&dcache_lru_lock);
Christoph Hellwiga4633352010-10-10 05:36:26 -0400188 list_add(&dentry->d_lru, &dentry->d_sb->s_dentry_lru);
189 dentry->d_sb->s_nr_dentry_unused++;
Nick Piggin86c87492011-01-07 17:49:18 +1100190 dentry_stat.nr_unused++;
Nick Piggin23044502011-01-07 17:49:31 +1100191 spin_unlock(&dcache_lru_lock);
Christoph Hellwiga4633352010-10-10 05:36:26 -0400192 }
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700193}
194
Nick Piggin23044502011-01-07 17:49:31 +1100195static void __dentry_lru_del(struct dentry *dentry)
196{
197 list_del_init(&dentry->d_lru);
198 dentry->d_sb->s_nr_dentry_unused--;
199 dentry_stat.nr_unused--;
200}
201
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700202static void dentry_lru_del(struct dentry *dentry)
203{
204 if (!list_empty(&dentry->d_lru)) {
Nick Piggin23044502011-01-07 17:49:31 +1100205 spin_lock(&dcache_lru_lock);
206 __dentry_lru_del(dentry);
207 spin_unlock(&dcache_lru_lock);
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700208 }
209}
210
Christoph Hellwiga4633352010-10-10 05:36:26 -0400211static void dentry_lru_move_tail(struct dentry *dentry)
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700212{
Nick Piggin23044502011-01-07 17:49:31 +1100213 spin_lock(&dcache_lru_lock);
Christoph Hellwiga4633352010-10-10 05:36:26 -0400214 if (list_empty(&dentry->d_lru)) {
215 list_add_tail(&dentry->d_lru, &dentry->d_sb->s_dentry_lru);
216 dentry->d_sb->s_nr_dentry_unused++;
Nick Piggin86c87492011-01-07 17:49:18 +1100217 dentry_stat.nr_unused++;
Christoph Hellwiga4633352010-10-10 05:36:26 -0400218 } else {
219 list_move_tail(&dentry->d_lru, &dentry->d_sb->s_dentry_lru);
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700220 }
Nick Piggin23044502011-01-07 17:49:31 +1100221 spin_unlock(&dcache_lru_lock);
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700222}
223
Miklos Szeredid52b9082007-05-08 00:23:46 -0700224/**
225 * d_kill - kill dentry and return parent
226 * @dentry: dentry to kill
227 *
Miklos Szeredi31f3e0b2008-06-23 18:11:52 +0200228 * The dentry must already be unhashed and removed from the LRU.
Miklos Szeredid52b9082007-05-08 00:23:46 -0700229 *
230 * If this is the root of the dentry tree, return NULL.
Nick Piggin23044502011-01-07 17:49:31 +1100231 *
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100232 * dentry->d_lock and parent->d_lock must be held by caller, and are dropped by
233 * d_kill.
Miklos Szeredid52b9082007-05-08 00:23:46 -0700234 */
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100235static struct dentry *d_kill(struct dentry *dentry, struct dentry *parent)
Miklos Szeredi31f3e0b2008-06-23 18:11:52 +0200236 __releases(dentry->d_lock)
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100237 __releases(parent->d_lock)
Nick Pigginb23fb0a2011-01-07 17:49:35 +1100238 __releases(dcache_inode_lock)
Miklos Szeredid52b9082007-05-08 00:23:46 -0700239{
Nick Piggin949854d2011-01-07 17:49:37 +1100240 dentry->d_parent = NULL;
Miklos Szeredid52b9082007-05-08 00:23:46 -0700241 list_del(&dentry->d_u.d_child);
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100242 if (parent)
243 spin_unlock(&parent->d_lock);
Miklos Szeredid52b9082007-05-08 00:23:46 -0700244 dentry_iput(dentry);
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100245 /*
246 * dentry_iput drops the locks, at which point nobody (except
247 * transient RCU lookups) can reach this dentry.
248 */
Miklos Szeredid52b9082007-05-08 00:23:46 -0700249 d_free(dentry);
OGAWA Hirofumi871c0062008-10-16 07:50:27 +0900250 return parent;
Miklos Szeredid52b9082007-05-08 00:23:46 -0700251}
252
Nick Piggin789680d2011-01-07 17:49:30 +1100253/**
254 * d_drop - drop a dentry
255 * @dentry: dentry to drop
256 *
257 * d_drop() unhashes the entry from the parent dentry hashes, so that it won't
258 * be found through a VFS lookup any more. Note that this is different from
259 * deleting the dentry - d_delete will try to mark the dentry negative if
260 * possible, giving a successful _negative_ lookup, while d_drop will
261 * just make the cache lookup fail.
262 *
263 * d_drop() is used mainly for stuff that wants to invalidate a dentry for some
264 * reason (NFS timeouts or autofs deletes).
265 *
266 * __d_drop requires dentry->d_lock.
267 */
268void __d_drop(struct dentry *dentry)
269{
270 if (!(dentry->d_flags & DCACHE_UNHASHED)) {
271 dentry->d_flags |= DCACHE_UNHASHED;
272 spin_lock(&dcache_hash_lock);
273 hlist_del_rcu(&dentry->d_hash);
274 spin_unlock(&dcache_hash_lock);
275 }
276}
277EXPORT_SYMBOL(__d_drop);
278
279void d_drop(struct dentry *dentry)
280{
Nick Piggin789680d2011-01-07 17:49:30 +1100281 spin_lock(&dentry->d_lock);
282 __d_drop(dentry);
283 spin_unlock(&dentry->d_lock);
Nick Piggin789680d2011-01-07 17:49:30 +1100284}
285EXPORT_SYMBOL(d_drop);
286
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287/*
288 * This is dput
289 *
290 * This is complicated by the fact that we do not want to put
291 * dentries that are no longer on any hash chain on the unused
292 * list: we'd much rather just get rid of them immediately.
293 *
294 * However, that implies that we have to traverse the dentry
295 * tree upwards to the parents which might _also_ now be
296 * scheduled for deletion (it may have been only waiting for
297 * its last child to go away).
298 *
299 * This tail recursion is done by hand as we don't want to depend
300 * on the compiler to always get this right (gcc generally doesn't).
301 * Real recursion would eat up our stack space.
302 */
303
304/*
305 * dput - release a dentry
306 * @dentry: dentry to release
307 *
308 * Release a dentry. This will drop the usage count and if appropriate
309 * call the dentry unlink method as well as removing it from the queues and
310 * releasing its resources. If the parent dentries were scheduled for release
311 * they too may now get deleted.
312 *
313 * no dcache lock, please.
314 */
315
316void dput(struct dentry *dentry)
317{
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100318 struct dentry *parent;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700319 if (!dentry)
320 return;
321
322repeat:
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100323 if (dentry->d_count == 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700324 might_sleep();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700325 spin_lock(&dentry->d_lock);
Nick Piggin61f3dee2011-01-07 17:49:40 +1100326 BUG_ON(!dentry->d_count);
327 if (dentry->d_count > 1) {
328 dentry->d_count--;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700329 spin_unlock(&dentry->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700330 return;
331 }
332
Linus Torvalds1da177e2005-04-16 15:20:36 -0700333 if (dentry->d_op && dentry->d_op->d_delete) {
334 if (dentry->d_op->d_delete(dentry))
Nick Piggin61f3dee2011-01-07 17:49:40 +1100335 goto kill_it;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700336 }
Nick Piggin265ac902010-10-10 05:36:24 -0400337
Linus Torvalds1da177e2005-04-16 15:20:36 -0700338 /* Unreachable? Get rid of it */
339 if (d_unhashed(dentry))
340 goto kill_it;
Nick Piggin265ac902010-10-10 05:36:24 -0400341
342 /* Otherwise leave it cached and ensure it's on the LRU */
343 dentry->d_flags |= DCACHE_REFERENCED;
Christoph Hellwiga4633352010-10-10 05:36:26 -0400344 dentry_lru_add(dentry);
Nick Piggin265ac902010-10-10 05:36:24 -0400345
Nick Piggin61f3dee2011-01-07 17:49:40 +1100346 dentry->d_count--;
347 spin_unlock(&dentry->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700348 return;
349
Miklos Szeredid52b9082007-05-08 00:23:46 -0700350kill_it:
Nick Piggin61f3dee2011-01-07 17:49:40 +1100351 if (!spin_trylock(&dcache_inode_lock)) {
352relock:
353 spin_unlock(&dentry->d_lock);
354 cpu_relax();
355 goto repeat;
356 }
357 if (IS_ROOT(dentry))
358 parent = NULL;
359 else
360 parent = dentry->d_parent;
361 if (parent && !spin_trylock(&parent->d_lock)) {
362 spin_unlock(&dcache_inode_lock);
363 goto relock;
364 }
365 dentry->d_count--;
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700366 /* if dentry was on the d_lru list delete it from there */
367 dentry_lru_del(dentry);
Nick Piggin61f3dee2011-01-07 17:49:40 +1100368 /* if it was on the hash (d_delete case), then remove it */
369 __d_drop(dentry);
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100370 dentry = d_kill(dentry, parent);
Miklos Szeredid52b9082007-05-08 00:23:46 -0700371 if (dentry)
372 goto repeat;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700373}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -0700374EXPORT_SYMBOL(dput);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700375
376/**
377 * d_invalidate - invalidate a dentry
378 * @dentry: dentry to invalidate
379 *
380 * Try to invalidate the dentry if it turns out to be
381 * possible. If there are other dentries that can be
382 * reached through this one we can't delete it and we
383 * return -EBUSY. On success we return 0.
384 *
385 * no dcache lock.
386 */
387
388int d_invalidate(struct dentry * dentry)
389{
390 /*
391 * If it's already been dropped, return OK.
392 */
Nick Pigginda502952011-01-07 17:49:33 +1100393 spin_lock(&dentry->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700394 if (d_unhashed(dentry)) {
Nick Pigginda502952011-01-07 17:49:33 +1100395 spin_unlock(&dentry->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700396 return 0;
397 }
398 /*
399 * Check whether to do a partial shrink_dcache
400 * to get rid of unused child entries.
401 */
402 if (!list_empty(&dentry->d_subdirs)) {
Nick Pigginda502952011-01-07 17:49:33 +1100403 spin_unlock(&dentry->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700404 shrink_dcache_parent(dentry);
Nick Pigginda502952011-01-07 17:49:33 +1100405 spin_lock(&dentry->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700406 }
407
408 /*
409 * Somebody else still using it?
410 *
411 * If it's a directory, we can't drop it
412 * for fear of somebody re-populating it
413 * with children (even though dropping it
414 * would make it unreachable from the root,
415 * we might still populate it if it was a
416 * working directory or similar).
417 */
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100418 if (dentry->d_count > 1) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700419 if (dentry->d_inode && S_ISDIR(dentry->d_inode->i_mode)) {
420 spin_unlock(&dentry->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421 return -EBUSY;
422 }
423 }
424
425 __d_drop(dentry);
426 spin_unlock(&dentry->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700427 return 0;
428}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -0700429EXPORT_SYMBOL(d_invalidate);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700430
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100431/* This must be called with d_lock held */
Nick Piggindc0474b2011-01-07 17:49:43 +1100432static inline void __dget_dlock(struct dentry *dentry)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700433{
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100434 dentry->d_count++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700435}
436
Nick Piggindc0474b2011-01-07 17:49:43 +1100437static inline void __dget(struct dentry *dentry)
Nick Piggin23044502011-01-07 17:49:31 +1100438{
Nick Piggin23044502011-01-07 17:49:31 +1100439 spin_lock(&dentry->d_lock);
Nick Piggindc0474b2011-01-07 17:49:43 +1100440 __dget_dlock(dentry);
Nick Piggin23044502011-01-07 17:49:31 +1100441 spin_unlock(&dentry->d_lock);
Nick Piggin23044502011-01-07 17:49:31 +1100442}
443
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100444struct dentry *dget_parent(struct dentry *dentry)
445{
446 struct dentry *ret;
447
448repeat:
449 spin_lock(&dentry->d_lock);
450 ret = dentry->d_parent;
451 if (!ret)
452 goto out;
453 if (dentry == ret) {
454 ret->d_count++;
455 goto out;
456 }
457 if (!spin_trylock(&ret->d_lock)) {
458 spin_unlock(&dentry->d_lock);
459 cpu_relax();
460 goto repeat;
461 }
462 BUG_ON(!ret->d_count);
463 ret->d_count++;
464 spin_unlock(&ret->d_lock);
465out:
466 spin_unlock(&dentry->d_lock);
467 return ret;
468}
469EXPORT_SYMBOL(dget_parent);
470
Linus Torvalds1da177e2005-04-16 15:20:36 -0700471/**
472 * d_find_alias - grab a hashed alias of inode
473 * @inode: inode in question
474 * @want_discon: flag, used by d_splice_alias, to request
475 * that only a DISCONNECTED alias be returned.
476 *
477 * If inode has a hashed alias, or is a directory and has any alias,
478 * acquire the reference to alias and return it. Otherwise return NULL.
479 * Notice that if inode is a directory there can be only one alias and
480 * it can be unhashed only if it has no children, or if it is the root
481 * of a filesystem.
482 *
NeilBrown21c0d8f2006-10-04 02:16:16 -0700483 * If the inode has an IS_ROOT, DCACHE_DISCONNECTED alias, then prefer
Linus Torvalds1da177e2005-04-16 15:20:36 -0700484 * any other hashed alias over that one unless @want_discon is set,
NeilBrown21c0d8f2006-10-04 02:16:16 -0700485 * in which case only return an IS_ROOT, DCACHE_DISCONNECTED alias.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700486 */
Nick Pigginda502952011-01-07 17:49:33 +1100487static struct dentry *__d_find_alias(struct inode *inode, int want_discon)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700488{
Nick Pigginda502952011-01-07 17:49:33 +1100489 struct dentry *alias, *discon_alias;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700490
Nick Pigginda502952011-01-07 17:49:33 +1100491again:
492 discon_alias = NULL;
493 list_for_each_entry(alias, &inode->i_dentry, d_alias) {
494 spin_lock(&alias->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700495 if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) {
NeilBrown21c0d8f2006-10-04 02:16:16 -0700496 if (IS_ROOT(alias) &&
Nick Pigginda502952011-01-07 17:49:33 +1100497 (alias->d_flags & DCACHE_DISCONNECTED)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700498 discon_alias = alias;
Nick Pigginda502952011-01-07 17:49:33 +1100499 } else if (!want_discon) {
Nick Piggindc0474b2011-01-07 17:49:43 +1100500 __dget_dlock(alias);
Nick Pigginda502952011-01-07 17:49:33 +1100501 spin_unlock(&alias->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700502 return alias;
503 }
504 }
Nick Pigginda502952011-01-07 17:49:33 +1100505 spin_unlock(&alias->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700506 }
Nick Pigginda502952011-01-07 17:49:33 +1100507 if (discon_alias) {
508 alias = discon_alias;
509 spin_lock(&alias->d_lock);
510 if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) {
511 if (IS_ROOT(alias) &&
512 (alias->d_flags & DCACHE_DISCONNECTED)) {
Nick Piggindc0474b2011-01-07 17:49:43 +1100513 __dget_dlock(alias);
Nick Pigginda502952011-01-07 17:49:33 +1100514 spin_unlock(&alias->d_lock);
515 return alias;
516 }
517 }
518 spin_unlock(&alias->d_lock);
519 goto again;
520 }
521 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700522}
523
Nick Pigginda502952011-01-07 17:49:33 +1100524struct dentry *d_find_alias(struct inode *inode)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700525{
David Howells214fda12006-03-25 03:06:36 -0800526 struct dentry *de = NULL;
527
528 if (!list_empty(&inode->i_dentry)) {
Nick Pigginb23fb0a2011-01-07 17:49:35 +1100529 spin_lock(&dcache_inode_lock);
David Howells214fda12006-03-25 03:06:36 -0800530 de = __d_find_alias(inode, 0);
Nick Pigginb23fb0a2011-01-07 17:49:35 +1100531 spin_unlock(&dcache_inode_lock);
David Howells214fda12006-03-25 03:06:36 -0800532 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700533 return de;
534}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -0700535EXPORT_SYMBOL(d_find_alias);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700536
537/*
538 * Try to kill dentries associated with this inode.
539 * WARNING: you must own a reference to inode.
540 */
541void d_prune_aliases(struct inode *inode)
542{
Domen Puncer0cdca3f2005-09-10 00:27:07 -0700543 struct dentry *dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700544restart:
Nick Pigginb23fb0a2011-01-07 17:49:35 +1100545 spin_lock(&dcache_inode_lock);
Domen Puncer0cdca3f2005-09-10 00:27:07 -0700546 list_for_each_entry(dentry, &inode->i_dentry, d_alias) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547 spin_lock(&dentry->d_lock);
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100548 if (!dentry->d_count) {
Nick Piggindc0474b2011-01-07 17:49:43 +1100549 __dget_dlock(dentry);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700550 __d_drop(dentry);
551 spin_unlock(&dentry->d_lock);
Nick Pigginb23fb0a2011-01-07 17:49:35 +1100552 spin_unlock(&dcache_inode_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553 dput(dentry);
554 goto restart;
555 }
556 spin_unlock(&dentry->d_lock);
557 }
Nick Pigginb23fb0a2011-01-07 17:49:35 +1100558 spin_unlock(&dcache_inode_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700559}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -0700560EXPORT_SYMBOL(d_prune_aliases);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700561
562/*
Andrew Mortond702ccb2006-06-22 14:47:31 -0700563 * Throw away a dentry - free the inode, dput the parent. This requires that
564 * the LRU list has already been removed.
565 *
Miklos Szeredi85864e12007-10-16 23:27:09 -0700566 * Try to prune ancestors as well. This is necessary to prevent
567 * quadratic behavior of shrink_dcache_parent(), but is also expected
568 * to be beneficial in reducing dentry cache fragmentation.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569 */
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100570static void prune_one_dentry(struct dentry *dentry, struct dentry *parent)
Miklos Szeredi31f3e0b2008-06-23 18:11:52 +0200571 __releases(dentry->d_lock)
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100572 __releases(parent->d_lock)
Nick Pigginb23fb0a2011-01-07 17:49:35 +1100573 __releases(dcache_inode_lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700574{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700575 __d_drop(dentry);
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100576 dentry = d_kill(dentry, parent);
Miklos Szeredid52b9082007-05-08 00:23:46 -0700577
578 /*
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100579 * Prune ancestors.
Miklos Szeredid52b9082007-05-08 00:23:46 -0700580 */
Miklos Szeredid52b9082007-05-08 00:23:46 -0700581 while (dentry) {
Nick Pigginb23fb0a2011-01-07 17:49:35 +1100582 spin_lock(&dcache_inode_lock);
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100583again:
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100584 spin_lock(&dentry->d_lock);
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100585 if (IS_ROOT(dentry))
586 parent = NULL;
587 else
588 parent = dentry->d_parent;
589 if (parent && !spin_trylock(&parent->d_lock)) {
590 spin_unlock(&dentry->d_lock);
591 goto again;
592 }
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100593 dentry->d_count--;
594 if (dentry->d_count) {
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100595 if (parent)
596 spin_unlock(&parent->d_lock);
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100597 spin_unlock(&dentry->d_lock);
Nick Pigginb23fb0a2011-01-07 17:49:35 +1100598 spin_unlock(&dcache_inode_lock);
Miklos Szeredid52b9082007-05-08 00:23:46 -0700599 return;
Nick Piggin23044502011-01-07 17:49:31 +1100600 }
Miklos Szeredid52b9082007-05-08 00:23:46 -0700601
Christoph Hellwiga4633352010-10-10 05:36:26 -0400602 dentry_lru_del(dentry);
Miklos Szeredid52b9082007-05-08 00:23:46 -0700603 __d_drop(dentry);
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100604 dentry = d_kill(dentry, parent);
Miklos Szeredid52b9082007-05-08 00:23:46 -0700605 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700606}
607
Christoph Hellwig3049cfe2010-10-10 05:36:25 -0400608static void shrink_dentry_list(struct list_head *list)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700609{
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700610 struct dentry *dentry;
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700611
Christoph Hellwig3049cfe2010-10-10 05:36:25 -0400612 while (!list_empty(list)) {
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100613 struct dentry *parent;
614
Christoph Hellwig3049cfe2010-10-10 05:36:25 -0400615 dentry = list_entry(list->prev, struct dentry, d_lru);
Nick Piggin23044502011-01-07 17:49:31 +1100616
617 if (!spin_trylock(&dentry->d_lock)) {
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100618relock:
Nick Piggin23044502011-01-07 17:49:31 +1100619 spin_unlock(&dcache_lru_lock);
620 cpu_relax();
621 spin_lock(&dcache_lru_lock);
622 continue;
623 }
624
Linus Torvalds1da177e2005-04-16 15:20:36 -0700625 /*
626 * We found an inuse dentry which was not removed from
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700627 * the LRU because of laziness during lookup. Do not free
628 * it - just keep it off the LRU list.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700629 */
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100630 if (dentry->d_count) {
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100631 __dentry_lru_del(dentry);
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700632 spin_unlock(&dentry->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633 continue;
634 }
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100635 if (IS_ROOT(dentry))
636 parent = NULL;
637 else
638 parent = dentry->d_parent;
639 if (parent && !spin_trylock(&parent->d_lock)) {
640 spin_unlock(&dentry->d_lock);
641 goto relock;
642 }
643 __dentry_lru_del(dentry);
Nick Piggin23044502011-01-07 17:49:31 +1100644 spin_unlock(&dcache_lru_lock);
645
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100646 prune_one_dentry(dentry, parent);
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100647 /* dcache_inode_lock and dentry->d_lock dropped */
Nick Pigginb23fb0a2011-01-07 17:49:35 +1100648 spin_lock(&dcache_inode_lock);
Nick Piggin23044502011-01-07 17:49:31 +1100649 spin_lock(&dcache_lru_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700650 }
Christoph Hellwig3049cfe2010-10-10 05:36:25 -0400651}
652
653/**
654 * __shrink_dcache_sb - shrink the dentry LRU on a given superblock
655 * @sb: superblock to shrink dentry LRU.
656 * @count: number of entries to prune
657 * @flags: flags to control the dentry processing
658 *
659 * If flags contains DCACHE_REFERENCED reference dentries will not be pruned.
660 */
661static void __shrink_dcache_sb(struct super_block *sb, int *count, int flags)
662{
663 /* called from prune_dcache() and shrink_dcache_parent() */
664 struct dentry *dentry;
665 LIST_HEAD(referenced);
666 LIST_HEAD(tmp);
667 int cnt = *count;
668
Nick Pigginb23fb0a2011-01-07 17:49:35 +1100669 spin_lock(&dcache_inode_lock);
Nick Piggin23044502011-01-07 17:49:31 +1100670relock:
671 spin_lock(&dcache_lru_lock);
Christoph Hellwig3049cfe2010-10-10 05:36:25 -0400672 while (!list_empty(&sb->s_dentry_lru)) {
673 dentry = list_entry(sb->s_dentry_lru.prev,
674 struct dentry, d_lru);
675 BUG_ON(dentry->d_sb != sb);
676
Nick Piggin23044502011-01-07 17:49:31 +1100677 if (!spin_trylock(&dentry->d_lock)) {
678 spin_unlock(&dcache_lru_lock);
679 cpu_relax();
680 goto relock;
681 }
682
Christoph Hellwig3049cfe2010-10-10 05:36:25 -0400683 /*
684 * If we are honouring the DCACHE_REFERENCED flag and the
685 * dentry has this flag set, don't free it. Clear the flag
686 * and put it back on the LRU.
687 */
Nick Piggin23044502011-01-07 17:49:31 +1100688 if (flags & DCACHE_REFERENCED &&
689 dentry->d_flags & DCACHE_REFERENCED) {
690 dentry->d_flags &= ~DCACHE_REFERENCED;
691 list_move(&dentry->d_lru, &referenced);
Christoph Hellwig3049cfe2010-10-10 05:36:25 -0400692 spin_unlock(&dentry->d_lock);
Nick Piggin23044502011-01-07 17:49:31 +1100693 } else {
694 list_move_tail(&dentry->d_lru, &tmp);
695 spin_unlock(&dentry->d_lock);
696 if (!--cnt)
697 break;
Christoph Hellwig3049cfe2010-10-10 05:36:25 -0400698 }
Nick Piggin23044502011-01-07 17:49:31 +1100699 /* XXX: re-add cond_resched_lock when dcache_lock goes away */
Christoph Hellwig3049cfe2010-10-10 05:36:25 -0400700 }
701
702 *count = cnt;
703 shrink_dentry_list(&tmp);
704
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700705 if (!list_empty(&referenced))
706 list_splice(&referenced, &sb->s_dentry_lru);
Nick Piggin23044502011-01-07 17:49:31 +1100707 spin_unlock(&dcache_lru_lock);
Nick Pigginb23fb0a2011-01-07 17:49:35 +1100708 spin_unlock(&dcache_inode_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700709}
710
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700711/**
712 * prune_dcache - shrink the dcache
713 * @count: number of entries to try to free
Linus Torvalds1da177e2005-04-16 15:20:36 -0700714 *
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700715 * Shrink the dcache. This is done when we need more memory, or simply when we
716 * need to unmount something (at which point we need to unuse all dentries).
717 *
718 * This function may fail to free any resources if all the dentries are in use.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700719 */
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700720static void prune_dcache(int count)
721{
Al Virodca33252010-07-25 02:31:46 +0400722 struct super_block *sb, *p = NULL;
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700723 int w_count;
Nick Piggin86c87492011-01-07 17:49:18 +1100724 int unused = dentry_stat.nr_unused;
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700725 int prune_ratio;
726 int pruned;
727
728 if (unused == 0 || count == 0)
729 return;
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700730 if (count >= unused)
731 prune_ratio = 1;
732 else
733 prune_ratio = unused / count;
734 spin_lock(&sb_lock);
Al Virodca33252010-07-25 02:31:46 +0400735 list_for_each_entry(sb, &super_blocks, s_list) {
Al Viro551de6f2010-03-22 19:36:35 -0400736 if (list_empty(&sb->s_instances))
737 continue;
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700738 if (sb->s_nr_dentry_unused == 0)
739 continue;
740 sb->s_count++;
741 /* Now, we reclaim unused dentrins with fairness.
742 * We reclaim them same percentage from each superblock.
743 * We calculate number of dentries to scan on this sb
744 * as follows, but the implementation is arranged to avoid
745 * overflows:
746 * number of dentries to scan on this sb =
747 * count * (number of dentries on this sb /
748 * number of dentries in the machine)
749 */
750 spin_unlock(&sb_lock);
751 if (prune_ratio != 1)
752 w_count = (sb->s_nr_dentry_unused / prune_ratio) + 1;
753 else
754 w_count = sb->s_nr_dentry_unused;
755 pruned = w_count;
756 /*
757 * We need to be sure this filesystem isn't being unmounted,
758 * otherwise we could race with generic_shutdown_super(), and
759 * end up holding a reference to an inode while the filesystem
760 * is unmounted. So we try to get s_umount, and make sure
761 * s_root isn't NULL.
762 */
763 if (down_read_trylock(&sb->s_umount)) {
764 if ((sb->s_root != NULL) &&
765 (!list_empty(&sb->s_dentry_lru))) {
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700766 __shrink_dcache_sb(sb, &w_count,
767 DCACHE_REFERENCED);
768 pruned -= w_count;
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700769 }
770 up_read(&sb->s_umount);
771 }
772 spin_lock(&sb_lock);
Al Virodca33252010-07-25 02:31:46 +0400773 if (p)
774 __put_super(p);
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700775 count -= pruned;
Al Virodca33252010-07-25 02:31:46 +0400776 p = sb;
Al Viro79893c12010-03-22 20:27:55 -0400777 /* more work left to do? */
778 if (count <= 0)
779 break;
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700780 }
Al Virodca33252010-07-25 02:31:46 +0400781 if (p)
782 __put_super(p);
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700783 spin_unlock(&sb_lock);
Kentaro Makitada3bbdd2008-07-23 21:27:13 -0700784}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700785
786/**
787 * shrink_dcache_sb - shrink dcache for a superblock
788 * @sb: superblock
789 *
Christoph Hellwig3049cfe2010-10-10 05:36:25 -0400790 * Shrink the dcache for the specified super block. This is used to free
791 * the dcache before unmounting a file system.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700792 */
Christoph Hellwig3049cfe2010-10-10 05:36:25 -0400793void shrink_dcache_sb(struct super_block *sb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700794{
Christoph Hellwig3049cfe2010-10-10 05:36:25 -0400795 LIST_HEAD(tmp);
796
Nick Pigginb23fb0a2011-01-07 17:49:35 +1100797 spin_lock(&dcache_inode_lock);
Nick Piggin23044502011-01-07 17:49:31 +1100798 spin_lock(&dcache_lru_lock);
Christoph Hellwig3049cfe2010-10-10 05:36:25 -0400799 while (!list_empty(&sb->s_dentry_lru)) {
800 list_splice_init(&sb->s_dentry_lru, &tmp);
801 shrink_dentry_list(&tmp);
802 }
Nick Piggin23044502011-01-07 17:49:31 +1100803 spin_unlock(&dcache_lru_lock);
Nick Pigginb23fb0a2011-01-07 17:49:35 +1100804 spin_unlock(&dcache_inode_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700805}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -0700806EXPORT_SYMBOL(shrink_dcache_sb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807
808/*
David Howellsc636ebd2006-10-11 01:22:19 -0700809 * destroy a single subtree of dentries for unmount
810 * - see the comments on shrink_dcache_for_umount() for a description of the
811 * locking
812 */
813static void shrink_dcache_for_umount_subtree(struct dentry *dentry)
814{
815 struct dentry *parent;
David Howellsf8713572006-10-28 10:38:46 -0700816 unsigned detached = 0;
David Howellsc636ebd2006-10-11 01:22:19 -0700817
818 BUG_ON(!IS_ROOT(dentry));
819
820 /* detach this root from the system */
Nick Piggin23044502011-01-07 17:49:31 +1100821 spin_lock(&dentry->d_lock);
Christoph Hellwiga4633352010-10-10 05:36:26 -0400822 dentry_lru_del(dentry);
David Howellsc636ebd2006-10-11 01:22:19 -0700823 __d_drop(dentry);
Nick Pigginda502952011-01-07 17:49:33 +1100824 spin_unlock(&dentry->d_lock);
David Howellsc636ebd2006-10-11 01:22:19 -0700825
826 for (;;) {
827 /* descend to the first leaf in the current subtree */
828 while (!list_empty(&dentry->d_subdirs)) {
829 struct dentry *loop;
830
831 /* this is a branch with children - detach all of them
832 * from the system in one go */
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100833 spin_lock(&dentry->d_lock);
David Howellsc636ebd2006-10-11 01:22:19 -0700834 list_for_each_entry(loop, &dentry->d_subdirs,
835 d_u.d_child) {
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100836 spin_lock_nested(&loop->d_lock,
837 DENTRY_D_LOCK_NESTED);
Christoph Hellwiga4633352010-10-10 05:36:26 -0400838 dentry_lru_del(loop);
David Howellsc636ebd2006-10-11 01:22:19 -0700839 __d_drop(loop);
Nick Pigginda502952011-01-07 17:49:33 +1100840 spin_unlock(&loop->d_lock);
David Howellsc636ebd2006-10-11 01:22:19 -0700841 }
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100842 spin_unlock(&dentry->d_lock);
David Howellsc636ebd2006-10-11 01:22:19 -0700843
844 /* move to the first child */
845 dentry = list_entry(dentry->d_subdirs.next,
846 struct dentry, d_u.d_child);
847 }
848
849 /* consume the dentries from this leaf up through its parents
850 * until we find one with children or run out altogether */
851 do {
852 struct inode *inode;
853
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100854 if (dentry->d_count != 0) {
David Howellsc636ebd2006-10-11 01:22:19 -0700855 printk(KERN_ERR
856 "BUG: Dentry %p{i=%lx,n=%s}"
857 " still in use (%d)"
858 " [unmount of %s %s]\n",
859 dentry,
860 dentry->d_inode ?
861 dentry->d_inode->i_ino : 0UL,
862 dentry->d_name.name,
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100863 dentry->d_count,
David Howellsc636ebd2006-10-11 01:22:19 -0700864 dentry->d_sb->s_type->name,
865 dentry->d_sb->s_id);
866 BUG();
867 }
868
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100869 if (IS_ROOT(dentry)) {
David Howellsc636ebd2006-10-11 01:22:19 -0700870 parent = NULL;
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100871 list_del(&dentry->d_u.d_child);
872 } else {
OGAWA Hirofumi871c0062008-10-16 07:50:27 +0900873 parent = dentry->d_parent;
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100874 spin_lock(&parent->d_lock);
875 parent->d_count--;
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100876 list_del(&dentry->d_u.d_child);
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100877 spin_unlock(&parent->d_lock);
OGAWA Hirofumi871c0062008-10-16 07:50:27 +0900878 }
David Howellsc636ebd2006-10-11 01:22:19 -0700879
David Howellsf8713572006-10-28 10:38:46 -0700880 detached++;
David Howellsc636ebd2006-10-11 01:22:19 -0700881
882 inode = dentry->d_inode;
883 if (inode) {
884 dentry->d_inode = NULL;
885 list_del_init(&dentry->d_alias);
886 if (dentry->d_op && dentry->d_op->d_iput)
887 dentry->d_op->d_iput(dentry, inode);
888 else
889 iput(inode);
890 }
891
892 d_free(dentry);
893
894 /* finished when we fall off the top of the tree,
895 * otherwise we ascend to the parent and move to the
896 * next sibling if there is one */
897 if (!parent)
Christoph Hellwig312d3ca2010-10-10 05:36:23 -0400898 return;
David Howellsc636ebd2006-10-11 01:22:19 -0700899 dentry = parent;
David Howellsc636ebd2006-10-11 01:22:19 -0700900 } while (list_empty(&dentry->d_subdirs));
901
902 dentry = list_entry(dentry->d_subdirs.next,
903 struct dentry, d_u.d_child);
904 }
905}
906
907/*
908 * destroy the dentries attached to a superblock on unmounting
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100909 * - we don't need to use dentry->d_lock because:
David Howellsc636ebd2006-10-11 01:22:19 -0700910 * - the superblock is detached from all mountings and open files, so the
911 * dentry trees will not be rearranged by the VFS
912 * - s_umount is write-locked, so the memory pressure shrinker will ignore
913 * any dentries belonging to this superblock that it comes across
914 * - the filesystem itself is no longer permitted to rearrange the dentries
915 * in this superblock
916 */
917void shrink_dcache_for_umount(struct super_block *sb)
918{
919 struct dentry *dentry;
920
921 if (down_read_trylock(&sb->s_umount))
922 BUG();
923
924 dentry = sb->s_root;
925 sb->s_root = NULL;
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100926 spin_lock(&dentry->d_lock);
927 dentry->d_count--;
928 spin_unlock(&dentry->d_lock);
David Howellsc636ebd2006-10-11 01:22:19 -0700929 shrink_dcache_for_umount_subtree(dentry);
930
931 while (!hlist_empty(&sb->s_anon)) {
932 dentry = hlist_entry(sb->s_anon.first, struct dentry, d_hash);
933 shrink_dcache_for_umount_subtree(dentry);
934 }
935}
936
937/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700938 * Search for at least 1 mount point in the dentry's subdirs.
939 * We descend to the next level whenever the d_subdirs
940 * list is non-empty and continue searching.
941 */
942
943/**
944 * have_submounts - check for mounts over a dentry
945 * @parent: dentry to check.
946 *
947 * Return true if the parent or its subdirectories contain
948 * a mount point
949 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700950int have_submounts(struct dentry *parent)
951{
Nick Piggin949854d2011-01-07 17:49:37 +1100952 struct dentry *this_parent;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700953 struct list_head *next;
Nick Piggin949854d2011-01-07 17:49:37 +1100954 unsigned seq;
Nick Piggin58db63d2011-01-07 17:49:39 +1100955 int locked = 0;
Nick Piggin949854d2011-01-07 17:49:37 +1100956
Nick Piggin949854d2011-01-07 17:49:37 +1100957 seq = read_seqbegin(&rename_lock);
Nick Piggin58db63d2011-01-07 17:49:39 +1100958again:
959 this_parent = parent;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700960
Linus Torvalds1da177e2005-04-16 15:20:36 -0700961 if (d_mountpoint(parent))
962 goto positive;
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100963 spin_lock(&this_parent->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700964repeat:
965 next = this_parent->d_subdirs.next;
966resume:
967 while (next != &this_parent->d_subdirs) {
968 struct list_head *tmp = next;
Eric Dumazet5160ee62006-01-08 01:03:32 -0800969 struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700970 next = tmp->next;
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100971
972 spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700973 /* Have we found a mount point ? */
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100974 if (d_mountpoint(dentry)) {
975 spin_unlock(&dentry->d_lock);
976 spin_unlock(&this_parent->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700977 goto positive;
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100978 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700979 if (!list_empty(&dentry->d_subdirs)) {
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100980 spin_unlock(&this_parent->d_lock);
981 spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700982 this_parent = dentry;
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100983 spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700984 goto repeat;
985 }
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100986 spin_unlock(&dentry->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700987 }
988 /*
989 * All done at this level ... ascend and resume the search.
990 */
991 if (this_parent != parent) {
Nick Piggin949854d2011-01-07 17:49:37 +1100992 struct dentry *tmp;
993 struct dentry *child;
994
995 tmp = this_parent->d_parent;
996 rcu_read_lock();
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100997 spin_unlock(&this_parent->d_lock);
Nick Piggin949854d2011-01-07 17:49:37 +1100998 child = this_parent;
999 this_parent = tmp;
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001000 spin_lock(&this_parent->d_lock);
Nick Piggin949854d2011-01-07 17:49:37 +11001001 /* might go back up the wrong parent if we have had a rename
1002 * or deletion */
1003 if (this_parent != child->d_parent ||
Nick Piggin58db63d2011-01-07 17:49:39 +11001004 (!locked && read_seqretry(&rename_lock, seq))) {
Nick Piggin949854d2011-01-07 17:49:37 +11001005 spin_unlock(&this_parent->d_lock);
Nick Piggin949854d2011-01-07 17:49:37 +11001006 rcu_read_unlock();
1007 goto rename_retry;
1008 }
1009 rcu_read_unlock();
1010 next = child->d_u.d_child.next;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001011 goto resume;
1012 }
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001013 spin_unlock(&this_parent->d_lock);
Nick Piggin58db63d2011-01-07 17:49:39 +11001014 if (!locked && read_seqretry(&rename_lock, seq))
Nick Piggin949854d2011-01-07 17:49:37 +11001015 goto rename_retry;
Nick Piggin58db63d2011-01-07 17:49:39 +11001016 if (locked)
1017 write_sequnlock(&rename_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001018 return 0; /* No mount points found in tree */
1019positive:
Nick Piggin58db63d2011-01-07 17:49:39 +11001020 if (!locked && read_seqretry(&rename_lock, seq))
Nick Piggin949854d2011-01-07 17:49:37 +11001021 goto rename_retry;
Nick Piggin58db63d2011-01-07 17:49:39 +11001022 if (locked)
1023 write_sequnlock(&rename_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001024 return 1;
Nick Piggin58db63d2011-01-07 17:49:39 +11001025
1026rename_retry:
1027 locked = 1;
1028 write_seqlock(&rename_lock);
1029 goto again;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001030}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -07001031EXPORT_SYMBOL(have_submounts);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001032
1033/*
1034 * Search the dentry child list for the specified parent,
1035 * and move any unused dentries to the end of the unused
1036 * list for prune_dcache(). We descend to the next level
1037 * whenever the d_subdirs list is non-empty and continue
1038 * searching.
1039 *
1040 * It returns zero iff there are no unused children,
1041 * otherwise it returns the number of children moved to
1042 * the end of the unused list. This may not be the total
1043 * number of unused children, because select_parent can
1044 * drop the lock and return early due to latency
1045 * constraints.
1046 */
1047static int select_parent(struct dentry * parent)
1048{
Nick Piggin949854d2011-01-07 17:49:37 +11001049 struct dentry *this_parent;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001050 struct list_head *next;
Nick Piggin949854d2011-01-07 17:49:37 +11001051 unsigned seq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001052 int found = 0;
Nick Piggin58db63d2011-01-07 17:49:39 +11001053 int locked = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001054
Nick Piggin949854d2011-01-07 17:49:37 +11001055 seq = read_seqbegin(&rename_lock);
Nick Piggin58db63d2011-01-07 17:49:39 +11001056again:
1057 this_parent = parent;
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001058 spin_lock(&this_parent->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001059repeat:
1060 next = this_parent->d_subdirs.next;
1061resume:
1062 while (next != &this_parent->d_subdirs) {
1063 struct list_head *tmp = next;
Eric Dumazet5160ee62006-01-08 01:03:32 -08001064 struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001065 next = tmp->next;
1066
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001067 spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
Nick Piggin23044502011-01-07 17:49:31 +11001068
Linus Torvalds1da177e2005-04-16 15:20:36 -07001069 /*
1070 * move only zero ref count dentries to the end
1071 * of the unused list for prune_dcache
1072 */
Nick Pigginb7ab39f2011-01-07 17:49:32 +11001073 if (!dentry->d_count) {
Christoph Hellwiga4633352010-10-10 05:36:26 -04001074 dentry_lru_move_tail(dentry);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001075 found++;
Christoph Hellwiga4633352010-10-10 05:36:26 -04001076 } else {
1077 dentry_lru_del(dentry);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078 }
1079
1080 /*
1081 * We can return to the caller if we have found some (this
1082 * ensures forward progress). We'll be coming back to find
1083 * the rest.
1084 */
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001085 if (found && need_resched()) {
1086 spin_unlock(&dentry->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001087 goto out;
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001088 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001089
1090 /*
1091 * Descend a level if the d_subdirs list is non-empty.
1092 */
1093 if (!list_empty(&dentry->d_subdirs)) {
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001094 spin_unlock(&this_parent->d_lock);
1095 spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001096 this_parent = dentry;
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001097 spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001098 goto repeat;
1099 }
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001100
1101 spin_unlock(&dentry->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001102 }
1103 /*
1104 * All done at this level ... ascend and resume the search.
1105 */
1106 if (this_parent != parent) {
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001107 struct dentry *tmp;
Nick Piggin949854d2011-01-07 17:49:37 +11001108 struct dentry *child;
1109
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001110 tmp = this_parent->d_parent;
Nick Piggin949854d2011-01-07 17:49:37 +11001111 rcu_read_lock();
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001112 spin_unlock(&this_parent->d_lock);
Nick Piggin949854d2011-01-07 17:49:37 +11001113 child = this_parent;
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001114 this_parent = tmp;
1115 spin_lock(&this_parent->d_lock);
Nick Piggin949854d2011-01-07 17:49:37 +11001116 /* might go back up the wrong parent if we have had a rename
1117 * or deletion */
1118 if (this_parent != child->d_parent ||
Nick Piggin58db63d2011-01-07 17:49:39 +11001119 (!locked && read_seqretry(&rename_lock, seq))) {
Nick Piggin949854d2011-01-07 17:49:37 +11001120 spin_unlock(&this_parent->d_lock);
Nick Piggin949854d2011-01-07 17:49:37 +11001121 rcu_read_unlock();
1122 goto rename_retry;
1123 }
1124 rcu_read_unlock();
1125 next = child->d_u.d_child.next;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001126 goto resume;
1127 }
1128out:
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001129 spin_unlock(&this_parent->d_lock);
Nick Piggin58db63d2011-01-07 17:49:39 +11001130 if (!locked && read_seqretry(&rename_lock, seq))
Nick Piggin949854d2011-01-07 17:49:37 +11001131 goto rename_retry;
Nick Piggin58db63d2011-01-07 17:49:39 +11001132 if (locked)
1133 write_sequnlock(&rename_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001134 return found;
Nick Piggin58db63d2011-01-07 17:49:39 +11001135
1136rename_retry:
1137 if (found)
1138 return found;
1139 locked = 1;
1140 write_seqlock(&rename_lock);
1141 goto again;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001142}
1143
1144/**
1145 * shrink_dcache_parent - prune dcache
1146 * @parent: parent of entries to prune
1147 *
1148 * Prune the dcache to remove unused children of the parent dentry.
1149 */
1150
1151void shrink_dcache_parent(struct dentry * parent)
1152{
Kentaro Makitada3bbdd2008-07-23 21:27:13 -07001153 struct super_block *sb = parent->d_sb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154 int found;
1155
1156 while ((found = select_parent(parent)) != 0)
Kentaro Makitada3bbdd2008-07-23 21:27:13 -07001157 __shrink_dcache_sb(sb, &found, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001158}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -07001159EXPORT_SYMBOL(shrink_dcache_parent);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160
Linus Torvalds1da177e2005-04-16 15:20:36 -07001161/*
1162 * Scan `nr' dentries and return the number which remain.
1163 *
1164 * We need to avoid reentering the filesystem if the caller is performing a
1165 * GFP_NOFS allocation attempt. One example deadlock is:
1166 *
1167 * ext2_new_block->getblk->GFP->shrink_dcache_memory->prune_dcache->
1168 * prune_one_dentry->dput->dentry_iput->iput->inode->i_sb->s_op->put_inode->
1169 * ext2_discard_prealloc->ext2_free_blocks->lock_super->DEADLOCK.
1170 *
1171 * In this case we return -1 to tell the caller that we baled.
1172 */
Dave Chinner7f8275d2010-07-19 14:56:17 +10001173static int shrink_dcache_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174{
1175 if (nr) {
1176 if (!(gfp_mask & __GFP_FS))
1177 return -1;
Kentaro Makitada3bbdd2008-07-23 21:27:13 -07001178 prune_dcache(nr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001179 }
Christoph Hellwig312d3ca2010-10-10 05:36:23 -04001180
Nick Piggin86c87492011-01-07 17:49:18 +11001181 return (dentry_stat.nr_unused / 100) * sysctl_vfs_cache_pressure;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001182}
1183
Rusty Russell8e1f9362007-07-17 04:03:17 -07001184static struct shrinker dcache_shrinker = {
1185 .shrink = shrink_dcache_memory,
1186 .seeks = DEFAULT_SEEKS,
1187};
1188
Linus Torvalds1da177e2005-04-16 15:20:36 -07001189/**
1190 * d_alloc - allocate a dcache entry
1191 * @parent: parent of entry to allocate
1192 * @name: qstr of the name
1193 *
1194 * Allocates a dentry. It returns %NULL if there is insufficient memory
1195 * available. On a success the dentry is returned. The name passed in is
1196 * copied and the copy passed in may be reused after this call.
1197 */
1198
1199struct dentry *d_alloc(struct dentry * parent, const struct qstr *name)
1200{
1201 struct dentry *dentry;
1202 char *dname;
1203
Mel Gormane12ba742007-10-16 01:25:52 -07001204 dentry = kmem_cache_alloc(dentry_cache, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001205 if (!dentry)
1206 return NULL;
1207
1208 if (name->len > DNAME_INLINE_LEN-1) {
1209 dname = kmalloc(name->len + 1, GFP_KERNEL);
1210 if (!dname) {
1211 kmem_cache_free(dentry_cache, dentry);
1212 return NULL;
1213 }
1214 } else {
1215 dname = dentry->d_iname;
1216 }
1217 dentry->d_name.name = dname;
1218
1219 dentry->d_name.len = name->len;
1220 dentry->d_name.hash = name->hash;
1221 memcpy(dname, name->name, name->len);
1222 dname[name->len] = 0;
1223
Nick Pigginb7ab39f2011-01-07 17:49:32 +11001224 dentry->d_count = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001225 dentry->d_flags = DCACHE_UNHASHED;
1226 spin_lock_init(&dentry->d_lock);
1227 dentry->d_inode = NULL;
1228 dentry->d_parent = NULL;
1229 dentry->d_sb = NULL;
1230 dentry->d_op = NULL;
1231 dentry->d_fsdata = NULL;
1232 dentry->d_mounted = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001233 INIT_HLIST_NODE(&dentry->d_hash);
1234 INIT_LIST_HEAD(&dentry->d_lru);
1235 INIT_LIST_HEAD(&dentry->d_subdirs);
1236 INIT_LIST_HEAD(&dentry->d_alias);
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001237 INIT_LIST_HEAD(&dentry->d_u.d_child);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001238
1239 if (parent) {
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001240 spin_lock(&parent->d_lock);
Nick Piggin89ad4852011-01-07 17:49:41 +11001241 /*
1242 * don't need child lock because it is not subject
1243 * to concurrency here
1244 */
Nick Piggindc0474b2011-01-07 17:49:43 +11001245 __dget_dlock(parent);
1246 dentry->d_parent = parent;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001247 dentry->d_sb = parent->d_sb;
Eric Dumazet5160ee62006-01-08 01:03:32 -08001248 list_add(&dentry->d_u.d_child, &parent->d_subdirs);
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001249 spin_unlock(&parent->d_lock);
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001250 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001251
Nick Piggin3e880fb2011-01-07 17:49:19 +11001252 this_cpu_inc(nr_dentry);
Christoph Hellwig312d3ca2010-10-10 05:36:23 -04001253
Linus Torvalds1da177e2005-04-16 15:20:36 -07001254 return dentry;
1255}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -07001256EXPORT_SYMBOL(d_alloc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001257
1258struct dentry *d_alloc_name(struct dentry *parent, const char *name)
1259{
1260 struct qstr q;
1261
1262 q.name = name;
1263 q.len = strlen(name);
1264 q.hash = full_name_hash(q.name, q.len);
1265 return d_alloc(parent, &q);
1266}
H Hartley Sweetenef26ca92009-09-29 20:09:42 -04001267EXPORT_SYMBOL(d_alloc_name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001268
OGAWA Hirofumi360da902008-10-16 07:50:28 +09001269static void __d_instantiate(struct dentry *dentry, struct inode *inode)
1270{
Nick Pigginb23fb0a2011-01-07 17:49:35 +11001271 spin_lock(&dentry->d_lock);
OGAWA Hirofumi360da902008-10-16 07:50:28 +09001272 if (inode)
1273 list_add(&dentry->d_alias, &inode->i_dentry);
1274 dentry->d_inode = inode;
Nick Pigginb23fb0a2011-01-07 17:49:35 +11001275 spin_unlock(&dentry->d_lock);
OGAWA Hirofumi360da902008-10-16 07:50:28 +09001276 fsnotify_d_instantiate(dentry, inode);
1277}
1278
Linus Torvalds1da177e2005-04-16 15:20:36 -07001279/**
1280 * d_instantiate - fill in inode information for a dentry
1281 * @entry: dentry to complete
1282 * @inode: inode to attach to this dentry
1283 *
1284 * Fill in inode information in the entry.
1285 *
1286 * This turns negative dentries into productive full members
1287 * of society.
1288 *
1289 * NOTE! This assumes that the inode count has been incremented
1290 * (or otherwise set) by the caller to indicate that it is now
1291 * in use by the dcache.
1292 */
1293
1294void d_instantiate(struct dentry *entry, struct inode * inode)
1295{
Eric Sesterhenn28133c72006-03-26 18:25:39 +02001296 BUG_ON(!list_empty(&entry->d_alias));
Nick Pigginb23fb0a2011-01-07 17:49:35 +11001297 spin_lock(&dcache_inode_lock);
OGAWA Hirofumi360da902008-10-16 07:50:28 +09001298 __d_instantiate(entry, inode);
Nick Pigginb23fb0a2011-01-07 17:49:35 +11001299 spin_unlock(&dcache_inode_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001300 security_d_instantiate(entry, inode);
1301}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -07001302EXPORT_SYMBOL(d_instantiate);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001303
1304/**
1305 * d_instantiate_unique - instantiate a non-aliased dentry
1306 * @entry: dentry to instantiate
1307 * @inode: inode to attach to this dentry
1308 *
1309 * Fill in inode information in the entry. On success, it returns NULL.
1310 * If an unhashed alias of "entry" already exists, then we return the
Oleg Drokine866cfa2006-01-09 20:52:51 -08001311 * aliased dentry instead and drop one reference to inode.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001312 *
1313 * Note that in order to avoid conflicts with rename() etc, the caller
1314 * had better be holding the parent directory semaphore.
Oleg Drokine866cfa2006-01-09 20:52:51 -08001315 *
1316 * This also assumes that the inode count has been incremented
1317 * (or otherwise set) by the caller to indicate that it is now
1318 * in use by the dcache.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001319 */
David Howells770bfad2006-08-22 20:06:07 -04001320static struct dentry *__d_instantiate_unique(struct dentry *entry,
1321 struct inode *inode)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001322{
1323 struct dentry *alias;
1324 int len = entry->d_name.len;
1325 const char *name = entry->d_name.name;
1326 unsigned int hash = entry->d_name.hash;
1327
David Howells770bfad2006-08-22 20:06:07 -04001328 if (!inode) {
OGAWA Hirofumi360da902008-10-16 07:50:28 +09001329 __d_instantiate(entry, NULL);
David Howells770bfad2006-08-22 20:06:07 -04001330 return NULL;
1331 }
1332
Linus Torvalds1da177e2005-04-16 15:20:36 -07001333 list_for_each_entry(alias, &inode->i_dentry, d_alias) {
1334 struct qstr *qstr = &alias->d_name;
1335
Nick Piggin9abca362011-01-07 17:49:36 +11001336 /*
1337 * Don't need alias->d_lock here, because aliases with
1338 * d_parent == entry->d_parent are not subject to name or
1339 * parent changes, because the parent inode i_mutex is held.
1340 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001341 if (qstr->hash != hash)
1342 continue;
1343 if (alias->d_parent != entry->d_parent)
1344 continue;
1345 if (qstr->len != len)
1346 continue;
1347 if (memcmp(qstr->name, name, len))
1348 continue;
Nick Piggindc0474b2011-01-07 17:49:43 +11001349 __dget(alias);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001350 return alias;
1351 }
David Howells770bfad2006-08-22 20:06:07 -04001352
OGAWA Hirofumi360da902008-10-16 07:50:28 +09001353 __d_instantiate(entry, inode);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001354 return NULL;
1355}
David Howells770bfad2006-08-22 20:06:07 -04001356
1357struct dentry *d_instantiate_unique(struct dentry *entry, struct inode *inode)
1358{
1359 struct dentry *result;
1360
1361 BUG_ON(!list_empty(&entry->d_alias));
1362
Nick Pigginb23fb0a2011-01-07 17:49:35 +11001363 spin_lock(&dcache_inode_lock);
David Howells770bfad2006-08-22 20:06:07 -04001364 result = __d_instantiate_unique(entry, inode);
Nick Pigginb23fb0a2011-01-07 17:49:35 +11001365 spin_unlock(&dcache_inode_lock);
David Howells770bfad2006-08-22 20:06:07 -04001366
1367 if (!result) {
1368 security_d_instantiate(entry, inode);
1369 return NULL;
1370 }
1371
1372 BUG_ON(!d_unhashed(result));
1373 iput(inode);
1374 return result;
1375}
1376
Linus Torvalds1da177e2005-04-16 15:20:36 -07001377EXPORT_SYMBOL(d_instantiate_unique);
1378
1379/**
1380 * d_alloc_root - allocate root dentry
1381 * @root_inode: inode to allocate the root for
1382 *
1383 * Allocate a root ("/") dentry for the inode given. The inode is
1384 * instantiated and returned. %NULL is returned if there is insufficient
1385 * memory or the inode passed is %NULL.
1386 */
1387
1388struct dentry * d_alloc_root(struct inode * root_inode)
1389{
1390 struct dentry *res = NULL;
1391
1392 if (root_inode) {
1393 static const struct qstr name = { .name = "/", .len = 1 };
1394
1395 res = d_alloc(NULL, &name);
1396 if (res) {
1397 res->d_sb = root_inode->i_sb;
1398 res->d_parent = res;
1399 d_instantiate(res, root_inode);
1400 }
1401 }
1402 return res;
1403}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -07001404EXPORT_SYMBOL(d_alloc_root);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001405
1406static inline struct hlist_head *d_hash(struct dentry *parent,
1407 unsigned long hash)
1408{
1409 hash += ((unsigned long) parent ^ GOLDEN_RATIO_PRIME) / L1_CACHE_BYTES;
1410 hash = hash ^ ((hash ^ GOLDEN_RATIO_PRIME) >> D_HASHBITS);
1411 return dentry_hashtable + (hash & D_HASHMASK);
1412}
1413
1414/**
Christoph Hellwig4ea3ada2008-08-11 15:48:57 +02001415 * d_obtain_alias - find or allocate a dentry for a given inode
1416 * @inode: inode to allocate the dentry for
1417 *
1418 * Obtain a dentry for an inode resulting from NFS filehandle conversion or
1419 * similar open by handle operations. The returned dentry may be anonymous,
1420 * or may have a full name (if the inode was already in the cache).
1421 *
1422 * When called on a directory inode, we must ensure that the inode only ever
1423 * has one dentry. If a dentry is found, that is returned instead of
1424 * allocating a new one.
1425 *
1426 * On successful return, the reference to the inode has been transferred
Christoph Hellwig44003722008-08-11 15:49:04 +02001427 * to the dentry. In case of an error the reference on the inode is released.
1428 * To make it easier to use in export operations a %NULL or IS_ERR inode may
1429 * be passed in and will be the error will be propagate to the return value,
1430 * with a %NULL @inode replaced by ERR_PTR(-ESTALE).
Christoph Hellwig4ea3ada2008-08-11 15:48:57 +02001431 */
1432struct dentry *d_obtain_alias(struct inode *inode)
1433{
Christoph Hellwig9308a612008-08-11 15:49:12 +02001434 static const struct qstr anonstring = { .name = "" };
1435 struct dentry *tmp;
1436 struct dentry *res;
Christoph Hellwig4ea3ada2008-08-11 15:48:57 +02001437
1438 if (!inode)
Christoph Hellwig44003722008-08-11 15:49:04 +02001439 return ERR_PTR(-ESTALE);
Christoph Hellwig4ea3ada2008-08-11 15:48:57 +02001440 if (IS_ERR(inode))
1441 return ERR_CAST(inode);
1442
Christoph Hellwig9308a612008-08-11 15:49:12 +02001443 res = d_find_alias(inode);
1444 if (res)
1445 goto out_iput;
1446
1447 tmp = d_alloc(NULL, &anonstring);
1448 if (!tmp) {
1449 res = ERR_PTR(-ENOMEM);
1450 goto out_iput;
Christoph Hellwig4ea3ada2008-08-11 15:48:57 +02001451 }
Christoph Hellwig9308a612008-08-11 15:49:12 +02001452 tmp->d_parent = tmp; /* make sure dput doesn't croak */
1453
Nick Pigginb5c84bf2011-01-07 17:49:38 +11001454
Nick Pigginb23fb0a2011-01-07 17:49:35 +11001455 spin_lock(&dcache_inode_lock);
Christoph Hellwig9308a612008-08-11 15:49:12 +02001456 res = __d_find_alias(inode, 0);
1457 if (res) {
Nick Pigginb23fb0a2011-01-07 17:49:35 +11001458 spin_unlock(&dcache_inode_lock);
Christoph Hellwig9308a612008-08-11 15:49:12 +02001459 dput(tmp);
1460 goto out_iput;
1461 }
1462
1463 /* attach a disconnected dentry */
1464 spin_lock(&tmp->d_lock);
1465 tmp->d_sb = inode->i_sb;
1466 tmp->d_inode = inode;
1467 tmp->d_flags |= DCACHE_DISCONNECTED;
1468 tmp->d_flags &= ~DCACHE_UNHASHED;
1469 list_add(&tmp->d_alias, &inode->i_dentry);
Nick Piggin789680d2011-01-07 17:49:30 +11001470 spin_lock(&dcache_hash_lock);
Christoph Hellwig9308a612008-08-11 15:49:12 +02001471 hlist_add_head(&tmp->d_hash, &inode->i_sb->s_anon);
Nick Piggin789680d2011-01-07 17:49:30 +11001472 spin_unlock(&dcache_hash_lock);
Christoph Hellwig9308a612008-08-11 15:49:12 +02001473 spin_unlock(&tmp->d_lock);
Nick Pigginb23fb0a2011-01-07 17:49:35 +11001474 spin_unlock(&dcache_inode_lock);
Christoph Hellwig9308a612008-08-11 15:49:12 +02001475
Christoph Hellwig9308a612008-08-11 15:49:12 +02001476 return tmp;
1477
1478 out_iput:
1479 iput(inode);
1480 return res;
Christoph Hellwig4ea3ada2008-08-11 15:48:57 +02001481}
Benny Halevyadc48722009-02-27 14:02:59 -08001482EXPORT_SYMBOL(d_obtain_alias);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001483
1484/**
1485 * d_splice_alias - splice a disconnected dentry into the tree if one exists
1486 * @inode: the inode which may have a disconnected dentry
1487 * @dentry: a negative dentry which we want to point to the inode.
1488 *
1489 * If inode is a directory and has a 'disconnected' dentry (i.e. IS_ROOT and
1490 * DCACHE_DISCONNECTED), then d_move that in place of the given dentry
1491 * and return it, else simply d_add the inode to the dentry and return NULL.
1492 *
1493 * This is needed in the lookup routine of any filesystem that is exportable
1494 * (via knfsd) so that we can build dcache paths to directories effectively.
1495 *
1496 * If a dentry was found and moved, then it is returned. Otherwise NULL
1497 * is returned. This matches the expected return value of ->lookup.
1498 *
1499 */
1500struct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry)
1501{
1502 struct dentry *new = NULL;
1503
NeilBrown21c0d8f2006-10-04 02:16:16 -07001504 if (inode && S_ISDIR(inode->i_mode)) {
Nick Pigginb23fb0a2011-01-07 17:49:35 +11001505 spin_lock(&dcache_inode_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001506 new = __d_find_alias(inode, 1);
1507 if (new) {
1508 BUG_ON(!(new->d_flags & DCACHE_DISCONNECTED));
Nick Pigginb23fb0a2011-01-07 17:49:35 +11001509 spin_unlock(&dcache_inode_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001510 security_d_instantiate(new, inode);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001511 d_move(new, dentry);
1512 iput(inode);
1513 } else {
Nick Pigginb5c84bf2011-01-07 17:49:38 +11001514 /* already taking dcache_inode_lock, so d_add() by hand */
OGAWA Hirofumi360da902008-10-16 07:50:28 +09001515 __d_instantiate(dentry, inode);
Nick Pigginb23fb0a2011-01-07 17:49:35 +11001516 spin_unlock(&dcache_inode_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001517 security_d_instantiate(dentry, inode);
1518 d_rehash(dentry);
1519 }
1520 } else
1521 d_add(dentry, inode);
1522 return new;
1523}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -07001524EXPORT_SYMBOL(d_splice_alias);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001525
Barry Naujok94035402008-05-21 16:50:46 +10001526/**
1527 * d_add_ci - lookup or allocate new dentry with case-exact name
1528 * @inode: the inode case-insensitive lookup has found
1529 * @dentry: the negative dentry that was passed to the parent's lookup func
1530 * @name: the case-exact name to be associated with the returned dentry
1531 *
1532 * This is to avoid filling the dcache with case-insensitive names to the
1533 * same inode, only the actual correct case is stored in the dcache for
1534 * case-insensitive filesystems.
1535 *
1536 * For a case-insensitive lookup match and if the the case-exact dentry
1537 * already exists in in the dcache, use it and return it.
1538 *
1539 * If no entry exists with the exact case name, allocate new dentry with
1540 * the exact case, and return the spliced entry.
1541 */
Christoph Hellwige45b5902008-08-07 23:49:07 +02001542struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode,
Barry Naujok94035402008-05-21 16:50:46 +10001543 struct qstr *name)
1544{
1545 int error;
1546 struct dentry *found;
1547 struct dentry *new;
1548
Christoph Hellwigb6520c82009-01-05 19:10:37 +01001549 /*
1550 * First check if a dentry matching the name already exists,
1551 * if not go ahead and create it now.
1552 */
Barry Naujok94035402008-05-21 16:50:46 +10001553 found = d_hash_and_lookup(dentry->d_parent, name);
Barry Naujok94035402008-05-21 16:50:46 +10001554 if (!found) {
1555 new = d_alloc(dentry->d_parent, name);
1556 if (!new) {
1557 error = -ENOMEM;
1558 goto err_out;
1559 }
Christoph Hellwigb6520c82009-01-05 19:10:37 +01001560
Barry Naujok94035402008-05-21 16:50:46 +10001561 found = d_splice_alias(inode, new);
1562 if (found) {
1563 dput(new);
1564 return found;
1565 }
1566 return new;
1567 }
Christoph Hellwigb6520c82009-01-05 19:10:37 +01001568
1569 /*
1570 * If a matching dentry exists, and it's not negative use it.
1571 *
1572 * Decrement the reference count to balance the iget() done
1573 * earlier on.
1574 */
Barry Naujok94035402008-05-21 16:50:46 +10001575 if (found->d_inode) {
1576 if (unlikely(found->d_inode != inode)) {
1577 /* This can't happen because bad inodes are unhashed. */
1578 BUG_ON(!is_bad_inode(inode));
1579 BUG_ON(!is_bad_inode(found->d_inode));
1580 }
Barry Naujok94035402008-05-21 16:50:46 +10001581 iput(inode);
1582 return found;
1583 }
Christoph Hellwigb6520c82009-01-05 19:10:37 +01001584
Barry Naujok94035402008-05-21 16:50:46 +10001585 /*
1586 * Negative dentry: instantiate it unless the inode is a directory and
Christoph Hellwigb6520c82009-01-05 19:10:37 +01001587 * already has a dentry.
Barry Naujok94035402008-05-21 16:50:46 +10001588 */
Nick Pigginb23fb0a2011-01-07 17:49:35 +11001589 spin_lock(&dcache_inode_lock);
Christoph Hellwigb6520c82009-01-05 19:10:37 +01001590 if (!S_ISDIR(inode->i_mode) || list_empty(&inode->i_dentry)) {
OGAWA Hirofumi360da902008-10-16 07:50:28 +09001591 __d_instantiate(found, inode);
Nick Pigginb23fb0a2011-01-07 17:49:35 +11001592 spin_unlock(&dcache_inode_lock);
Barry Naujok94035402008-05-21 16:50:46 +10001593 security_d_instantiate(found, inode);
1594 return found;
1595 }
Christoph Hellwigb6520c82009-01-05 19:10:37 +01001596
Barry Naujok94035402008-05-21 16:50:46 +10001597 /*
Christoph Hellwigb6520c82009-01-05 19:10:37 +01001598 * In case a directory already has a (disconnected) entry grab a
1599 * reference to it, move it in place and use it.
Barry Naujok94035402008-05-21 16:50:46 +10001600 */
1601 new = list_entry(inode->i_dentry.next, struct dentry, d_alias);
Nick Piggindc0474b2011-01-07 17:49:43 +11001602 __dget(new);
Nick Pigginb23fb0a2011-01-07 17:49:35 +11001603 spin_unlock(&dcache_inode_lock);
Barry Naujok94035402008-05-21 16:50:46 +10001604 security_d_instantiate(found, inode);
Barry Naujok94035402008-05-21 16:50:46 +10001605 d_move(new, found);
Barry Naujok94035402008-05-21 16:50:46 +10001606 iput(inode);
Barry Naujok94035402008-05-21 16:50:46 +10001607 dput(found);
Barry Naujok94035402008-05-21 16:50:46 +10001608 return new;
1609
1610err_out:
1611 iput(inode);
1612 return ERR_PTR(error);
1613}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -07001614EXPORT_SYMBOL(d_add_ci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001615
1616/**
1617 * d_lookup - search for a dentry
1618 * @parent: parent dentry
1619 * @name: qstr of name we wish to find
Nick Pigginb04f7842010-08-18 04:37:34 +10001620 * Returns: dentry, or NULL
Linus Torvalds1da177e2005-04-16 15:20:36 -07001621 *
Nick Pigginb04f7842010-08-18 04:37:34 +10001622 * d_lookup searches the children of the parent dentry for the name in
1623 * question. If the dentry is found its reference count is incremented and the
1624 * dentry is returned. The caller must use dput to free the entry when it has
1625 * finished using it. %NULL is returned if the dentry does not exist.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001626 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001627struct dentry * d_lookup(struct dentry * parent, struct qstr * name)
1628{
1629 struct dentry * dentry = NULL;
Nick Piggin949854d2011-01-07 17:49:37 +11001630 unsigned seq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001631
1632 do {
1633 seq = read_seqbegin(&rename_lock);
1634 dentry = __d_lookup(parent, name);
1635 if (dentry)
1636 break;
1637 } while (read_seqretry(&rename_lock, seq));
1638 return dentry;
1639}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -07001640EXPORT_SYMBOL(d_lookup);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001641
Nick Pigginb04f7842010-08-18 04:37:34 +10001642/*
1643 * __d_lookup - search for a dentry (racy)
1644 * @parent: parent dentry
1645 * @name: qstr of name we wish to find
1646 * Returns: dentry, or NULL
1647 *
1648 * __d_lookup is like d_lookup, however it may (rarely) return a
1649 * false-negative result due to unrelated rename activity.
1650 *
1651 * __d_lookup is slightly faster by avoiding rename_lock read seqlock,
1652 * however it must be used carefully, eg. with a following d_lookup in
1653 * the case of failure.
1654 *
1655 * __d_lookup callers must be commented.
1656 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001657struct dentry * __d_lookup(struct dentry * parent, struct qstr * name)
1658{
1659 unsigned int len = name->len;
1660 unsigned int hash = name->hash;
1661 const unsigned char *str = name->name;
1662 struct hlist_head *head = d_hash(parent,hash);
1663 struct dentry *found = NULL;
1664 struct hlist_node *node;
Paul E. McKenney665a7582005-11-07 00:59:17 -08001665 struct dentry *dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001666
Nick Pigginb04f7842010-08-18 04:37:34 +10001667 /*
1668 * The hash list is protected using RCU.
1669 *
1670 * Take d_lock when comparing a candidate dentry, to avoid races
1671 * with d_move().
1672 *
1673 * It is possible that concurrent renames can mess up our list
1674 * walk here and result in missing our dentry, resulting in the
1675 * false-negative result. d_lookup() protects against concurrent
1676 * renames using rename_lock seqlock.
1677 *
1678 * See Documentation/vfs/dcache-locking.txt for more details.
1679 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001680 rcu_read_lock();
1681
Paul E. McKenney665a7582005-11-07 00:59:17 -08001682 hlist_for_each_entry_rcu(dentry, node, head, d_hash) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001683 struct qstr *qstr;
1684
Linus Torvalds1da177e2005-04-16 15:20:36 -07001685 if (dentry->d_name.hash != hash)
1686 continue;
1687 if (dentry->d_parent != parent)
1688 continue;
1689
1690 spin_lock(&dentry->d_lock);
1691
1692 /*
1693 * Recheck the dentry after taking the lock - d_move may have
Nick Pigginb04f7842010-08-18 04:37:34 +10001694 * changed things. Don't bother checking the hash because
1695 * we're about to compare the whole name anyway.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001696 */
1697 if (dentry->d_parent != parent)
1698 goto next;
1699
Linus Torvaldsd0185c02008-09-29 07:42:57 -07001700 /* non-existing due to RCU? */
1701 if (d_unhashed(dentry))
1702 goto next;
1703
Linus Torvalds1da177e2005-04-16 15:20:36 -07001704 /*
1705 * It is safe to compare names since d_move() cannot
1706 * change the qstr (protected by d_lock).
1707 */
1708 qstr = &dentry->d_name;
1709 if (parent->d_op && parent->d_op->d_compare) {
Nick Piggin621e1552011-01-07 17:49:27 +11001710 if (parent->d_op->d_compare(parent, parent->d_inode,
1711 dentry, dentry->d_inode,
1712 qstr->len, qstr->name, name))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001713 goto next;
1714 } else {
1715 if (qstr->len != len)
1716 goto next;
1717 if (memcmp(qstr->name, str, len))
1718 goto next;
1719 }
1720
Nick Pigginb7ab39f2011-01-07 17:49:32 +11001721 dentry->d_count++;
Linus Torvaldsd0185c02008-09-29 07:42:57 -07001722 found = dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001723 spin_unlock(&dentry->d_lock);
1724 break;
1725next:
1726 spin_unlock(&dentry->d_lock);
1727 }
1728 rcu_read_unlock();
1729
1730 return found;
1731}
1732
1733/**
Eric W. Biederman3e7e2412006-03-31 02:31:43 -08001734 * d_hash_and_lookup - hash the qstr then search for a dentry
1735 * @dir: Directory to search in
1736 * @name: qstr of name we wish to find
1737 *
1738 * On hash failure or on lookup failure NULL is returned.
1739 */
1740struct dentry *d_hash_and_lookup(struct dentry *dir, struct qstr *name)
1741{
1742 struct dentry *dentry = NULL;
1743
1744 /*
1745 * Check for a fs-specific hash function. Note that we must
1746 * calculate the standard hash first, as the d_op->d_hash()
1747 * routine may choose to leave the hash value unchanged.
1748 */
1749 name->hash = full_name_hash(name->name, name->len);
1750 if (dir->d_op && dir->d_op->d_hash) {
Nick Pigginb1e6a012011-01-07 17:49:28 +11001751 if (dir->d_op->d_hash(dir, dir->d_inode, name) < 0)
Eric W. Biederman3e7e2412006-03-31 02:31:43 -08001752 goto out;
1753 }
1754 dentry = d_lookup(dir, name);
1755out:
1756 return dentry;
1757}
1758
1759/**
Nick Piggin786a5e12011-01-07 17:49:16 +11001760 * d_validate - verify dentry provided from insecure source (deprecated)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001761 * @dentry: The dentry alleged to be valid child of @dparent
1762 * @dparent: The parent dentry (known to be valid)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001763 *
1764 * An insecure source has sent us a dentry, here we verify it and dget() it.
1765 * This is used by ncpfs in its readdir implementation.
1766 * Zero is returned in the dentry is invalid.
Nick Piggin786a5e12011-01-07 17:49:16 +11001767 *
1768 * This function is slow for big directories, and deprecated, do not use it.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001769 */
Nick Piggind3a23e12011-01-05 20:01:21 +11001770int d_validate(struct dentry *dentry, struct dentry *dparent)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001771{
Nick Piggin786a5e12011-01-07 17:49:16 +11001772 struct dentry *child;
Nick Piggind3a23e12011-01-05 20:01:21 +11001773
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001774 spin_lock(&dparent->d_lock);
Nick Piggin786a5e12011-01-07 17:49:16 +11001775 list_for_each_entry(child, &dparent->d_subdirs, d_u.d_child) {
1776 if (dentry == child) {
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001777 spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
Nick Piggindc0474b2011-01-07 17:49:43 +11001778 __dget_dlock(dentry);
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001779 spin_unlock(&dentry->d_lock);
1780 spin_unlock(&dparent->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001781 return 1;
1782 }
1783 }
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001784 spin_unlock(&dparent->d_lock);
Nick Piggin786a5e12011-01-07 17:49:16 +11001785
Linus Torvalds1da177e2005-04-16 15:20:36 -07001786 return 0;
1787}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -07001788EXPORT_SYMBOL(d_validate);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001789
1790/*
1791 * When a file is deleted, we have two options:
1792 * - turn this dentry into a negative dentry
1793 * - unhash this dentry and free it.
1794 *
1795 * Usually, we want to just turn this into
1796 * a negative dentry, but if anybody else is
1797 * currently using the dentry or the inode
1798 * we can't do that and we fall back on removing
1799 * it from the hash queues and waiting for
1800 * it to be deleted later when it has no users
1801 */
1802
1803/**
1804 * d_delete - delete a dentry
1805 * @dentry: The dentry to delete
1806 *
1807 * Turn the dentry into a negative dentry if possible, otherwise
1808 * remove it from the hash queues so it can be deleted later
1809 */
1810
1811void d_delete(struct dentry * dentry)
1812{
John McCutchan7a91bf72005-08-08 13:52:16 -04001813 int isdir = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001814 /*
1815 * Are we the only user?
1816 */
Nick Piggin357f8e62011-01-07 17:49:42 +11001817again:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001818 spin_lock(&dentry->d_lock);
John McCutchan7a91bf72005-08-08 13:52:16 -04001819 isdir = S_ISDIR(dentry->d_inode->i_mode);
Nick Pigginb7ab39f2011-01-07 17:49:32 +11001820 if (dentry->d_count == 1) {
Nick Piggin357f8e62011-01-07 17:49:42 +11001821 if (!spin_trylock(&dcache_inode_lock)) {
1822 spin_unlock(&dentry->d_lock);
1823 cpu_relax();
1824 goto again;
1825 }
Al Viro13e3c5e2010-05-21 16:11:04 -04001826 dentry->d_flags &= ~DCACHE_CANT_MOUNT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001827 dentry_iput(dentry);
John McCutchan7a91bf72005-08-08 13:52:16 -04001828 fsnotify_nameremove(dentry, isdir);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001829 return;
1830 }
1831
1832 if (!d_unhashed(dentry))
1833 __d_drop(dentry);
1834
1835 spin_unlock(&dentry->d_lock);
John McCutchan7a91bf72005-08-08 13:52:16 -04001836
1837 fsnotify_nameremove(dentry, isdir);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001838}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -07001839EXPORT_SYMBOL(d_delete);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001840
1841static void __d_rehash(struct dentry * entry, struct hlist_head *list)
1842{
1843
1844 entry->d_flags &= ~DCACHE_UNHASHED;
1845 hlist_add_head_rcu(&entry->d_hash, list);
1846}
1847
David Howells770bfad2006-08-22 20:06:07 -04001848static void _d_rehash(struct dentry * entry)
1849{
1850 __d_rehash(entry, d_hash(entry->d_parent, entry->d_name.hash));
1851}
1852
Linus Torvalds1da177e2005-04-16 15:20:36 -07001853/**
1854 * d_rehash - add an entry back to the hash
1855 * @entry: dentry to add to the hash
1856 *
1857 * Adds a dentry to the hash according to its name.
1858 */
1859
1860void d_rehash(struct dentry * entry)
1861{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001862 spin_lock(&entry->d_lock);
Nick Piggin789680d2011-01-07 17:49:30 +11001863 spin_lock(&dcache_hash_lock);
David Howells770bfad2006-08-22 20:06:07 -04001864 _d_rehash(entry);
Nick Piggin789680d2011-01-07 17:49:30 +11001865 spin_unlock(&dcache_hash_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001866 spin_unlock(&entry->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001867}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -07001868EXPORT_SYMBOL(d_rehash);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001869
Nick Pigginfb2d5b82011-01-07 17:49:26 +11001870/**
1871 * dentry_update_name_case - update case insensitive dentry with a new name
1872 * @dentry: dentry to be updated
1873 * @name: new name
1874 *
1875 * Update a case insensitive dentry with new case of name.
1876 *
1877 * dentry must have been returned by d_lookup with name @name. Old and new
1878 * name lengths must match (ie. no d_compare which allows mismatched name
1879 * lengths).
1880 *
1881 * Parent inode i_mutex must be held over d_lookup and into this call (to
1882 * keep renames and concurrent inserts, and readdir(2) away).
1883 */
1884void dentry_update_name_case(struct dentry *dentry, struct qstr *name)
1885{
1886 BUG_ON(!mutex_is_locked(&dentry->d_inode->i_mutex));
1887 BUG_ON(dentry->d_name.len != name->len); /* d_lookup gives this */
1888
Nick Pigginfb2d5b82011-01-07 17:49:26 +11001889 spin_lock(&dentry->d_lock);
1890 memcpy((unsigned char *)dentry->d_name.name, name->name, name->len);
1891 spin_unlock(&dentry->d_lock);
Nick Pigginfb2d5b82011-01-07 17:49:26 +11001892}
1893EXPORT_SYMBOL(dentry_update_name_case);
1894
Linus Torvalds1da177e2005-04-16 15:20:36 -07001895static void switch_names(struct dentry *dentry, struct dentry *target)
1896{
1897 if (dname_external(target)) {
1898 if (dname_external(dentry)) {
1899 /*
1900 * Both external: swap the pointers
1901 */
Wu Fengguang9a8d5bb2009-01-07 18:09:14 -08001902 swap(target->d_name.name, dentry->d_name.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001903 } else {
1904 /*
1905 * dentry:internal, target:external. Steal target's
1906 * storage and make target internal.
1907 */
J. Bruce Fields321bcf92007-10-21 16:41:38 -07001908 memcpy(target->d_iname, dentry->d_name.name,
1909 dentry->d_name.len + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001910 dentry->d_name.name = target->d_name.name;
1911 target->d_name.name = target->d_iname;
1912 }
1913 } else {
1914 if (dname_external(dentry)) {
1915 /*
1916 * dentry:external, target:internal. Give dentry's
1917 * storage to target and make dentry internal
1918 */
1919 memcpy(dentry->d_iname, target->d_name.name,
1920 target->d_name.len + 1);
1921 target->d_name.name = dentry->d_name.name;
1922 dentry->d_name.name = dentry->d_iname;
1923 } else {
1924 /*
1925 * Both are internal. Just copy target to dentry
1926 */
1927 memcpy(dentry->d_iname, target->d_name.name,
1928 target->d_name.len + 1);
Al Virodc711ca2008-11-03 15:03:50 -05001929 dentry->d_name.len = target->d_name.len;
1930 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001931 }
1932 }
Wu Fengguang9a8d5bb2009-01-07 18:09:14 -08001933 swap(dentry->d_name.len, target->d_name.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001934}
1935
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001936static void dentry_lock_for_move(struct dentry *dentry, struct dentry *target)
1937{
1938 /*
1939 * XXXX: do we really need to take target->d_lock?
1940 */
1941 if (IS_ROOT(dentry) || dentry->d_parent == target->d_parent)
1942 spin_lock(&target->d_parent->d_lock);
1943 else {
1944 if (d_ancestor(dentry->d_parent, target->d_parent)) {
1945 spin_lock(&dentry->d_parent->d_lock);
1946 spin_lock_nested(&target->d_parent->d_lock,
1947 DENTRY_D_LOCK_NESTED);
1948 } else {
1949 spin_lock(&target->d_parent->d_lock);
1950 spin_lock_nested(&dentry->d_parent->d_lock,
1951 DENTRY_D_LOCK_NESTED);
1952 }
1953 }
1954 if (target < dentry) {
1955 spin_lock_nested(&target->d_lock, 2);
1956 spin_lock_nested(&dentry->d_lock, 3);
1957 } else {
1958 spin_lock_nested(&dentry->d_lock, 2);
1959 spin_lock_nested(&target->d_lock, 3);
1960 }
1961}
1962
1963static void dentry_unlock_parents_for_move(struct dentry *dentry,
1964 struct dentry *target)
1965{
1966 if (target->d_parent != dentry->d_parent)
1967 spin_unlock(&dentry->d_parent->d_lock);
1968 if (target->d_parent != target)
1969 spin_unlock(&target->d_parent->d_lock);
1970}
1971
Linus Torvalds1da177e2005-04-16 15:20:36 -07001972/*
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001973 * When switching names, the actual string doesn't strictly have to
1974 * be preserved in the target - because we're dropping the target
1975 * anyway. As such, we can just do a simple memcpy() to copy over
1976 * the new name before we switch.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001977 *
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001978 * Note that we have to be a lot more careful about getting the hash
1979 * switched - we have to switch the hash value properly even if it
1980 * then no longer matches the actual (corrupted) string of the target.
1981 * The hash value has to match the hash queue that the dentry is on..
Linus Torvalds1da177e2005-04-16 15:20:36 -07001982 */
Trond Myklebust9eaef272006-10-21 10:24:20 -07001983/*
Nick Pigginb5c84bf2011-01-07 17:49:38 +11001984 * d_move - move a dentry
Linus Torvalds1da177e2005-04-16 15:20:36 -07001985 * @dentry: entry to move
1986 * @target: new dentry
1987 *
1988 * Update the dcache to reflect the move of a file name. Negative
1989 * dcache entries should not be moved in this way.
1990 */
Nick Pigginb5c84bf2011-01-07 17:49:38 +11001991void d_move(struct dentry * dentry, struct dentry * target)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001992{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001993 if (!dentry->d_inode)
1994 printk(KERN_WARNING "VFS: moving negative dcache entry\n");
1995
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11001996 BUG_ON(d_ancestor(dentry, target));
1997 BUG_ON(d_ancestor(target, dentry));
1998
Linus Torvalds1da177e2005-04-16 15:20:36 -07001999 write_seqlock(&rename_lock);
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11002000
2001 dentry_lock_for_move(dentry, target);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002002
2003 /* Move the dentry to the target hash queue, if on different bucket */
Nick Piggin789680d2011-01-07 17:49:30 +11002004 spin_lock(&dcache_hash_lock);
2005 if (!d_unhashed(dentry))
2006 hlist_del_rcu(&dentry->d_hash);
2007 __d_rehash(dentry, d_hash(target->d_parent, target->d_name.hash));
2008 spin_unlock(&dcache_hash_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002009
2010 /* Unhash the target: dput() will then get rid of it */
2011 __d_drop(target);
2012
Eric Dumazet5160ee62006-01-08 01:03:32 -08002013 list_del(&dentry->d_u.d_child);
2014 list_del(&target->d_u.d_child);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002015
2016 /* Switch the names.. */
2017 switch_names(dentry, target);
Wu Fengguang9a8d5bb2009-01-07 18:09:14 -08002018 swap(dentry->d_name.hash, target->d_name.hash);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002019
2020 /* ... and switch the parents */
2021 if (IS_ROOT(dentry)) {
2022 dentry->d_parent = target->d_parent;
2023 target->d_parent = target;
Eric Dumazet5160ee62006-01-08 01:03:32 -08002024 INIT_LIST_HEAD(&target->d_u.d_child);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002025 } else {
Wu Fengguang9a8d5bb2009-01-07 18:09:14 -08002026 swap(dentry->d_parent, target->d_parent);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002027
2028 /* And add them back to the (new) parent lists */
Eric Dumazet5160ee62006-01-08 01:03:32 -08002029 list_add(&target->d_u.d_child, &target->d_parent->d_subdirs);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002030 }
2031
Eric Dumazet5160ee62006-01-08 01:03:32 -08002032 list_add(&dentry->d_u.d_child, &dentry->d_parent->d_subdirs);
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11002033
2034 dentry_unlock_parents_for_move(dentry, target);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002035 spin_unlock(&target->d_lock);
Nick Pigginc32ccd82006-03-25 03:07:09 -08002036 fsnotify_d_move(dentry);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002037 spin_unlock(&dentry->d_lock);
2038 write_sequnlock(&rename_lock);
Trond Myklebust9eaef272006-10-21 10:24:20 -07002039}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -07002040EXPORT_SYMBOL(d_move);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002041
OGAWA Hirofumie2761a12008-10-16 07:50:28 +09002042/**
2043 * d_ancestor - search for an ancestor
2044 * @p1: ancestor dentry
2045 * @p2: child dentry
2046 *
2047 * Returns the ancestor dentry of p2 which is a child of p1, if p1 is
2048 * an ancestor of p2, else NULL.
Trond Myklebust9eaef272006-10-21 10:24:20 -07002049 */
OGAWA Hirofumie2761a12008-10-16 07:50:28 +09002050struct dentry *d_ancestor(struct dentry *p1, struct dentry *p2)
Trond Myklebust9eaef272006-10-21 10:24:20 -07002051{
2052 struct dentry *p;
2053
OGAWA Hirofumi871c0062008-10-16 07:50:27 +09002054 for (p = p2; !IS_ROOT(p); p = p->d_parent) {
Trond Myklebust9eaef272006-10-21 10:24:20 -07002055 if (p->d_parent == p1)
OGAWA Hirofumie2761a12008-10-16 07:50:28 +09002056 return p;
Trond Myklebust9eaef272006-10-21 10:24:20 -07002057 }
OGAWA Hirofumie2761a12008-10-16 07:50:28 +09002058 return NULL;
Trond Myklebust9eaef272006-10-21 10:24:20 -07002059}
2060
2061/*
2062 * This helper attempts to cope with remotely renamed directories
2063 *
2064 * It assumes that the caller is already holding
Nick Pigginb5c84bf2011-01-07 17:49:38 +11002065 * dentry->d_parent->d_inode->i_mutex and the dcache_inode_lock
Trond Myklebust9eaef272006-10-21 10:24:20 -07002066 *
2067 * Note: If ever the locking in lock_rename() changes, then please
2068 * remember to update this too...
Trond Myklebust9eaef272006-10-21 10:24:20 -07002069 */
2070static struct dentry *__d_unalias(struct dentry *dentry, struct dentry *alias)
Nick Pigginb23fb0a2011-01-07 17:49:35 +11002071 __releases(dcache_inode_lock)
Trond Myklebust9eaef272006-10-21 10:24:20 -07002072{
2073 struct mutex *m1 = NULL, *m2 = NULL;
2074 struct dentry *ret;
2075
2076 /* If alias and dentry share a parent, then no extra locks required */
2077 if (alias->d_parent == dentry->d_parent)
2078 goto out_unalias;
2079
2080 /* Check for loops */
2081 ret = ERR_PTR(-ELOOP);
OGAWA Hirofumie2761a12008-10-16 07:50:28 +09002082 if (d_ancestor(alias, dentry))
Trond Myklebust9eaef272006-10-21 10:24:20 -07002083 goto out_err;
2084
2085 /* See lock_rename() */
2086 ret = ERR_PTR(-EBUSY);
2087 if (!mutex_trylock(&dentry->d_sb->s_vfs_rename_mutex))
2088 goto out_err;
2089 m1 = &dentry->d_sb->s_vfs_rename_mutex;
2090 if (!mutex_trylock(&alias->d_parent->d_inode->i_mutex))
2091 goto out_err;
2092 m2 = &alias->d_parent->d_inode->i_mutex;
2093out_unalias:
Nick Pigginb5c84bf2011-01-07 17:49:38 +11002094 d_move(alias, dentry);
Trond Myklebust9eaef272006-10-21 10:24:20 -07002095 ret = alias;
2096out_err:
Nick Pigginb23fb0a2011-01-07 17:49:35 +11002097 spin_unlock(&dcache_inode_lock);
Trond Myklebust9eaef272006-10-21 10:24:20 -07002098 if (m2)
2099 mutex_unlock(m2);
2100 if (m1)
2101 mutex_unlock(m1);
2102 return ret;
2103}
2104
2105/*
David Howells770bfad2006-08-22 20:06:07 -04002106 * Prepare an anonymous dentry for life in the superblock's dentry tree as a
2107 * named dentry in place of the dentry to be replaced.
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11002108 * returns with anon->d_lock held!
David Howells770bfad2006-08-22 20:06:07 -04002109 */
2110static void __d_materialise_dentry(struct dentry *dentry, struct dentry *anon)
2111{
2112 struct dentry *dparent, *aparent;
2113
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11002114 dentry_lock_for_move(anon, dentry);
David Howells770bfad2006-08-22 20:06:07 -04002115
2116 dparent = dentry->d_parent;
2117 aparent = anon->d_parent;
2118
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11002119 switch_names(dentry, anon);
2120 swap(dentry->d_name.hash, anon->d_name.hash);
2121
David Howells770bfad2006-08-22 20:06:07 -04002122 dentry->d_parent = (aparent == anon) ? dentry : aparent;
2123 list_del(&dentry->d_u.d_child);
2124 if (!IS_ROOT(dentry))
2125 list_add(&dentry->d_u.d_child, &dentry->d_parent->d_subdirs);
2126 else
2127 INIT_LIST_HEAD(&dentry->d_u.d_child);
2128
2129 anon->d_parent = (dparent == dentry) ? anon : dparent;
2130 list_del(&anon->d_u.d_child);
2131 if (!IS_ROOT(anon))
2132 list_add(&anon->d_u.d_child, &anon->d_parent->d_subdirs);
2133 else
2134 INIT_LIST_HEAD(&anon->d_u.d_child);
2135
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11002136 dentry_unlock_parents_for_move(anon, dentry);
2137 spin_unlock(&dentry->d_lock);
2138
2139 /* anon->d_lock still locked, returns locked */
David Howells770bfad2006-08-22 20:06:07 -04002140 anon->d_flags &= ~DCACHE_DISCONNECTED;
2141}
2142
2143/**
2144 * d_materialise_unique - introduce an inode into the tree
2145 * @dentry: candidate dentry
2146 * @inode: inode to bind to the dentry, to which aliases may be attached
2147 *
2148 * Introduces an dentry into the tree, substituting an extant disconnected
2149 * root directory alias in its place if there is one
2150 */
2151struct dentry *d_materialise_unique(struct dentry *dentry, struct inode *inode)
2152{
Trond Myklebust9eaef272006-10-21 10:24:20 -07002153 struct dentry *actual;
David Howells770bfad2006-08-22 20:06:07 -04002154
2155 BUG_ON(!d_unhashed(dentry));
2156
David Howells770bfad2006-08-22 20:06:07 -04002157 if (!inode) {
2158 actual = dentry;
OGAWA Hirofumi360da902008-10-16 07:50:28 +09002159 __d_instantiate(dentry, NULL);
Nick Piggin357f8e62011-01-07 17:49:42 +11002160 d_rehash(actual);
2161 goto out_nolock;
David Howells770bfad2006-08-22 20:06:07 -04002162 }
2163
Nick Piggin357f8e62011-01-07 17:49:42 +11002164 spin_lock(&dcache_inode_lock);
2165
Trond Myklebust9eaef272006-10-21 10:24:20 -07002166 if (S_ISDIR(inode->i_mode)) {
2167 struct dentry *alias;
David Howells770bfad2006-08-22 20:06:07 -04002168
Trond Myklebust9eaef272006-10-21 10:24:20 -07002169 /* Does an aliased dentry already exist? */
2170 alias = __d_find_alias(inode, 0);
2171 if (alias) {
2172 actual = alias;
2173 /* Is this an anonymous mountpoint that we could splice
2174 * into our tree? */
2175 if (IS_ROOT(alias)) {
Trond Myklebust9eaef272006-10-21 10:24:20 -07002176 __d_materialise_dentry(dentry, alias);
2177 __d_drop(alias);
2178 goto found;
2179 }
2180 /* Nope, but we must(!) avoid directory aliasing */
2181 actual = __d_unalias(dentry, alias);
2182 if (IS_ERR(actual))
2183 dput(alias);
2184 goto out_nolock;
2185 }
David Howells770bfad2006-08-22 20:06:07 -04002186 }
2187
2188 /* Add a unique reference */
2189 actual = __d_instantiate_unique(dentry, inode);
2190 if (!actual)
2191 actual = dentry;
Nick Piggin357f8e62011-01-07 17:49:42 +11002192 else
2193 BUG_ON(!d_unhashed(actual));
David Howells770bfad2006-08-22 20:06:07 -04002194
David Howells770bfad2006-08-22 20:06:07 -04002195 spin_lock(&actual->d_lock);
2196found:
Nick Piggin789680d2011-01-07 17:49:30 +11002197 spin_lock(&dcache_hash_lock);
David Howells770bfad2006-08-22 20:06:07 -04002198 _d_rehash(actual);
Nick Piggin789680d2011-01-07 17:49:30 +11002199 spin_unlock(&dcache_hash_lock);
David Howells770bfad2006-08-22 20:06:07 -04002200 spin_unlock(&actual->d_lock);
Nick Pigginb23fb0a2011-01-07 17:49:35 +11002201 spin_unlock(&dcache_inode_lock);
Trond Myklebust9eaef272006-10-21 10:24:20 -07002202out_nolock:
David Howells770bfad2006-08-22 20:06:07 -04002203 if (actual == dentry) {
2204 security_d_instantiate(dentry, inode);
2205 return NULL;
2206 }
2207
2208 iput(inode);
2209 return actual;
David Howells770bfad2006-08-22 20:06:07 -04002210}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -07002211EXPORT_SYMBOL_GPL(d_materialise_unique);
David Howells770bfad2006-08-22 20:06:07 -04002212
Miklos Szeredicdd16d02008-06-23 18:11:53 +02002213static int prepend(char **buffer, int *buflen, const char *str, int namelen)
Ram Pai6092d042008-03-27 13:06:20 +01002214{
2215 *buflen -= namelen;
2216 if (*buflen < 0)
2217 return -ENAMETOOLONG;
2218 *buffer -= namelen;
2219 memcpy(*buffer, str, namelen);
2220 return 0;
2221}
2222
Miklos Szeredicdd16d02008-06-23 18:11:53 +02002223static int prepend_name(char **buffer, int *buflen, struct qstr *name)
2224{
2225 return prepend(buffer, buflen, name->name, name->len);
2226}
2227
Linus Torvalds1da177e2005-04-16 15:20:36 -07002228/**
Miklos Szeredif2eb6572010-08-10 11:41:39 +02002229 * Prepend path string to a buffer
2230 *
2231 * @path: the dentry/vfsmount to report
2232 * @root: root vfsmnt/dentry (may be modified by this function)
2233 * @buffer: pointer to the end of the buffer
2234 * @buflen: pointer to buffer length
2235 *
Nick Piggin949854d2011-01-07 17:49:37 +11002236 * Caller holds the rename_lock.
Miklos Szeredif2eb6572010-08-10 11:41:39 +02002237 *
2238 * If path is not reachable from the supplied root, then the value of
2239 * root is changed (without modifying refcounts).
2240 */
2241static int prepend_path(const struct path *path, struct path *root,
2242 char **buffer, int *buflen)
2243{
2244 struct dentry *dentry = path->dentry;
2245 struct vfsmount *vfsmnt = path->mnt;
2246 bool slash = false;
2247 int error = 0;
2248
Nick Piggin99b7db72010-08-18 04:37:39 +10002249 br_read_lock(vfsmount_lock);
Miklos Szeredif2eb6572010-08-10 11:41:39 +02002250 while (dentry != root->dentry || vfsmnt != root->mnt) {
2251 struct dentry * parent;
2252
2253 if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) {
2254 /* Global root? */
2255 if (vfsmnt->mnt_parent == vfsmnt) {
2256 goto global_root;
2257 }
2258 dentry = vfsmnt->mnt_mountpoint;
2259 vfsmnt = vfsmnt->mnt_parent;
2260 continue;
2261 }
2262 parent = dentry->d_parent;
2263 prefetch(parent);
Nick Piggin9abca362011-01-07 17:49:36 +11002264 spin_lock(&dentry->d_lock);
Miklos Szeredif2eb6572010-08-10 11:41:39 +02002265 error = prepend_name(buffer, buflen, &dentry->d_name);
Nick Piggin9abca362011-01-07 17:49:36 +11002266 spin_unlock(&dentry->d_lock);
Miklos Szeredif2eb6572010-08-10 11:41:39 +02002267 if (!error)
2268 error = prepend(buffer, buflen, "/", 1);
2269 if (error)
2270 break;
2271
2272 slash = true;
2273 dentry = parent;
2274 }
2275
2276out:
2277 if (!error && !slash)
2278 error = prepend(buffer, buflen, "/", 1);
2279
Nick Piggin99b7db72010-08-18 04:37:39 +10002280 br_read_unlock(vfsmount_lock);
Miklos Szeredif2eb6572010-08-10 11:41:39 +02002281 return error;
2282
2283global_root:
2284 /*
2285 * Filesystems needing to implement special "root names"
2286 * should do so with ->d_dname()
2287 */
2288 if (IS_ROOT(dentry) &&
2289 (dentry->d_name.len != 1 || dentry->d_name.name[0] != '/')) {
2290 WARN(1, "Root dentry has weird name <%.*s>\n",
2291 (int) dentry->d_name.len, dentry->d_name.name);
2292 }
2293 root->mnt = vfsmnt;
2294 root->dentry = dentry;
2295 goto out;
2296}
2297
2298/**
Miklos Szeredi31f3e0b2008-06-23 18:11:52 +02002299 * __d_path - return the path of a dentry
Miklos Szeredi9d1bc6012008-03-27 13:06:21 +01002300 * @path: the dentry/vfsmount to report
2301 * @root: root vfsmnt/dentry (may be modified by this function)
Randy Dunlapcd956a12010-08-14 13:05:31 -07002302 * @buf: buffer to return value in
Linus Torvalds1da177e2005-04-16 15:20:36 -07002303 * @buflen: buffer length
2304 *
Miklos Szerediffd1f4e2010-08-10 11:41:40 +02002305 * Convert a dentry into an ASCII path name.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002306 *
Arjan van de Ven52afeef2008-12-01 14:35:00 -08002307 * Returns a pointer into the buffer or an error code if the
2308 * path was too long.
Linus Torvalds552ce542007-02-13 12:08:18 -08002309 *
Christoph Hellwigbe148242010-10-10 05:36:21 -04002310 * "buflen" should be positive.
Miklos Szeredi9d1bc6012008-03-27 13:06:21 +01002311 *
2312 * If path is not reachable from the supplied root, then the value of
2313 * root is changed (without modifying refcounts).
Linus Torvalds1da177e2005-04-16 15:20:36 -07002314 */
Miklos Szeredi9d1bc6012008-03-27 13:06:21 +01002315char *__d_path(const struct path *path, struct path *root,
Miklos Szeredif2eb6572010-08-10 11:41:39 +02002316 char *buf, int buflen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002317{
Miklos Szeredif2eb6572010-08-10 11:41:39 +02002318 char *res = buf + buflen;
2319 int error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002320
Miklos Szeredif2eb6572010-08-10 11:41:39 +02002321 prepend(&res, &buflen, "\0", 1);
Nick Piggin949854d2011-01-07 17:49:37 +11002322 write_seqlock(&rename_lock);
Miklos Szeredif2eb6572010-08-10 11:41:39 +02002323 error = prepend_path(path, root, &res, &buflen);
Nick Piggin949854d2011-01-07 17:49:37 +11002324 write_sequnlock(&rename_lock);
Christoph Hellwigbe148242010-10-10 05:36:21 -04002325
Miklos Szeredif2eb6572010-08-10 11:41:39 +02002326 if (error)
2327 return ERR_PTR(error);
Miklos Szeredif2eb6572010-08-10 11:41:39 +02002328 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002329}
2330
Miklos Szerediffd1f4e2010-08-10 11:41:40 +02002331/*
2332 * same as __d_path but appends "(deleted)" for unlinked files.
2333 */
2334static int path_with_deleted(const struct path *path, struct path *root,
2335 char **buf, int *buflen)
2336{
2337 prepend(buf, buflen, "\0", 1);
2338 if (d_unlinked(path->dentry)) {
2339 int error = prepend(buf, buflen, " (deleted)", 10);
2340 if (error)
2341 return error;
2342 }
2343
2344 return prepend_path(path, root, buf, buflen);
2345}
2346
Miklos Szeredi8df9d1a2010-08-10 11:41:41 +02002347static int prepend_unreachable(char **buffer, int *buflen)
2348{
2349 return prepend(buffer, buflen, "(unreachable)", 13);
2350}
2351
Jan Bluncka03a8a702008-02-14 19:38:32 -08002352/**
2353 * d_path - return the path of a dentry
Jan Blunckcf28b482008-02-14 19:38:44 -08002354 * @path: path to report
Jan Bluncka03a8a702008-02-14 19:38:32 -08002355 * @buf: buffer to return value in
2356 * @buflen: buffer length
2357 *
2358 * Convert a dentry into an ASCII path name. If the entry has been deleted
2359 * the string " (deleted)" is appended. Note that this is ambiguous.
2360 *
Arjan van de Ven52afeef2008-12-01 14:35:00 -08002361 * Returns a pointer into the buffer or an error code if the path was
2362 * too long. Note: Callers should use the returned pointer, not the passed
2363 * in buffer, to use the name! The implementation often starts at an offset
2364 * into the buffer, and may leave 0 bytes at the start.
Jan Bluncka03a8a702008-02-14 19:38:32 -08002365 *
Miklos Szeredi31f3e0b2008-06-23 18:11:52 +02002366 * "buflen" should be positive.
Jan Bluncka03a8a702008-02-14 19:38:32 -08002367 */
Jan Engelhardt20d4fdc2008-06-09 16:40:36 -07002368char *d_path(const struct path *path, char *buf, int buflen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002369{
Miklos Szerediffd1f4e2010-08-10 11:41:40 +02002370 char *res = buf + buflen;
Jan Blunck6ac08c32008-02-14 19:34:38 -08002371 struct path root;
Miklos Szeredi9d1bc6012008-03-27 13:06:21 +01002372 struct path tmp;
Miklos Szerediffd1f4e2010-08-10 11:41:40 +02002373 int error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002374
Eric Dumazetc23fbb62007-05-08 00:26:18 -07002375 /*
2376 * We have various synthetic filesystems that never get mounted. On
2377 * these filesystems dentries are never used for lookup purposes, and
2378 * thus don't need to be hashed. They also don't need a name until a
2379 * user wants to identify the object in /proc/pid/fd/. The little hack
2380 * below allows us to generate a name for these objects on demand:
2381 */
Jan Blunckcf28b482008-02-14 19:38:44 -08002382 if (path->dentry->d_op && path->dentry->d_op->d_dname)
2383 return path->dentry->d_op->d_dname(path->dentry, buf, buflen);
Eric Dumazetc23fbb62007-05-08 00:26:18 -07002384
Miklos Szeredif7ad3c62010-08-10 11:41:36 +02002385 get_fs_root(current->fs, &root);
Nick Piggin949854d2011-01-07 17:49:37 +11002386 write_seqlock(&rename_lock);
Miklos Szeredi9d1bc6012008-03-27 13:06:21 +01002387 tmp = root;
Miklos Szerediffd1f4e2010-08-10 11:41:40 +02002388 error = path_with_deleted(path, &tmp, &res, &buflen);
2389 if (error)
2390 res = ERR_PTR(error);
Nick Piggin949854d2011-01-07 17:49:37 +11002391 write_sequnlock(&rename_lock);
Jan Blunck6ac08c32008-02-14 19:34:38 -08002392 path_put(&root);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002393 return res;
2394}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -07002395EXPORT_SYMBOL(d_path);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002396
Miklos Szeredi8df9d1a2010-08-10 11:41:41 +02002397/**
2398 * d_path_with_unreachable - return the path of a dentry
2399 * @path: path to report
2400 * @buf: buffer to return value in
2401 * @buflen: buffer length
2402 *
2403 * The difference from d_path() is that this prepends "(unreachable)"
2404 * to paths which are unreachable from the current process' root.
2405 */
2406char *d_path_with_unreachable(const struct path *path, char *buf, int buflen)
2407{
2408 char *res = buf + buflen;
2409 struct path root;
2410 struct path tmp;
2411 int error;
2412
2413 if (path->dentry->d_op && path->dentry->d_op->d_dname)
2414 return path->dentry->d_op->d_dname(path->dentry, buf, buflen);
2415
2416 get_fs_root(current->fs, &root);
Nick Piggin949854d2011-01-07 17:49:37 +11002417 write_seqlock(&rename_lock);
Miklos Szeredi8df9d1a2010-08-10 11:41:41 +02002418 tmp = root;
2419 error = path_with_deleted(path, &tmp, &res, &buflen);
2420 if (!error && !path_equal(&tmp, &root))
2421 error = prepend_unreachable(&res, &buflen);
Nick Piggin949854d2011-01-07 17:49:37 +11002422 write_sequnlock(&rename_lock);
Miklos Szeredi8df9d1a2010-08-10 11:41:41 +02002423 path_put(&root);
2424 if (error)
2425 res = ERR_PTR(error);
2426
2427 return res;
2428}
2429
Linus Torvalds1da177e2005-04-16 15:20:36 -07002430/*
Eric Dumazetc23fbb62007-05-08 00:26:18 -07002431 * Helper function for dentry_operations.d_dname() members
2432 */
2433char *dynamic_dname(struct dentry *dentry, char *buffer, int buflen,
2434 const char *fmt, ...)
2435{
2436 va_list args;
2437 char temp[64];
2438 int sz;
2439
2440 va_start(args, fmt);
2441 sz = vsnprintf(temp, sizeof(temp), fmt, args) + 1;
2442 va_end(args);
2443
2444 if (sz > sizeof(temp) || sz > buflen)
2445 return ERR_PTR(-ENAMETOOLONG);
2446
2447 buffer += buflen - sz;
2448 return memcpy(buffer, temp, sz);
2449}
2450
2451/*
Ram Pai6092d042008-03-27 13:06:20 +01002452 * Write full pathname from the root of the filesystem into the buffer.
2453 */
Nick Pigginec2447c2011-01-07 17:49:29 +11002454static char *__dentry_path(struct dentry *dentry, char *buf, int buflen)
Ram Pai6092d042008-03-27 13:06:20 +01002455{
2456 char *end = buf + buflen;
2457 char *retval;
2458
Ram Pai6092d042008-03-27 13:06:20 +01002459 prepend(&end, &buflen, "\0", 1);
Ram Pai6092d042008-03-27 13:06:20 +01002460 if (buflen < 1)
2461 goto Elong;
2462 /* Get '/' right */
2463 retval = end-1;
2464 *retval = '/';
2465
Miklos Szeredicdd16d02008-06-23 18:11:53 +02002466 while (!IS_ROOT(dentry)) {
2467 struct dentry *parent = dentry->d_parent;
Nick Piggin9abca362011-01-07 17:49:36 +11002468 int error;
Ram Pai6092d042008-03-27 13:06:20 +01002469
Ram Pai6092d042008-03-27 13:06:20 +01002470 prefetch(parent);
Nick Piggin9abca362011-01-07 17:49:36 +11002471 spin_lock(&dentry->d_lock);
2472 error = prepend_name(&end, &buflen, &dentry->d_name);
2473 spin_unlock(&dentry->d_lock);
2474 if (error != 0 || prepend(&end, &buflen, "/", 1) != 0)
Ram Pai6092d042008-03-27 13:06:20 +01002475 goto Elong;
2476
2477 retval = end;
2478 dentry = parent;
2479 }
Al Viroc1031352010-06-06 22:31:14 -04002480 return retval;
2481Elong:
2482 return ERR_PTR(-ENAMETOOLONG);
2483}
Nick Pigginec2447c2011-01-07 17:49:29 +11002484
2485char *dentry_path_raw(struct dentry *dentry, char *buf, int buflen)
2486{
2487 char *retval;
2488
Nick Piggin949854d2011-01-07 17:49:37 +11002489 write_seqlock(&rename_lock);
Nick Pigginec2447c2011-01-07 17:49:29 +11002490 retval = __dentry_path(dentry, buf, buflen);
Nick Piggin949854d2011-01-07 17:49:37 +11002491 write_sequnlock(&rename_lock);
Nick Pigginec2447c2011-01-07 17:49:29 +11002492
2493 return retval;
2494}
2495EXPORT_SYMBOL(dentry_path_raw);
Al Viroc1031352010-06-06 22:31:14 -04002496
2497char *dentry_path(struct dentry *dentry, char *buf, int buflen)
2498{
2499 char *p = NULL;
2500 char *retval;
2501
Nick Piggin949854d2011-01-07 17:49:37 +11002502 write_seqlock(&rename_lock);
Al Viroc1031352010-06-06 22:31:14 -04002503 if (d_unlinked(dentry)) {
2504 p = buf + buflen;
2505 if (prepend(&p, &buflen, "//deleted", 10) != 0)
2506 goto Elong;
2507 buflen++;
2508 }
2509 retval = __dentry_path(dentry, buf, buflen);
Nick Piggin949854d2011-01-07 17:49:37 +11002510 write_sequnlock(&rename_lock);
Al Viroc1031352010-06-06 22:31:14 -04002511 if (!IS_ERR(retval) && p)
2512 *p = '/'; /* restore '/' overriden with '\0' */
Ram Pai6092d042008-03-27 13:06:20 +01002513 return retval;
2514Elong:
Ram Pai6092d042008-03-27 13:06:20 +01002515 return ERR_PTR(-ENAMETOOLONG);
2516}
2517
2518/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002519 * NOTE! The user-level library version returns a
2520 * character pointer. The kernel system call just
2521 * returns the length of the buffer filled (which
2522 * includes the ending '\0' character), or a negative
2523 * error value. So libc would do something like
2524 *
2525 * char *getcwd(char * buf, size_t size)
2526 * {
2527 * int retval;
2528 *
2529 * retval = sys_getcwd(buf, size);
2530 * if (retval >= 0)
2531 * return buf;
2532 * errno = -retval;
2533 * return NULL;
2534 * }
2535 */
Heiko Carstens3cdad422009-01-14 14:14:22 +01002536SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002537{
Linus Torvalds552ce542007-02-13 12:08:18 -08002538 int error;
Jan Blunck6ac08c32008-02-14 19:34:38 -08002539 struct path pwd, root;
Linus Torvalds552ce542007-02-13 12:08:18 -08002540 char *page = (char *) __get_free_page(GFP_USER);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002541
2542 if (!page)
2543 return -ENOMEM;
2544
Miklos Szeredif7ad3c62010-08-10 11:41:36 +02002545 get_fs_root_and_pwd(current->fs, &root, &pwd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002546
Linus Torvalds552ce542007-02-13 12:08:18 -08002547 error = -ENOENT;
Nick Piggin949854d2011-01-07 17:49:37 +11002548 write_seqlock(&rename_lock);
Alexey Dobriyanf3da3922009-05-04 03:32:03 +04002549 if (!d_unlinked(pwd.dentry)) {
Linus Torvalds552ce542007-02-13 12:08:18 -08002550 unsigned long len;
Miklos Szeredi9d1bc6012008-03-27 13:06:21 +01002551 struct path tmp = root;
Miklos Szeredi8df9d1a2010-08-10 11:41:41 +02002552 char *cwd = page + PAGE_SIZE;
2553 int buflen = PAGE_SIZE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002554
Miklos Szeredi8df9d1a2010-08-10 11:41:41 +02002555 prepend(&cwd, &buflen, "\0", 1);
2556 error = prepend_path(&pwd, &tmp, &cwd, &buflen);
Nick Piggin949854d2011-01-07 17:49:37 +11002557 write_sequnlock(&rename_lock);
Linus Torvalds552ce542007-02-13 12:08:18 -08002558
Miklos Szeredi8df9d1a2010-08-10 11:41:41 +02002559 if (error)
Linus Torvalds552ce542007-02-13 12:08:18 -08002560 goto out;
2561
Miklos Szeredi8df9d1a2010-08-10 11:41:41 +02002562 /* Unreachable from current root */
2563 if (!path_equal(&tmp, &root)) {
2564 error = prepend_unreachable(&cwd, &buflen);
2565 if (error)
2566 goto out;
2567 }
2568
Linus Torvalds552ce542007-02-13 12:08:18 -08002569 error = -ERANGE;
2570 len = PAGE_SIZE + page - cwd;
2571 if (len <= size) {
2572 error = len;
2573 if (copy_to_user(buf, cwd, len))
2574 error = -EFAULT;
2575 }
Nick Piggin949854d2011-01-07 17:49:37 +11002576 } else {
2577 write_sequnlock(&rename_lock);
Nick Piggin949854d2011-01-07 17:49:37 +11002578 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002579
2580out:
Jan Blunck6ac08c32008-02-14 19:34:38 -08002581 path_put(&pwd);
2582 path_put(&root);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002583 free_page((unsigned long) page);
2584 return error;
2585}
2586
2587/*
2588 * Test whether new_dentry is a subdirectory of old_dentry.
2589 *
2590 * Trivially implemented using the dcache structure
2591 */
2592
2593/**
2594 * is_subdir - is new dentry a subdirectory of old_dentry
2595 * @new_dentry: new dentry
2596 * @old_dentry: old dentry
2597 *
2598 * Returns 1 if new_dentry is a subdirectory of the parent (at any depth).
2599 * Returns 0 otherwise.
2600 * Caller must ensure that "new_dentry" is pinned before calling is_subdir()
2601 */
2602
OGAWA Hirofumie2761a12008-10-16 07:50:28 +09002603int is_subdir(struct dentry *new_dentry, struct dentry *old_dentry)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002604{
2605 int result;
Nick Piggin949854d2011-01-07 17:49:37 +11002606 unsigned seq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002607
OGAWA Hirofumie2761a12008-10-16 07:50:28 +09002608 if (new_dentry == old_dentry)
2609 return 1;
2610
OGAWA Hirofumie2761a12008-10-16 07:50:28 +09002611 do {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002612 /* for restarting inner loop in case of seq retry */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002613 seq = read_seqbegin(&rename_lock);
Nick Piggin949854d2011-01-07 17:49:37 +11002614 /*
2615 * Need rcu_readlock to protect against the d_parent trashing
2616 * due to d_move
2617 */
2618 rcu_read_lock();
OGAWA Hirofumie2761a12008-10-16 07:50:28 +09002619 if (d_ancestor(old_dentry, new_dentry))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002620 result = 1;
OGAWA Hirofumie2761a12008-10-16 07:50:28 +09002621 else
2622 result = 0;
Nick Piggin949854d2011-01-07 17:49:37 +11002623 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002624 } while (read_seqretry(&rename_lock, seq));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002625
2626 return result;
2627}
2628
Al Viro2096f752010-01-30 13:16:21 -05002629int path_is_under(struct path *path1, struct path *path2)
2630{
2631 struct vfsmount *mnt = path1->mnt;
2632 struct dentry *dentry = path1->dentry;
2633 int res;
Nick Piggin99b7db72010-08-18 04:37:39 +10002634
2635 br_read_lock(vfsmount_lock);
Al Viro2096f752010-01-30 13:16:21 -05002636 if (mnt != path2->mnt) {
2637 for (;;) {
2638 if (mnt->mnt_parent == mnt) {
Nick Piggin99b7db72010-08-18 04:37:39 +10002639 br_read_unlock(vfsmount_lock);
Al Viro2096f752010-01-30 13:16:21 -05002640 return 0;
2641 }
2642 if (mnt->mnt_parent == path2->mnt)
2643 break;
2644 mnt = mnt->mnt_parent;
2645 }
2646 dentry = mnt->mnt_mountpoint;
2647 }
2648 res = is_subdir(dentry, path2->dentry);
Nick Piggin99b7db72010-08-18 04:37:39 +10002649 br_read_unlock(vfsmount_lock);
Al Viro2096f752010-01-30 13:16:21 -05002650 return res;
2651}
2652EXPORT_SYMBOL(path_is_under);
2653
Linus Torvalds1da177e2005-04-16 15:20:36 -07002654void d_genocide(struct dentry *root)
2655{
Nick Piggin949854d2011-01-07 17:49:37 +11002656 struct dentry *this_parent;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002657 struct list_head *next;
Nick Piggin949854d2011-01-07 17:49:37 +11002658 unsigned seq;
Nick Piggin58db63d2011-01-07 17:49:39 +11002659 int locked = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002660
Nick Piggin949854d2011-01-07 17:49:37 +11002661 seq = read_seqbegin(&rename_lock);
Nick Piggin58db63d2011-01-07 17:49:39 +11002662again:
2663 this_parent = root;
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11002664 spin_lock(&this_parent->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002665repeat:
2666 next = this_parent->d_subdirs.next;
2667resume:
2668 while (next != &this_parent->d_subdirs) {
2669 struct list_head *tmp = next;
Eric Dumazet5160ee62006-01-08 01:03:32 -08002670 struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002671 next = tmp->next;
Nick Piggin949854d2011-01-07 17:49:37 +11002672
Nick Pigginda502952011-01-07 17:49:33 +11002673 spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
2674 if (d_unhashed(dentry) || !dentry->d_inode) {
2675 spin_unlock(&dentry->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002676 continue;
Nick Pigginda502952011-01-07 17:49:33 +11002677 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002678 if (!list_empty(&dentry->d_subdirs)) {
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11002679 spin_unlock(&this_parent->d_lock);
2680 spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002681 this_parent = dentry;
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11002682 spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002683 goto repeat;
2684 }
Nick Piggin949854d2011-01-07 17:49:37 +11002685 if (!(dentry->d_flags & DCACHE_GENOCIDE)) {
2686 dentry->d_flags |= DCACHE_GENOCIDE;
2687 dentry->d_count--;
2688 }
Nick Pigginb7ab39f2011-01-07 17:49:32 +11002689 spin_unlock(&dentry->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002690 }
2691 if (this_parent != root) {
Nick Piggin949854d2011-01-07 17:49:37 +11002692 struct dentry *tmp;
2693 struct dentry *child;
2694
2695 tmp = this_parent->d_parent;
2696 if (!(this_parent->d_flags & DCACHE_GENOCIDE)) {
2697 this_parent->d_flags |= DCACHE_GENOCIDE;
2698 this_parent->d_count--;
2699 }
2700 rcu_read_lock();
Nick Pigginb7ab39f2011-01-07 17:49:32 +11002701 spin_unlock(&this_parent->d_lock);
Nick Piggin949854d2011-01-07 17:49:37 +11002702 child = this_parent;
2703 this_parent = tmp;
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11002704 spin_lock(&this_parent->d_lock);
Nick Piggin949854d2011-01-07 17:49:37 +11002705 /* might go back up the wrong parent if we have had a rename
2706 * or deletion */
2707 if (this_parent != child->d_parent ||
Nick Piggin58db63d2011-01-07 17:49:39 +11002708 (!locked && read_seqretry(&rename_lock, seq))) {
Nick Piggin949854d2011-01-07 17:49:37 +11002709 spin_unlock(&this_parent->d_lock);
Nick Piggin949854d2011-01-07 17:49:37 +11002710 rcu_read_unlock();
2711 goto rename_retry;
2712 }
2713 rcu_read_unlock();
2714 next = child->d_u.d_child.next;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002715 goto resume;
2716 }
Nick Piggin2fd6b7f2011-01-07 17:49:34 +11002717 spin_unlock(&this_parent->d_lock);
Nick Piggin58db63d2011-01-07 17:49:39 +11002718 if (!locked && read_seqretry(&rename_lock, seq))
Nick Piggin949854d2011-01-07 17:49:37 +11002719 goto rename_retry;
Nick Piggin58db63d2011-01-07 17:49:39 +11002720 if (locked)
2721 write_sequnlock(&rename_lock);
2722 return;
2723
2724rename_retry:
2725 locked = 1;
2726 write_seqlock(&rename_lock);
2727 goto again;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002728}
2729
2730/**
2731 * find_inode_number - check for dentry with name
2732 * @dir: directory to check
2733 * @name: Name to find.
2734 *
2735 * Check whether a dentry already exists for the given name,
2736 * and return the inode number if it has an inode. Otherwise
2737 * 0 is returned.
2738 *
2739 * This routine is used to post-process directory listings for
2740 * filesystems using synthetic inode numbers, and is necessary
2741 * to keep getcwd() working.
2742 */
2743
2744ino_t find_inode_number(struct dentry *dir, struct qstr *name)
2745{
2746 struct dentry * dentry;
2747 ino_t ino = 0;
2748
Eric W. Biederman3e7e2412006-03-31 02:31:43 -08002749 dentry = d_hash_and_lookup(dir, name);
2750 if (dentry) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002751 if (dentry->d_inode)
2752 ino = dentry->d_inode->i_ino;
2753 dput(dentry);
2754 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002755 return ino;
2756}
H Hartley Sweetenec4f8602010-01-05 13:45:18 -07002757EXPORT_SYMBOL(find_inode_number);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002758
2759static __initdata unsigned long dhash_entries;
2760static int __init set_dhash_entries(char *str)
2761{
2762 if (!str)
2763 return 0;
2764 dhash_entries = simple_strtoul(str, &str, 0);
2765 return 1;
2766}
2767__setup("dhash_entries=", set_dhash_entries);
2768
2769static void __init dcache_init_early(void)
2770{
2771 int loop;
2772
2773 /* If hashes are distributed across NUMA nodes, defer
2774 * hash allocation until vmalloc space is available.
2775 */
2776 if (hashdist)
2777 return;
2778
2779 dentry_hashtable =
2780 alloc_large_system_hash("Dentry cache",
2781 sizeof(struct hlist_head),
2782 dhash_entries,
2783 13,
2784 HASH_EARLY,
2785 &d_hash_shift,
2786 &d_hash_mask,
2787 0);
2788
2789 for (loop = 0; loop < (1 << d_hash_shift); loop++)
2790 INIT_HLIST_HEAD(&dentry_hashtable[loop]);
2791}
2792
Denis Cheng74bf17c2007-10-16 23:26:30 -07002793static void __init dcache_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002794{
2795 int loop;
2796
2797 /*
2798 * A constructor could be added for stable state like the lists,
2799 * but it is probably not worth it because of the cache nature
2800 * of the dcache.
2801 */
Christoph Lameter0a31bd52007-05-06 14:49:57 -07002802 dentry_cache = KMEM_CACHE(dentry,
2803 SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_MEM_SPREAD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002804
Rusty Russell8e1f9362007-07-17 04:03:17 -07002805 register_shrinker(&dcache_shrinker);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002806
2807 /* Hash may have been set up in dcache_init_early */
2808 if (!hashdist)
2809 return;
2810
2811 dentry_hashtable =
2812 alloc_large_system_hash("Dentry cache",
2813 sizeof(struct hlist_head),
2814 dhash_entries,
2815 13,
2816 0,
2817 &d_hash_shift,
2818 &d_hash_mask,
2819 0);
2820
2821 for (loop = 0; loop < (1 << d_hash_shift); loop++)
2822 INIT_HLIST_HEAD(&dentry_hashtable[loop]);
2823}
2824
2825/* SLAB cache for __getname() consumers */
Christoph Lametere18b8902006-12-06 20:33:20 -08002826struct kmem_cache *names_cachep __read_mostly;
H Hartley Sweetenec4f8602010-01-05 13:45:18 -07002827EXPORT_SYMBOL(names_cachep);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002828
Linus Torvalds1da177e2005-04-16 15:20:36 -07002829EXPORT_SYMBOL(d_genocide);
2830
Linus Torvalds1da177e2005-04-16 15:20:36 -07002831void __init vfs_caches_init_early(void)
2832{
2833 dcache_init_early();
2834 inode_init_early();
2835}
2836
2837void __init vfs_caches_init(unsigned long mempages)
2838{
2839 unsigned long reserve;
2840
2841 /* Base hash sizes on available memory, with a reserve equal to
2842 150% of current kernel size */
2843
2844 reserve = min((mempages - nr_free_pages()) * 3/2, mempages - 1);
2845 mempages -= reserve;
2846
2847 names_cachep = kmem_cache_create("names_cache", PATH_MAX, 0,
Paul Mundt20c2df82007-07-20 10:11:58 +09002848 SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002849
Denis Cheng74bf17c2007-10-16 23:26:30 -07002850 dcache_init();
2851 inode_init();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002852 files_init(mempages);
Denis Cheng74bf17c2007-10-16 23:26:30 -07002853 mnt_init();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002854 bdev_cache_init();
2855 chrdev_init();
2856}