diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /fs/dcache.c |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'fs/dcache.c')
-rw-r--r-- | fs/dcache.c | 1764 |
1 files changed, 1764 insertions, 0 deletions
diff --git a/fs/dcache.c b/fs/dcache.c new file mode 100644 index 000000000000..496a4e08369c --- /dev/null +++ b/fs/dcache.c | |||
@@ -0,0 +1,1764 @@ | |||
1 | /* | ||
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 | |||
17 | #include <linux/config.h> | ||
18 | #include <linux/syscalls.h> | ||
19 | #include <linux/string.h> | ||
20 | #include <linux/mm.h> | ||
21 | #include <linux/fs.h> | ||
22 | #include <linux/slab.h> | ||
23 | #include <linux/init.h> | ||
24 | #include <linux/smp_lock.h> | ||
25 | #include <linux/hash.h> | ||
26 | #include <linux/cache.h> | ||
27 | #include <linux/module.h> | ||
28 | #include <linux/mount.h> | ||
29 | #include <linux/file.h> | ||
30 | #include <asm/uaccess.h> | ||
31 | #include <linux/security.h> | ||
32 | #include <linux/seqlock.h> | ||
33 | #include <linux/swap.h> | ||
34 | #include <linux/bootmem.h> | ||
35 | |||
36 | /* #define DCACHE_DEBUG 1 */ | ||
37 | |||
38 | int sysctl_vfs_cache_pressure = 100; | ||
39 | EXPORT_SYMBOL_GPL(sysctl_vfs_cache_pressure); | ||
40 | |||
41 | __cacheline_aligned_in_smp DEFINE_SPINLOCK(dcache_lock); | ||
42 | seqlock_t rename_lock __cacheline_aligned_in_smp = SEQLOCK_UNLOCKED; | ||
43 | |||
44 | EXPORT_SYMBOL(dcache_lock); | ||
45 | |||
46 | static kmem_cache_t *dentry_cache; | ||
47 | |||
48 | #define DNAME_INLINE_LEN (sizeof(struct dentry)-offsetof(struct dentry,d_iname)) | ||
49 | |||
50 | /* | ||
51 | * This is the single most critical data structure when it comes | ||
52 | * to the dcache: the hashtable for lookups. Somebody should try | ||
53 | * to make this good - I've just made it work. | ||
54 | * | ||
55 | * This hash-function tries to avoid losing too many bits of hash | ||
56 | * information, yet avoid using a prime hash-size or similar. | ||
57 | */ | ||
58 | #define D_HASHBITS d_hash_shift | ||
59 | #define D_HASHMASK d_hash_mask | ||
60 | |||
61 | static unsigned int d_hash_mask; | ||
62 | static unsigned int d_hash_shift; | ||
63 | static struct hlist_head *dentry_hashtable; | ||
64 | static LIST_HEAD(dentry_unused); | ||
65 | |||
66 | /* Statistics gathering. */ | ||
67 | struct dentry_stat_t dentry_stat = { | ||
68 | .age_limit = 45, | ||
69 | }; | ||
70 | |||
71 | static void d_callback(struct rcu_head *head) | ||
72 | { | ||
73 | struct dentry * dentry = container_of(head, struct dentry, d_rcu); | ||
74 | |||
75 | if (dname_external(dentry)) | ||
76 | kfree(dentry->d_name.name); | ||
77 | kmem_cache_free(dentry_cache, dentry); | ||
78 | } | ||
79 | |||
80 | /* | ||
81 | * no dcache_lock, please. The caller must decrement dentry_stat.nr_dentry | ||
82 | * inside dcache_lock. | ||
83 | */ | ||
84 | static void d_free(struct dentry *dentry) | ||
85 | { | ||
86 | if (dentry->d_op && dentry->d_op->d_release) | ||
87 | dentry->d_op->d_release(dentry); | ||
88 | call_rcu(&dentry->d_rcu, d_callback); | ||
89 | } | ||
90 | |||
91 | /* | ||
92 | * Release the dentry's inode, using the filesystem | ||
93 | * d_iput() operation if defined. | ||
94 | * Called with dcache_lock and per dentry lock held, drops both. | ||
95 | */ | ||
96 | static inline void dentry_iput(struct dentry * dentry) | ||
97 | { | ||
98 | struct inode *inode = dentry->d_inode; | ||
99 | if (inode) { | ||
100 | dentry->d_inode = NULL; | ||
101 | list_del_init(&dentry->d_alias); | ||
102 | spin_unlock(&dentry->d_lock); | ||
103 | spin_unlock(&dcache_lock); | ||
104 | if (dentry->d_op && dentry->d_op->d_iput) | ||
105 | dentry->d_op->d_iput(dentry, inode); | ||
106 | else | ||
107 | iput(inode); | ||
108 | } else { | ||
109 | spin_unlock(&dentry->d_lock); | ||
110 | spin_unlock(&dcache_lock); | ||
111 | } | ||
112 | } | ||
113 | |||
114 | /* | ||
115 | * This is dput | ||
116 | * | ||
117 | * This is complicated by the fact that we do not want to put | ||
118 | * dentries that are no longer on any hash chain on the unused | ||
119 | * list: we'd much rather just get rid of them immediately. | ||
120 | * | ||
121 | * However, that implies that we have to traverse the dentry | ||
122 | * tree upwards to the parents which might _also_ now be | ||
123 | * scheduled for deletion (it may have been only waiting for | ||
124 | * its last child to go away). | ||
125 | * | ||
126 | * This tail recursion is done by hand as we don't want to depend | ||
127 | * on the compiler to always get this right (gcc generally doesn't). | ||
128 | * Real recursion would eat up our stack space. | ||
129 | */ | ||
130 | |||
131 | /* | ||
132 | * dput - release a dentry | ||
133 | * @dentry: dentry to release | ||
134 | * | ||
135 | * Release a dentry. This will drop the usage count and if appropriate | ||
136 | * call the dentry unlink method as well as removing it from the queues and | ||
137 | * releasing its resources. If the parent dentries were scheduled for release | ||
138 | * they too may now get deleted. | ||
139 | * | ||
140 | * no dcache lock, please. | ||
141 | */ | ||
142 | |||
143 | void dput(struct dentry *dentry) | ||
144 | { | ||
145 | if (!dentry) | ||
146 | return; | ||
147 | |||
148 | repeat: | ||
149 | if (atomic_read(&dentry->d_count) == 1) | ||
150 | might_sleep(); | ||
151 | if (!atomic_dec_and_lock(&dentry->d_count, &dcache_lock)) | ||
152 | return; | ||
153 | |||
154 | spin_lock(&dentry->d_lock); | ||
155 | if (atomic_read(&dentry->d_count)) { | ||
156 | spin_unlock(&dentry->d_lock); | ||
157 | spin_unlock(&dcache_lock); | ||
158 | return; | ||
159 | } | ||
160 | |||
161 | /* | ||
162 | * AV: ->d_delete() is _NOT_ allowed to block now. | ||
163 | */ | ||
164 | if (dentry->d_op && dentry->d_op->d_delete) { | ||
165 | if (dentry->d_op->d_delete(dentry)) | ||
166 | goto unhash_it; | ||
167 | } | ||
168 | /* Unreachable? Get rid of it */ | ||
169 | if (d_unhashed(dentry)) | ||
170 | goto kill_it; | ||
171 | if (list_empty(&dentry->d_lru)) { | ||
172 | dentry->d_flags |= DCACHE_REFERENCED; | ||
173 | list_add(&dentry->d_lru, &dentry_unused); | ||
174 | dentry_stat.nr_unused++; | ||
175 | } | ||
176 | spin_unlock(&dentry->d_lock); | ||
177 | spin_unlock(&dcache_lock); | ||
178 | return; | ||
179 | |||
180 | unhash_it: | ||
181 | __d_drop(dentry); | ||
182 | |||
183 | kill_it: { | ||
184 | struct dentry *parent; | ||
185 | |||
186 | /* If dentry was on d_lru list | ||
187 | * delete it from there | ||
188 | */ | ||
189 | if (!list_empty(&dentry->d_lru)) { | ||
190 | list_del(&dentry->d_lru); | ||
191 | dentry_stat.nr_unused--; | ||
192 | } | ||
193 | list_del(&dentry->d_child); | ||
194 | dentry_stat.nr_dentry--; /* For d_free, below */ | ||
195 | /*drops the locks, at that point nobody can reach this dentry */ | ||
196 | dentry_iput(dentry); | ||
197 | parent = dentry->d_parent; | ||
198 | d_free(dentry); | ||
199 | if (dentry == parent) | ||
200 | return; | ||
201 | dentry = parent; | ||
202 | goto repeat; | ||
203 | } | ||
204 | } | ||
205 | |||
206 | /** | ||
207 | * d_invalidate - invalidate a dentry | ||
208 | * @dentry: dentry to invalidate | ||
209 | * | ||
210 | * Try to invalidate the dentry if it turns out to be | ||
211 | * possible. If there are other dentries that can be | ||
212 | * reached through this one we can't delete it and we | ||
213 | * return -EBUSY. On success we return 0. | ||
214 | * | ||
215 | * no dcache lock. | ||
216 | */ | ||
217 | |||
218 | int d_invalidate(struct dentry * dentry) | ||
219 | { | ||
220 | /* | ||
221 | * If it's already been dropped, return OK. | ||
222 | */ | ||
223 | spin_lock(&dcache_lock); | ||
224 | if (d_unhashed(dentry)) { | ||
225 | spin_unlock(&dcache_lock); | ||
226 | return 0; | ||
227 | } | ||
228 | /* | ||
229 | * Check whether to do a partial shrink_dcache | ||
230 | * to get rid of unused child entries. | ||
231 | */ | ||
232 | if (!list_empty(&dentry->d_subdirs)) { | ||
233 | spin_unlock(&dcache_lock); | ||
234 | shrink_dcache_parent(dentry); | ||
235 | spin_lock(&dcache_lock); | ||
236 | } | ||
237 | |||
238 | /* | ||
239 | * Somebody else still using it? | ||
240 | * | ||
241 | * If it's a directory, we can't drop it | ||
242 | * for fear of somebody re-populating it | ||
243 | * with children (even though dropping it | ||
244 | * would make it unreachable from the root, | ||
245 | * we might still populate it if it was a | ||
246 | * working directory or similar). | ||
247 | */ | ||
248 | spin_lock(&dentry->d_lock); | ||
249 | if (atomic_read(&dentry->d_count) > 1) { | ||
250 | if (dentry->d_inode && S_ISDIR(dentry->d_inode->i_mode)) { | ||
251 | spin_unlock(&dentry->d_lock); | ||
252 | spin_unlock(&dcache_lock); | ||
253 | return -EBUSY; | ||
254 | } | ||
255 | } | ||
256 | |||
257 | __d_drop(dentry); | ||
258 | spin_unlock(&dentry->d_lock); | ||
259 | spin_unlock(&dcache_lock); | ||
260 | return 0; | ||
261 | } | ||
262 | |||
263 | /* This should be called _only_ with dcache_lock held */ | ||
264 | |||
265 | static inline struct dentry * __dget_locked(struct dentry *dentry) | ||
266 | { | ||
267 | atomic_inc(&dentry->d_count); | ||
268 | if (!list_empty(&dentry->d_lru)) { | ||
269 | dentry_stat.nr_unused--; | ||
270 | list_del_init(&dentry->d_lru); | ||
271 | } | ||
272 | return dentry; | ||
273 | } | ||
274 | |||
275 | struct dentry * dget_locked(struct dentry *dentry) | ||
276 | { | ||
277 | return __dget_locked(dentry); | ||
278 | } | ||
279 | |||
280 | /** | ||
281 | * d_find_alias - grab a hashed alias of inode | ||
282 | * @inode: inode in question | ||
283 | * @want_discon: flag, used by d_splice_alias, to request | ||
284 | * that only a DISCONNECTED alias be returned. | ||
285 | * | ||
286 | * If inode has a hashed alias, or is a directory and has any alias, | ||
287 | * acquire the reference to alias and return it. Otherwise return NULL. | ||
288 | * Notice that if inode is a directory there can be only one alias and | ||
289 | * it can be unhashed only if it has no children, or if it is the root | ||
290 | * of a filesystem. | ||
291 | * | ||
292 | * If the inode has a DCACHE_DISCONNECTED alias, then prefer | ||
293 | * any other hashed alias over that one unless @want_discon is set, | ||
294 | * in which case only return a DCACHE_DISCONNECTED alias. | ||
295 | */ | ||
296 | |||
297 | static struct dentry * __d_find_alias(struct inode *inode, int want_discon) | ||
298 | { | ||
299 | struct list_head *head, *next, *tmp; | ||
300 | struct dentry *alias, *discon_alias=NULL; | ||
301 | |||
302 | head = &inode->i_dentry; | ||
303 | next = inode->i_dentry.next; | ||
304 | while (next != head) { | ||
305 | tmp = next; | ||
306 | next = tmp->next; | ||
307 | prefetch(next); | ||
308 | alias = list_entry(tmp, struct dentry, d_alias); | ||
309 | if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) { | ||
310 | if (alias->d_flags & DCACHE_DISCONNECTED) | ||
311 | discon_alias = alias; | ||
312 | else if (!want_discon) { | ||
313 | __dget_locked(alias); | ||
314 | return alias; | ||
315 | } | ||
316 | } | ||
317 | } | ||
318 | if (discon_alias) | ||
319 | __dget_locked(discon_alias); | ||
320 | return discon_alias; | ||
321 | } | ||
322 | |||
323 | struct dentry * d_find_alias(struct inode *inode) | ||
324 | { | ||
325 | struct dentry *de; | ||
326 | spin_lock(&dcache_lock); | ||
327 | de = __d_find_alias(inode, 0); | ||
328 | spin_unlock(&dcache_lock); | ||
329 | return de; | ||
330 | } | ||
331 | |||
332 | /* | ||
333 | * Try to kill dentries associated with this inode. | ||
334 | * WARNING: you must own a reference to inode. | ||
335 | */ | ||
336 | void d_prune_aliases(struct inode *inode) | ||
337 | { | ||
338 | struct list_head *tmp, *head = &inode->i_dentry; | ||
339 | restart: | ||
340 | spin_lock(&dcache_lock); | ||
341 | tmp = head; | ||
342 | while ((tmp = tmp->next) != head) { | ||
343 | struct dentry *dentry = list_entry(tmp, struct dentry, d_alias); | ||
344 | spin_lock(&dentry->d_lock); | ||
345 | if (!atomic_read(&dentry->d_count)) { | ||
346 | __dget_locked(dentry); | ||
347 | __d_drop(dentry); | ||
348 | spin_unlock(&dentry->d_lock); | ||
349 | spin_unlock(&dcache_lock); | ||
350 | dput(dentry); | ||
351 | goto restart; | ||
352 | } | ||
353 | spin_unlock(&dentry->d_lock); | ||
354 | } | ||
355 | spin_unlock(&dcache_lock); | ||
356 | } | ||
357 | |||
358 | /* | ||
359 | * Throw away a dentry - free the inode, dput the parent. | ||
360 | * This requires that the LRU list has already been | ||
361 | * removed. | ||
362 | * Called with dcache_lock, drops it and then regains. | ||
363 | */ | ||
364 | static inline void prune_one_dentry(struct dentry * dentry) | ||
365 | { | ||
366 | struct dentry * parent; | ||
367 | |||
368 | __d_drop(dentry); | ||
369 | list_del(&dentry->d_child); | ||
370 | dentry_stat.nr_dentry--; /* For d_free, below */ | ||
371 | dentry_iput(dentry); | ||
372 | parent = dentry->d_parent; | ||
373 | d_free(dentry); | ||
374 | if (parent != dentry) | ||
375 | dput(parent); | ||
376 | spin_lock(&dcache_lock); | ||
377 | } | ||
378 | |||
379 | /** | ||
380 | * prune_dcache - shrink the dcache | ||
381 | * @count: number of entries to try and free | ||
382 | * | ||
383 | * Shrink the dcache. This is done when we need | ||
384 | * more memory, or simply when we need to unmount | ||
385 | * something (at which point we need to unuse | ||
386 | * all dentries). | ||
387 | * | ||
388 | * This function may fail to free any resources if | ||
389 | * all the dentries are in use. | ||
390 | */ | ||
391 | |||
392 | static void prune_dcache(int count) | ||
393 | { | ||
394 | spin_lock(&dcache_lock); | ||
395 | for (; count ; count--) { | ||
396 | struct dentry *dentry; | ||
397 | struct list_head *tmp; | ||
398 | |||
399 | cond_resched_lock(&dcache_lock); | ||
400 | |||
401 | tmp = dentry_unused.prev; | ||
402 | if (tmp == &dentry_unused) | ||
403 | break; | ||
404 | list_del_init(tmp); | ||
405 | prefetch(dentry_unused.prev); | ||
406 | dentry_stat.nr_unused--; | ||
407 | dentry = list_entry(tmp, struct dentry, d_lru); | ||
408 | |||
409 | spin_lock(&dentry->d_lock); | ||
410 | /* | ||
411 | * We found an inuse dentry which was not removed from | ||
412 | * dentry_unused because of laziness during lookup. Do not free | ||
413 | * it - just keep it off the dentry_unused list. | ||
414 | */ | ||
415 | if (atomic_read(&dentry->d_count)) { | ||
416 | spin_unlock(&dentry->d_lock); | ||
417 | continue; | ||
418 | } | ||
419 | /* If the dentry was recently referenced, don't free it. */ | ||
420 | if (dentry->d_flags & DCACHE_REFERENCED) { | ||
421 | dentry->d_flags &= ~DCACHE_REFERENCED; | ||
422 | list_add(&dentry->d_lru, &dentry_unused); | ||
423 | dentry_stat.nr_unused++; | ||
424 | spin_unlock(&dentry->d_lock); | ||
425 | continue; | ||
426 | } | ||
427 | prune_one_dentry(dentry); | ||
428 | } | ||
429 | spin_unlock(&dcache_lock); | ||
430 | } | ||
431 | |||
432 | /* | ||
433 | * Shrink the dcache for the specified super block. | ||
434 | * This allows us to unmount a device without disturbing | ||
435 | * the dcache for the other devices. | ||
436 | * | ||
437 | * This implementation makes just two traversals of the | ||
438 | * unused list. On the first pass we move the selected | ||
439 | * dentries to the most recent end, and on the second | ||
440 | * pass we free them. The second pass must restart after | ||
441 | * each dput(), but since the target dentries are all at | ||
442 | * the end, it's really just a single traversal. | ||
443 | */ | ||
444 | |||
445 | /** | ||
446 | * shrink_dcache_sb - shrink dcache for a superblock | ||
447 | * @sb: superblock | ||
448 | * | ||
449 | * Shrink the dcache for the specified super block. This | ||
450 | * is used to free the dcache before unmounting a file | ||
451 | * system | ||
452 | */ | ||
453 | |||
454 | void shrink_dcache_sb(struct super_block * sb) | ||
455 | { | ||
456 | struct list_head *tmp, *next; | ||
457 | struct dentry *dentry; | ||
458 | |||
459 | /* | ||
460 | * Pass one ... move the dentries for the specified | ||
461 | * superblock to the most recent end of the unused list. | ||
462 | */ | ||
463 | spin_lock(&dcache_lock); | ||
464 | next = dentry_unused.next; | ||
465 | while (next != &dentry_unused) { | ||
466 | tmp = next; | ||
467 | next = tmp->next; | ||
468 | dentry = list_entry(tmp, struct dentry, d_lru); | ||
469 | if (dentry->d_sb != sb) | ||
470 | continue; | ||
471 | list_del(tmp); | ||
472 | list_add(tmp, &dentry_unused); | ||
473 | } | ||
474 | |||
475 | /* | ||
476 | * Pass two ... free the dentries for this superblock. | ||
477 | */ | ||
478 | repeat: | ||
479 | next = dentry_unused.next; | ||
480 | while (next != &dentry_unused) { | ||
481 | tmp = next; | ||
482 | next = tmp->next; | ||
483 | dentry = list_entry(tmp, struct dentry, d_lru); | ||
484 | if (dentry->d_sb != sb) | ||
485 | continue; | ||
486 | dentry_stat.nr_unused--; | ||
487 | list_del_init(tmp); | ||
488 | spin_lock(&dentry->d_lock); | ||
489 | if (atomic_read(&dentry->d_count)) { | ||
490 | spin_unlock(&dentry->d_lock); | ||
491 | continue; | ||
492 | } | ||
493 | prune_one_dentry(dentry); | ||
494 | goto repeat; | ||
495 | } | ||
496 | spin_unlock(&dcache_lock); | ||
497 | } | ||
498 | |||
499 | /* | ||
500 | * Search for at least 1 mount point in the dentry's subdirs. | ||
501 | * We descend to the next level whenever the d_subdirs | ||
502 | * list is non-empty and continue searching. | ||
503 | */ | ||
504 | |||
505 | /** | ||
506 | * have_submounts - check for mounts over a dentry | ||
507 | * @parent: dentry to check. | ||
508 | * | ||
509 | * Return true if the parent or its subdirectories contain | ||
510 | * a mount point | ||
511 | */ | ||
512 | |||
513 | int have_submounts(struct dentry *parent) | ||
514 | { | ||
515 | struct dentry *this_parent = parent; | ||
516 | struct list_head *next; | ||
517 | |||
518 | spin_lock(&dcache_lock); | ||
519 | if (d_mountpoint(parent)) | ||
520 | goto positive; | ||
521 | repeat: | ||
522 | next = this_parent->d_subdirs.next; | ||
523 | resume: | ||
524 | while (next != &this_parent->d_subdirs) { | ||
525 | struct list_head *tmp = next; | ||
526 | struct dentry *dentry = list_entry(tmp, struct dentry, d_child); | ||
527 | next = tmp->next; | ||
528 | /* Have we found a mount point ? */ | ||
529 | if (d_mountpoint(dentry)) | ||
530 | goto positive; | ||
531 | if (!list_empty(&dentry->d_subdirs)) { | ||
532 | this_parent = dentry; | ||
533 | goto repeat; | ||
534 | } | ||
535 | } | ||
536 | /* | ||
537 | * All done at this level ... ascend and resume the search. | ||
538 | */ | ||
539 | if (this_parent != parent) { | ||
540 | next = this_parent->d_child.next; | ||
541 | this_parent = this_parent->d_parent; | ||
542 | goto resume; | ||
543 | } | ||
544 | spin_unlock(&dcache_lock); | ||
545 | return 0; /* No mount points found in tree */ | ||
546 | positive: | ||
547 | spin_unlock(&dcache_lock); | ||
548 | return 1; | ||
549 | } | ||
550 | |||
551 | /* | ||
552 | * Search the dentry child list for the specified parent, | ||
553 | * and move any unused dentries to the end of the unused | ||
554 | * list for prune_dcache(). We descend to the next level | ||
555 | * whenever the d_subdirs list is non-empty and continue | ||
556 | * searching. | ||
557 | * | ||
558 | * It returns zero iff there are no unused children, | ||
559 | * otherwise it returns the number of children moved to | ||
560 | * the end of the unused list. This may not be the total | ||
561 | * number of unused children, because select_parent can | ||
562 | * drop the lock and return early due to latency | ||
563 | * constraints. | ||
564 | */ | ||
565 | static int select_parent(struct dentry * parent) | ||
566 | { | ||
567 | struct dentry *this_parent = parent; | ||
568 | struct list_head *next; | ||
569 | int found = 0; | ||
570 | |||
571 | spin_lock(&dcache_lock); | ||
572 | repeat: | ||
573 | next = this_parent->d_subdirs.next; | ||
574 | resume: | ||
575 | while (next != &this_parent->d_subdirs) { | ||
576 | struct list_head *tmp = next; | ||
577 | struct dentry *dentry = list_entry(tmp, struct dentry, d_child); | ||
578 | next = tmp->next; | ||
579 | |||
580 | if (!list_empty(&dentry->d_lru)) { | ||
581 | dentry_stat.nr_unused--; | ||
582 | list_del_init(&dentry->d_lru); | ||
583 | } | ||
584 | /* | ||
585 | * move only zero ref count dentries to the end | ||
586 | * of the unused list for prune_dcache | ||
587 | */ | ||
588 | if (!atomic_read(&dentry->d_count)) { | ||
589 | list_add(&dentry->d_lru, dentry_unused.prev); | ||
590 | dentry_stat.nr_unused++; | ||
591 | found++; | ||
592 | } | ||
593 | |||
594 | /* | ||
595 | * We can return to the caller if we have found some (this | ||
596 | * ensures forward progress). We'll be coming back to find | ||
597 | * the rest. | ||
598 | */ | ||
599 | if (found && need_resched()) | ||
600 | goto out; | ||
601 | |||
602 | /* | ||
603 | * Descend a level if the d_subdirs list is non-empty. | ||
604 | */ | ||
605 | if (!list_empty(&dentry->d_subdirs)) { | ||
606 | this_parent = dentry; | ||
607 | #ifdef DCACHE_DEBUG | ||
608 | printk(KERN_DEBUG "select_parent: descending to %s/%s, found=%d\n", | ||
609 | dentry->d_parent->d_name.name, dentry->d_name.name, found); | ||
610 | #endif | ||
611 | goto repeat; | ||
612 | } | ||
613 | } | ||
614 | /* | ||
615 | * All done at this level ... ascend and resume the search. | ||
616 | */ | ||
617 | if (this_parent != parent) { | ||
618 | next = this_parent->d_child.next; | ||
619 | this_parent = this_parent->d_parent; | ||
620 | #ifdef DCACHE_DEBUG | ||
621 | printk(KERN_DEBUG "select_parent: ascending to %s/%s, found=%d\n", | ||
622 | this_parent->d_parent->d_name.name, this_parent->d_name.name, found); | ||
623 | #endif | ||
624 | goto resume; | ||
625 | } | ||
626 | out: | ||
627 | spin_unlock(&dcache_lock); | ||
628 | return found; | ||
629 | } | ||
630 | |||
631 | /** | ||
632 | * shrink_dcache_parent - prune dcache | ||
633 | * @parent: parent of entries to prune | ||
634 | * | ||
635 | * Prune the dcache to remove unused children of the parent dentry. | ||
636 | */ | ||
637 | |||
638 | void shrink_dcache_parent(struct dentry * parent) | ||
639 | { | ||
640 | int found; | ||
641 | |||
642 | while ((found = select_parent(parent)) != 0) | ||
643 | prune_dcache(found); | ||
644 | } | ||
645 | |||
646 | /** | ||
647 | * shrink_dcache_anon - further prune the cache | ||
648 | * @head: head of d_hash list of dentries to prune | ||
649 | * | ||
650 | * Prune the dentries that are anonymous | ||
651 | * | ||
652 | * parsing d_hash list does not hlist_for_each_rcu() as it | ||
653 | * done under dcache_lock. | ||
654 | * | ||
655 | */ | ||
656 | void shrink_dcache_anon(struct hlist_head *head) | ||
657 | { | ||
658 | struct hlist_node *lp; | ||
659 | int found; | ||
660 | do { | ||
661 | found = 0; | ||
662 | spin_lock(&dcache_lock); | ||
663 | hlist_for_each(lp, head) { | ||
664 | struct dentry *this = hlist_entry(lp, struct dentry, d_hash); | ||
665 | if (!list_empty(&this->d_lru)) { | ||
666 | dentry_stat.nr_unused--; | ||
667 | list_del_init(&this->d_lru); | ||
668 | } | ||
669 | |||
670 | /* | ||
671 | * move only zero ref count dentries to the end | ||
672 | * of the unused list for prune_dcache | ||
673 | */ | ||
674 | if (!atomic_read(&this->d_count)) { | ||
675 | list_add_tail(&this->d_lru, &dentry_unused); | ||
676 | dentry_stat.nr_unused++; | ||
677 | found++; | ||
678 | } | ||
679 | } | ||
680 | spin_unlock(&dcache_lock); | ||
681 | prune_dcache(found); | ||
682 | } while(found); | ||
683 | } | ||
684 | |||
685 | /* | ||
686 | * Scan `nr' dentries and return the number which remain. | ||
687 | * | ||
688 | * We need to avoid reentering the filesystem if the caller is performing a | ||
689 | * GFP_NOFS allocation attempt. One example deadlock is: | ||
690 | * | ||
691 | * ext2_new_block->getblk->GFP->shrink_dcache_memory->prune_dcache-> | ||
692 | * prune_one_dentry->dput->dentry_iput->iput->inode->i_sb->s_op->put_inode-> | ||
693 | * ext2_discard_prealloc->ext2_free_blocks->lock_super->DEADLOCK. | ||
694 | * | ||
695 | * In this case we return -1 to tell the caller that we baled. | ||
696 | */ | ||
697 | static int shrink_dcache_memory(int nr, unsigned int gfp_mask) | ||
698 | { | ||
699 | if (nr) { | ||
700 | if (!(gfp_mask & __GFP_FS)) | ||
701 | return -1; | ||
702 | prune_dcache(nr); | ||
703 | } | ||
704 | return (dentry_stat.nr_unused / 100) * sysctl_vfs_cache_pressure; | ||
705 | } | ||
706 | |||
707 | /** | ||
708 | * d_alloc - allocate a dcache entry | ||
709 | * @parent: parent of entry to allocate | ||
710 | * @name: qstr of the name | ||
711 | * | ||
712 | * Allocates a dentry. It returns %NULL if there is insufficient memory | ||
713 | * available. On a success the dentry is returned. The name passed in is | ||
714 | * copied and the copy passed in may be reused after this call. | ||
715 | */ | ||
716 | |||
717 | struct dentry *d_alloc(struct dentry * parent, const struct qstr *name) | ||
718 | { | ||
719 | struct dentry *dentry; | ||
720 | char *dname; | ||
721 | |||
722 | dentry = kmem_cache_alloc(dentry_cache, GFP_KERNEL); | ||
723 | if (!dentry) | ||
724 | return NULL; | ||
725 | |||
726 | if (name->len > DNAME_INLINE_LEN-1) { | ||
727 | dname = kmalloc(name->len + 1, GFP_KERNEL); | ||
728 | if (!dname) { | ||
729 | kmem_cache_free(dentry_cache, dentry); | ||
730 | return NULL; | ||
731 | } | ||
732 | } else { | ||
733 | dname = dentry->d_iname; | ||
734 | } | ||
735 | dentry->d_name.name = dname; | ||
736 | |||
737 | dentry->d_name.len = name->len; | ||
738 | dentry->d_name.hash = name->hash; | ||
739 | memcpy(dname, name->name, name->len); | ||
740 | dname[name->len] = 0; | ||
741 | |||
742 | atomic_set(&dentry->d_count, 1); | ||
743 | dentry->d_flags = DCACHE_UNHASHED; | ||
744 | spin_lock_init(&dentry->d_lock); | ||
745 | dentry->d_inode = NULL; | ||
746 | dentry->d_parent = NULL; | ||
747 | dentry->d_sb = NULL; | ||
748 | dentry->d_op = NULL; | ||
749 | dentry->d_fsdata = NULL; | ||
750 | dentry->d_mounted = 0; | ||
751 | dentry->d_cookie = NULL; | ||
752 | INIT_HLIST_NODE(&dentry->d_hash); | ||
753 | INIT_LIST_HEAD(&dentry->d_lru); | ||
754 | INIT_LIST_HEAD(&dentry->d_subdirs); | ||
755 | INIT_LIST_HEAD(&dentry->d_alias); | ||
756 | |||
757 | if (parent) { | ||
758 | dentry->d_parent = dget(parent); | ||
759 | dentry->d_sb = parent->d_sb; | ||
760 | } else { | ||
761 | INIT_LIST_HEAD(&dentry->d_child); | ||
762 | } | ||
763 | |||
764 | spin_lock(&dcache_lock); | ||
765 | if (parent) | ||
766 | list_add(&dentry->d_child, &parent->d_subdirs); | ||
767 | dentry_stat.nr_dentry++; | ||
768 | spin_unlock(&dcache_lock); | ||
769 | |||
770 | return dentry; | ||
771 | } | ||
772 | |||
773 | struct dentry *d_alloc_name(struct dentry *parent, const char *name) | ||
774 | { | ||
775 | struct qstr q; | ||
776 | |||
777 | q.name = name; | ||
778 | q.len = strlen(name); | ||
779 | q.hash = full_name_hash(q.name, q.len); | ||
780 | return d_alloc(parent, &q); | ||
781 | } | ||
782 | |||
783 | /** | ||
784 | * d_instantiate - fill in inode information for a dentry | ||
785 | * @entry: dentry to complete | ||
786 | * @inode: inode to attach to this dentry | ||
787 | * | ||
788 | * Fill in inode information in the entry. | ||
789 | * | ||
790 | * This turns negative dentries into productive full members | ||
791 | * of society. | ||
792 | * | ||
793 | * NOTE! This assumes that the inode count has been incremented | ||
794 | * (or otherwise set) by the caller to indicate that it is now | ||
795 | * in use by the dcache. | ||
796 | */ | ||
797 | |||
798 | void d_instantiate(struct dentry *entry, struct inode * inode) | ||
799 | { | ||
800 | if (!list_empty(&entry->d_alias)) BUG(); | ||
801 | spin_lock(&dcache_lock); | ||
802 | if (inode) | ||
803 | list_add(&entry->d_alias, &inode->i_dentry); | ||
804 | entry->d_inode = inode; | ||
805 | spin_unlock(&dcache_lock); | ||
806 | security_d_instantiate(entry, inode); | ||
807 | } | ||
808 | |||
809 | /** | ||
810 | * d_instantiate_unique - instantiate a non-aliased dentry | ||
811 | * @entry: dentry to instantiate | ||
812 | * @inode: inode to attach to this dentry | ||
813 | * | ||
814 | * Fill in inode information in the entry. On success, it returns NULL. | ||
815 | * If an unhashed alias of "entry" already exists, then we return the | ||
816 | * aliased dentry instead. | ||
817 | * | ||
818 | * Note that in order to avoid conflicts with rename() etc, the caller | ||
819 | * had better be holding the parent directory semaphore. | ||
820 | */ | ||
821 | struct dentry *d_instantiate_unique(struct dentry *entry, struct inode *inode) | ||
822 | { | ||
823 | struct dentry *alias; | ||
824 | int len = entry->d_name.len; | ||
825 | const char *name = entry->d_name.name; | ||
826 | unsigned int hash = entry->d_name.hash; | ||
827 | |||
828 | BUG_ON(!list_empty(&entry->d_alias)); | ||
829 | spin_lock(&dcache_lock); | ||
830 | if (!inode) | ||
831 | goto do_negative; | ||
832 | list_for_each_entry(alias, &inode->i_dentry, d_alias) { | ||
833 | struct qstr *qstr = &alias->d_name; | ||
834 | |||
835 | if (qstr->hash != hash) | ||
836 | continue; | ||
837 | if (alias->d_parent != entry->d_parent) | ||
838 | continue; | ||
839 | if (qstr->len != len) | ||
840 | continue; | ||
841 | if (memcmp(qstr->name, name, len)) | ||
842 | continue; | ||
843 | dget_locked(alias); | ||
844 | spin_unlock(&dcache_lock); | ||
845 | BUG_ON(!d_unhashed(alias)); | ||
846 | return alias; | ||
847 | } | ||
848 | list_add(&entry->d_alias, &inode->i_dentry); | ||
849 | do_negative: | ||
850 | entry->d_inode = inode; | ||
851 | spin_unlock(&dcache_lock); | ||
852 | security_d_instantiate(entry, inode); | ||
853 | return NULL; | ||
854 | } | ||
855 | EXPORT_SYMBOL(d_instantiate_unique); | ||
856 | |||
857 | /** | ||
858 | * d_alloc_root - allocate root dentry | ||
859 | * @root_inode: inode to allocate the root for | ||
860 | * | ||
861 | * Allocate a root ("/") dentry for the inode given. The inode is | ||
862 | * instantiated and returned. %NULL is returned if there is insufficient | ||
863 | * memory or the inode passed is %NULL. | ||
864 | */ | ||
865 | |||
866 | struct dentry * d_alloc_root(struct inode * root_inode) | ||
867 | { | ||
868 | struct dentry *res = NULL; | ||
869 | |||
870 | if (root_inode) { | ||
871 | static const struct qstr name = { .name = "/", .len = 1 }; | ||
872 | |||
873 | res = d_alloc(NULL, &name); | ||
874 | if (res) { | ||
875 | res->d_sb = root_inode->i_sb; | ||
876 | res->d_parent = res; | ||
877 | d_instantiate(res, root_inode); | ||
878 | } | ||
879 | } | ||
880 | return res; | ||
881 | } | ||
882 | |||
883 | static inline struct hlist_head *d_hash(struct dentry *parent, | ||
884 | unsigned long hash) | ||
885 | { | ||
886 | hash += ((unsigned long) parent ^ GOLDEN_RATIO_PRIME) / L1_CACHE_BYTES; | ||
887 | hash = hash ^ ((hash ^ GOLDEN_RATIO_PRIME) >> D_HASHBITS); | ||
888 | return dentry_hashtable + (hash & D_HASHMASK); | ||
889 | } | ||
890 | |||
891 | /** | ||
892 | * d_alloc_anon - allocate an anonymous dentry | ||
893 | * @inode: inode to allocate the dentry for | ||
894 | * | ||
895 | * This is similar to d_alloc_root. It is used by filesystems when | ||
896 | * creating a dentry for a given inode, often in the process of | ||
897 | * mapping a filehandle to a dentry. The returned dentry may be | ||
898 | * anonymous, or may have a full name (if the inode was already | ||
899 | * in the cache). The file system may need to make further | ||
900 | * efforts to connect this dentry into the dcache properly. | ||
901 | * | ||
902 | * When called on a directory inode, we must ensure that | ||
903 | * the inode only ever has one dentry. If a dentry is | ||
904 | * found, that is returned instead of allocating a new one. | ||
905 | * | ||
906 | * On successful return, the reference to the inode has been transferred | ||
907 | * to the dentry. If %NULL is returned (indicating kmalloc failure), | ||
908 | * the reference on the inode has not been released. | ||
909 | */ | ||
910 | |||
911 | struct dentry * d_alloc_anon(struct inode *inode) | ||
912 | { | ||
913 | static const struct qstr anonstring = { .name = "" }; | ||
914 | struct dentry *tmp; | ||
915 | struct dentry *res; | ||
916 | |||
917 | if ((res = d_find_alias(inode))) { | ||
918 | iput(inode); | ||
919 | return res; | ||
920 | } | ||
921 | |||
922 | tmp = d_alloc(NULL, &anonstring); | ||
923 | if (!tmp) | ||
924 | return NULL; | ||
925 | |||
926 | tmp->d_parent = tmp; /* make sure dput doesn't croak */ | ||
927 | |||
928 | spin_lock(&dcache_lock); | ||
929 | res = __d_find_alias(inode, 0); | ||
930 | if (!res) { | ||
931 | /* attach a disconnected dentry */ | ||
932 | res = tmp; | ||
933 | tmp = NULL; | ||
934 | spin_lock(&res->d_lock); | ||
935 | res->d_sb = inode->i_sb; | ||
936 | res->d_parent = res; | ||
937 | res->d_inode = inode; | ||
938 | res->d_flags |= DCACHE_DISCONNECTED; | ||
939 | res->d_flags &= ~DCACHE_UNHASHED; | ||
940 | list_add(&res->d_alias, &inode->i_dentry); | ||
941 | hlist_add_head(&res->d_hash, &inode->i_sb->s_anon); | ||
942 | spin_unlock(&res->d_lock); | ||
943 | |||
944 | inode = NULL; /* don't drop reference */ | ||
945 | } | ||
946 | spin_unlock(&dcache_lock); | ||
947 | |||
948 | if (inode) | ||
949 | iput(inode); | ||
950 | if (tmp) | ||
951 | dput(tmp); | ||
952 | return res; | ||
953 | } | ||
954 | |||
955 | |||
956 | /** | ||
957 | * d_splice_alias - splice a disconnected dentry into the tree if one exists | ||
958 | * @inode: the inode which may have a disconnected dentry | ||
959 | * @dentry: a negative dentry which we want to point to the inode. | ||
960 | * | ||
961 | * If inode is a directory and has a 'disconnected' dentry (i.e. IS_ROOT and | ||
962 | * DCACHE_DISCONNECTED), then d_move that in place of the given dentry | ||
963 | * and return it, else simply d_add the inode to the dentry and return NULL. | ||
964 | * | ||
965 | * This is needed in the lookup routine of any filesystem that is exportable | ||
966 | * (via knfsd) so that we can build dcache paths to directories effectively. | ||
967 | * | ||
968 | * If a dentry was found and moved, then it is returned. Otherwise NULL | ||
969 | * is returned. This matches the expected return value of ->lookup. | ||
970 | * | ||
971 | */ | ||
972 | struct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry) | ||
973 | { | ||
974 | struct dentry *new = NULL; | ||
975 | |||
976 | if (inode) { | ||
977 | spin_lock(&dcache_lock); | ||
978 | new = __d_find_alias(inode, 1); | ||
979 | if (new) { | ||
980 | BUG_ON(!(new->d_flags & DCACHE_DISCONNECTED)); | ||
981 | spin_unlock(&dcache_lock); | ||
982 | security_d_instantiate(new, inode); | ||
983 | d_rehash(dentry); | ||
984 | d_move(new, dentry); | ||
985 | iput(inode); | ||
986 | } else { | ||
987 | /* d_instantiate takes dcache_lock, so we do it by hand */ | ||
988 | list_add(&dentry->d_alias, &inode->i_dentry); | ||
989 | dentry->d_inode = inode; | ||
990 | spin_unlock(&dcache_lock); | ||
991 | security_d_instantiate(dentry, inode); | ||
992 | d_rehash(dentry); | ||
993 | } | ||
994 | } else | ||
995 | d_add(dentry, inode); | ||
996 | return new; | ||
997 | } | ||
998 | |||
999 | |||
1000 | /** | ||
1001 | * d_lookup - search for a dentry | ||
1002 | * @parent: parent dentry | ||
1003 | * @name: qstr of name we wish to find | ||
1004 | * | ||
1005 | * Searches the children of the parent dentry for the name in question. If | ||
1006 | * the dentry is found its reference count is incremented and the dentry | ||
1007 | * is returned. The caller must use d_put to free the entry when it has | ||
1008 | * finished using it. %NULL is returned on failure. | ||
1009 | * | ||
1010 | * __d_lookup is dcache_lock free. The hash list is protected using RCU. | ||
1011 | * Memory barriers are used while updating and doing lockless traversal. | ||
1012 | * To avoid races with d_move while rename is happening, d_lock is used. | ||
1013 | * | ||
1014 | * Overflows in memcmp(), while d_move, are avoided by keeping the length | ||
1015 | * and name pointer in one structure pointed by d_qstr. | ||
1016 | * | ||
1017 | * rcu_read_lock() and rcu_read_unlock() are used to disable preemption while | ||
1018 | * lookup is going on. | ||
1019 | * | ||
1020 | * dentry_unused list is not updated even if lookup finds the required dentry | ||
1021 | * in there. It is updated in places such as prune_dcache, shrink_dcache_sb, | ||
1022 | * select_parent and __dget_locked. This laziness saves lookup from dcache_lock | ||
1023 | * acquisition. | ||
1024 | * | ||
1025 | * d_lookup() is protected against the concurrent renames in some unrelated | ||
1026 | * directory using the seqlockt_t rename_lock. | ||
1027 | */ | ||
1028 | |||
1029 | struct dentry * d_lookup(struct dentry * parent, struct qstr * name) | ||
1030 | { | ||
1031 | struct dentry * dentry = NULL; | ||
1032 | unsigned long seq; | ||
1033 | |||
1034 | do { | ||
1035 | seq = read_seqbegin(&rename_lock); | ||
1036 | dentry = __d_lookup(parent, name); | ||
1037 | if (dentry) | ||
1038 | break; | ||
1039 | } while (read_seqretry(&rename_lock, seq)); | ||
1040 | return dentry; | ||
1041 | } | ||
1042 | |||
1043 | struct dentry * __d_lookup(struct dentry * parent, struct qstr * name) | ||
1044 | { | ||
1045 | unsigned int len = name->len; | ||
1046 | unsigned int hash = name->hash; | ||
1047 | const unsigned char *str = name->name; | ||
1048 | struct hlist_head *head = d_hash(parent,hash); | ||
1049 | struct dentry *found = NULL; | ||
1050 | struct hlist_node *node; | ||
1051 | |||
1052 | rcu_read_lock(); | ||
1053 | |||
1054 | hlist_for_each_rcu(node, head) { | ||
1055 | struct dentry *dentry; | ||
1056 | struct qstr *qstr; | ||
1057 | |||
1058 | dentry = hlist_entry(node, struct dentry, d_hash); | ||
1059 | |||
1060 | if (dentry->d_name.hash != hash) | ||
1061 | continue; | ||
1062 | if (dentry->d_parent != parent) | ||
1063 | continue; | ||
1064 | |||
1065 | spin_lock(&dentry->d_lock); | ||
1066 | |||
1067 | /* | ||
1068 | * Recheck the dentry after taking the lock - d_move may have | ||
1069 | * changed things. Don't bother checking the hash because we're | ||
1070 | * about to compare the whole name anyway. | ||
1071 | */ | ||
1072 | if (dentry->d_parent != parent) | ||
1073 | goto next; | ||
1074 | |||
1075 | /* | ||
1076 | * It is safe to compare names since d_move() cannot | ||
1077 | * change the qstr (protected by d_lock). | ||
1078 | */ | ||
1079 | qstr = &dentry->d_name; | ||
1080 | if (parent->d_op && parent->d_op->d_compare) { | ||
1081 | if (parent->d_op->d_compare(parent, qstr, name)) | ||
1082 | goto next; | ||
1083 | } else { | ||
1084 | if (qstr->len != len) | ||
1085 | goto next; | ||
1086 | if (memcmp(qstr->name, str, len)) | ||
1087 | goto next; | ||
1088 | } | ||
1089 | |||
1090 | if (!d_unhashed(dentry)) { | ||
1091 | atomic_inc(&dentry->d_count); | ||
1092 | found = dentry; | ||
1093 | } | ||
1094 | spin_unlock(&dentry->d_lock); | ||
1095 | break; | ||
1096 | next: | ||
1097 | spin_unlock(&dentry->d_lock); | ||
1098 | } | ||
1099 | rcu_read_unlock(); | ||
1100 | |||
1101 | return found; | ||
1102 | } | ||
1103 | |||
1104 | /** | ||
1105 | * d_validate - verify dentry provided from insecure source | ||
1106 | * @dentry: The dentry alleged to be valid child of @dparent | ||
1107 | * @dparent: The parent dentry (known to be valid) | ||
1108 | * @hash: Hash of the dentry | ||
1109 | * @len: Length of the name | ||
1110 | * | ||
1111 | * An insecure source has sent us a dentry, here we verify it and dget() it. | ||
1112 | * This is used by ncpfs in its readdir implementation. | ||
1113 | * Zero is returned in the dentry is invalid. | ||
1114 | */ | ||
1115 | |||
1116 | int d_validate(struct dentry *dentry, struct dentry *dparent) | ||
1117 | { | ||
1118 | struct hlist_head *base; | ||
1119 | struct hlist_node *lhp; | ||
1120 | |||
1121 | /* Check whether the ptr might be valid at all.. */ | ||
1122 | if (!kmem_ptr_validate(dentry_cache, dentry)) | ||
1123 | goto out; | ||
1124 | |||
1125 | if (dentry->d_parent != dparent) | ||
1126 | goto out; | ||
1127 | |||
1128 | spin_lock(&dcache_lock); | ||
1129 | base = d_hash(dparent, dentry->d_name.hash); | ||
1130 | hlist_for_each(lhp,base) { | ||
1131 | /* hlist_for_each_rcu() not required for d_hash list | ||
1132 | * as it is parsed under dcache_lock | ||
1133 | */ | ||
1134 | if (dentry == hlist_entry(lhp, struct dentry, d_hash)) { | ||
1135 | __dget_locked(dentry); | ||
1136 | spin_unlock(&dcache_lock); | ||
1137 | return 1; | ||
1138 | } | ||
1139 | } | ||
1140 | spin_unlock(&dcache_lock); | ||
1141 | out: | ||
1142 | return 0; | ||
1143 | } | ||
1144 | |||
1145 | /* | ||
1146 | * When a file is deleted, we have two options: | ||
1147 | * - turn this dentry into a negative dentry | ||
1148 | * - unhash this dentry and free it. | ||
1149 | * | ||
1150 | * Usually, we want to just turn this into | ||
1151 | * a negative dentry, but if anybody else is | ||
1152 | * currently using the dentry or the inode | ||
1153 | * we can't do that and we fall back on removing | ||
1154 | * it from the hash queues and waiting for | ||
1155 | * it to be deleted later when it has no users | ||
1156 | */ | ||
1157 | |||
1158 | /** | ||
1159 | * d_delete - delete a dentry | ||
1160 | * @dentry: The dentry to delete | ||
1161 | * | ||
1162 | * Turn the dentry into a negative dentry if possible, otherwise | ||
1163 | * remove it from the hash queues so it can be deleted later | ||
1164 | */ | ||
1165 | |||
1166 | void d_delete(struct dentry * dentry) | ||
1167 | { | ||
1168 | /* | ||
1169 | * Are we the only user? | ||
1170 | */ | ||
1171 | spin_lock(&dcache_lock); | ||
1172 | spin_lock(&dentry->d_lock); | ||
1173 | if (atomic_read(&dentry->d_count) == 1) { | ||
1174 | dentry_iput(dentry); | ||
1175 | return; | ||
1176 | } | ||
1177 | |||
1178 | if (!d_unhashed(dentry)) | ||
1179 | __d_drop(dentry); | ||
1180 | |||
1181 | spin_unlock(&dentry->d_lock); | ||
1182 | spin_unlock(&dcache_lock); | ||
1183 | } | ||
1184 | |||
1185 | static void __d_rehash(struct dentry * entry, struct hlist_head *list) | ||
1186 | { | ||
1187 | |||
1188 | entry->d_flags &= ~DCACHE_UNHASHED; | ||
1189 | hlist_add_head_rcu(&entry->d_hash, list); | ||
1190 | } | ||
1191 | |||
1192 | /** | ||
1193 | * d_rehash - add an entry back to the hash | ||
1194 | * @entry: dentry to add to the hash | ||
1195 | * | ||
1196 | * Adds a dentry to the hash according to its name. | ||
1197 | */ | ||
1198 | |||
1199 | void d_rehash(struct dentry * entry) | ||
1200 | { | ||
1201 | struct hlist_head *list = d_hash(entry->d_parent, entry->d_name.hash); | ||
1202 | |||
1203 | spin_lock(&dcache_lock); | ||
1204 | spin_lock(&entry->d_lock); | ||
1205 | __d_rehash(entry, list); | ||
1206 | spin_unlock(&entry->d_lock); | ||
1207 | spin_unlock(&dcache_lock); | ||
1208 | } | ||
1209 | |||
1210 | #define do_switch(x,y) do { \ | ||
1211 | __typeof__ (x) __tmp = x; \ | ||
1212 | x = y; y = __tmp; } while (0) | ||
1213 | |||
1214 | /* | ||
1215 | * When switching names, the actual string doesn't strictly have to | ||
1216 | * be preserved in the target - because we're dropping the target | ||
1217 | * anyway. As such, we can just do a simple memcpy() to copy over | ||
1218 | * the new name before we switch. | ||
1219 | * | ||
1220 | * Note that we have to be a lot more careful about getting the hash | ||
1221 | * switched - we have to switch the hash value properly even if it | ||
1222 | * then no longer matches the actual (corrupted) string of the target. | ||
1223 | * The hash value has to match the hash queue that the dentry is on.. | ||
1224 | */ | ||
1225 | static void switch_names(struct dentry *dentry, struct dentry *target) | ||
1226 | { | ||
1227 | if (dname_external(target)) { | ||
1228 | if (dname_external(dentry)) { | ||
1229 | /* | ||
1230 | * Both external: swap the pointers | ||
1231 | */ | ||
1232 | do_switch(target->d_name.name, dentry->d_name.name); | ||
1233 | } else { | ||
1234 | /* | ||
1235 | * dentry:internal, target:external. Steal target's | ||
1236 | * storage and make target internal. | ||
1237 | */ | ||
1238 | dentry->d_name.name = target->d_name.name; | ||
1239 | target->d_name.name = target->d_iname; | ||
1240 | } | ||
1241 | } else { | ||
1242 | if (dname_external(dentry)) { | ||
1243 | /* | ||
1244 | * dentry:external, target:internal. Give dentry's | ||
1245 | * storage to target and make dentry internal | ||
1246 | */ | ||
1247 | memcpy(dentry->d_iname, target->d_name.name, | ||
1248 | target->d_name.len + 1); | ||
1249 | target->d_name.name = dentry->d_name.name; | ||
1250 | dentry->d_name.name = dentry->d_iname; | ||
1251 | } else { | ||
1252 | /* | ||
1253 | * Both are internal. Just copy target to dentry | ||
1254 | */ | ||
1255 | memcpy(dentry->d_iname, target->d_name.name, | ||
1256 | target->d_name.len + 1); | ||
1257 | } | ||
1258 | } | ||
1259 | } | ||
1260 | |||
1261 | /* | ||
1262 | * We cannibalize "target" when moving dentry on top of it, | ||
1263 | * because it's going to be thrown away anyway. We could be more | ||
1264 | * polite about it, though. | ||
1265 | * | ||
1266 | * This forceful removal will result in ugly /proc output if | ||
1267 | * somebody holds a file open that got deleted due to a rename. | ||
1268 | * We could be nicer about the deleted file, and let it show | ||
1269 | * up under the name it got deleted rather than the name that | ||
1270 | * deleted it. | ||
1271 | */ | ||
1272 | |||
1273 | /** | ||
1274 | * d_move - move a dentry | ||
1275 | * @dentry: entry to move | ||
1276 | * @target: new dentry | ||
1277 | * | ||
1278 | * Update the dcache to reflect the move of a file name. Negative | ||
1279 | * dcache entries should not be moved in this way. | ||
1280 | */ | ||
1281 | |||
1282 | void d_move(struct dentry * dentry, struct dentry * target) | ||
1283 | { | ||
1284 | struct hlist_head *list; | ||
1285 | |||
1286 | if (!dentry->d_inode) | ||
1287 | printk(KERN_WARNING "VFS: moving negative dcache entry\n"); | ||
1288 | |||
1289 | spin_lock(&dcache_lock); | ||
1290 | write_seqlock(&rename_lock); | ||
1291 | /* | ||
1292 | * XXXX: do we really need to take target->d_lock? | ||
1293 | */ | ||
1294 | if (target < dentry) { | ||
1295 | spin_lock(&target->d_lock); | ||
1296 | spin_lock(&dentry->d_lock); | ||
1297 | } else { | ||
1298 | spin_lock(&dentry->d_lock); | ||
1299 | spin_lock(&target->d_lock); | ||
1300 | } | ||
1301 | |||
1302 | /* Move the dentry to the target hash queue, if on different bucket */ | ||
1303 | if (dentry->d_flags & DCACHE_UNHASHED) | ||
1304 | goto already_unhashed; | ||
1305 | |||
1306 | hlist_del_rcu(&dentry->d_hash); | ||
1307 | |||
1308 | already_unhashed: | ||
1309 | list = d_hash(target->d_parent, target->d_name.hash); | ||
1310 | __d_rehash(dentry, list); | ||
1311 | |||
1312 | /* Unhash the target: dput() will then get rid of it */ | ||
1313 | __d_drop(target); | ||
1314 | |||
1315 | list_del(&dentry->d_child); | ||
1316 | list_del(&target->d_child); | ||
1317 | |||
1318 | /* Switch the names.. */ | ||
1319 | switch_names(dentry, target); | ||
1320 | do_switch(dentry->d_name.len, target->d_name.len); | ||
1321 | do_switch(dentry->d_name.hash, target->d_name.hash); | ||
1322 | |||
1323 | /* ... and switch the parents */ | ||
1324 | if (IS_ROOT(dentry)) { | ||
1325 | dentry->d_parent = target->d_parent; | ||
1326 | target->d_parent = target; | ||
1327 | INIT_LIST_HEAD(&target->d_child); | ||
1328 | } else { | ||
1329 | do_switch(dentry->d_parent, target->d_parent); | ||
1330 | |||
1331 | /* And add them back to the (new) parent lists */ | ||
1332 | list_add(&target->d_child, &target->d_parent->d_subdirs); | ||
1333 | } | ||
1334 | |||
1335 | list_add(&dentry->d_child, &dentry->d_parent->d_subdirs); | ||
1336 | spin_unlock(&target->d_lock); | ||
1337 | spin_unlock(&dentry->d_lock); | ||
1338 | write_sequnlock(&rename_lock); | ||
1339 | spin_unlock(&dcache_lock); | ||
1340 | } | ||
1341 | |||
1342 | /** | ||
1343 | * d_path - return the path of a dentry | ||
1344 | * @dentry: dentry to report | ||
1345 | * @vfsmnt: vfsmnt to which the dentry belongs | ||
1346 | * @root: root dentry | ||
1347 | * @rootmnt: vfsmnt to which the root dentry belongs | ||
1348 | * @buffer: buffer to return value in | ||
1349 | * @buflen: buffer length | ||
1350 | * | ||
1351 | * Convert a dentry into an ASCII path name. If the entry has been deleted | ||
1352 | * the string " (deleted)" is appended. Note that this is ambiguous. | ||
1353 | * | ||
1354 | * Returns the buffer or an error code if the path was too long. | ||
1355 | * | ||
1356 | * "buflen" should be positive. Caller holds the dcache_lock. | ||
1357 | */ | ||
1358 | static char * __d_path( struct dentry *dentry, struct vfsmount *vfsmnt, | ||
1359 | struct dentry *root, struct vfsmount *rootmnt, | ||
1360 | char *buffer, int buflen) | ||
1361 | { | ||
1362 | char * end = buffer+buflen; | ||
1363 | char * retval; | ||
1364 | int namelen; | ||
1365 | |||
1366 | *--end = '\0'; | ||
1367 | buflen--; | ||
1368 | if (!IS_ROOT(dentry) && d_unhashed(dentry)) { | ||
1369 | buflen -= 10; | ||
1370 | end -= 10; | ||
1371 | if (buflen < 0) | ||
1372 | goto Elong; | ||
1373 | memcpy(end, " (deleted)", 10); | ||
1374 | } | ||
1375 | |||
1376 | if (buflen < 1) | ||
1377 | goto Elong; | ||
1378 | /* Get '/' right */ | ||
1379 | retval = end-1; | ||
1380 | *retval = '/'; | ||
1381 | |||
1382 | for (;;) { | ||
1383 | struct dentry * parent; | ||
1384 | |||
1385 | if (dentry == root && vfsmnt == rootmnt) | ||
1386 | break; | ||
1387 | if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) { | ||
1388 | /* Global root? */ | ||
1389 | spin_lock(&vfsmount_lock); | ||
1390 | if (vfsmnt->mnt_parent == vfsmnt) { | ||
1391 | spin_unlock(&vfsmount_lock); | ||
1392 | goto global_root; | ||
1393 | } | ||
1394 | dentry = vfsmnt->mnt_mountpoint; | ||
1395 | vfsmnt = vfsmnt->mnt_parent; | ||
1396 | spin_unlock(&vfsmount_lock); | ||
1397 | continue; | ||
1398 | } | ||
1399 | parent = dentry->d_parent; | ||
1400 | prefetch(parent); | ||
1401 | namelen = dentry->d_name.len; | ||
1402 | buflen -= namelen + 1; | ||
1403 | if (buflen < 0) | ||
1404 | goto Elong; | ||
1405 | end -= namelen; | ||
1406 | memcpy(end, dentry->d_name.name, namelen); | ||
1407 | *--end = '/'; | ||
1408 | retval = end; | ||
1409 | dentry = parent; | ||
1410 | } | ||
1411 | |||
1412 | return retval; | ||
1413 | |||
1414 | global_root: | ||
1415 | namelen = dentry->d_name.len; | ||
1416 | buflen -= namelen; | ||
1417 | if (buflen < 0) | ||
1418 | goto Elong; | ||
1419 | retval -= namelen-1; /* hit the slash */ | ||
1420 | memcpy(retval, dentry->d_name.name, namelen); | ||
1421 | return retval; | ||
1422 | Elong: | ||
1423 | return ERR_PTR(-ENAMETOOLONG); | ||
1424 | } | ||
1425 | |||
1426 | /* write full pathname into buffer and return start of pathname */ | ||
1427 | char * d_path(struct dentry *dentry, struct vfsmount *vfsmnt, | ||
1428 | char *buf, int buflen) | ||
1429 | { | ||
1430 | char *res; | ||
1431 | struct vfsmount *rootmnt; | ||
1432 | struct dentry *root; | ||
1433 | |||
1434 | read_lock(¤t->fs->lock); | ||
1435 | rootmnt = mntget(current->fs->rootmnt); | ||
1436 | root = dget(current->fs->root); | ||
1437 | read_unlock(¤t->fs->lock); | ||
1438 | spin_lock(&dcache_lock); | ||
1439 | res = __d_path(dentry, vfsmnt, root, rootmnt, buf, buflen); | ||
1440 | spin_unlock(&dcache_lock); | ||
1441 | dput(root); | ||
1442 | mntput(rootmnt); | ||
1443 | return res; | ||
1444 | } | ||
1445 | |||
1446 | /* | ||
1447 | * NOTE! The user-level library version returns a | ||
1448 | * character pointer. The kernel system call just | ||
1449 | * returns the length of the buffer filled (which | ||
1450 | * includes the ending '\0' character), or a negative | ||
1451 | * error value. So libc would do something like | ||
1452 | * | ||
1453 | * char *getcwd(char * buf, size_t size) | ||
1454 | * { | ||
1455 | * int retval; | ||
1456 | * | ||
1457 | * retval = sys_getcwd(buf, size); | ||
1458 | * if (retval >= 0) | ||
1459 | * return buf; | ||
1460 | * errno = -retval; | ||
1461 | * return NULL; | ||
1462 | * } | ||
1463 | */ | ||
1464 | asmlinkage long sys_getcwd(char __user *buf, unsigned long size) | ||
1465 | { | ||
1466 | int error; | ||
1467 | struct vfsmount *pwdmnt, *rootmnt; | ||
1468 | struct dentry *pwd, *root; | ||
1469 | char *page = (char *) __get_free_page(GFP_USER); | ||
1470 | |||
1471 | if (!page) | ||
1472 | return -ENOMEM; | ||
1473 | |||
1474 | read_lock(¤t->fs->lock); | ||
1475 | pwdmnt = mntget(current->fs->pwdmnt); | ||
1476 | pwd = dget(current->fs->pwd); | ||
1477 | rootmnt = mntget(current->fs->rootmnt); | ||
1478 | root = dget(current->fs->root); | ||
1479 | read_unlock(¤t->fs->lock); | ||
1480 | |||
1481 | error = -ENOENT; | ||
1482 | /* Has the current directory has been unlinked? */ | ||
1483 | spin_lock(&dcache_lock); | ||
1484 | if (pwd->d_parent == pwd || !d_unhashed(pwd)) { | ||
1485 | unsigned long len; | ||
1486 | char * cwd; | ||
1487 | |||
1488 | cwd = __d_path(pwd, pwdmnt, root, rootmnt, page, PAGE_SIZE); | ||
1489 | spin_unlock(&dcache_lock); | ||
1490 | |||
1491 | error = PTR_ERR(cwd); | ||
1492 | if (IS_ERR(cwd)) | ||
1493 | goto out; | ||
1494 | |||
1495 | error = -ERANGE; | ||
1496 | len = PAGE_SIZE + page - cwd; | ||
1497 | if (len <= size) { | ||
1498 | error = len; | ||
1499 | if (copy_to_user(buf, cwd, len)) | ||
1500 | error = -EFAULT; | ||
1501 | } | ||
1502 | } else | ||
1503 | spin_unlock(&dcache_lock); | ||
1504 | |||
1505 | out: | ||
1506 | dput(pwd); | ||
1507 | mntput(pwdmnt); | ||
1508 | dput(root); | ||
1509 | mntput(rootmnt); | ||
1510 | free_page((unsigned long) page); | ||
1511 | return error; | ||
1512 | } | ||
1513 | |||
1514 | /* | ||
1515 | * Test whether new_dentry is a subdirectory of old_dentry. | ||
1516 | * | ||
1517 | * Trivially implemented using the dcache structure | ||
1518 | */ | ||
1519 | |||
1520 | /** | ||
1521 | * is_subdir - is new dentry a subdirectory of old_dentry | ||
1522 | * @new_dentry: new dentry | ||
1523 | * @old_dentry: old dentry | ||
1524 | * | ||
1525 | * Returns 1 if new_dentry is a subdirectory of the parent (at any depth). | ||
1526 | * Returns 0 otherwise. | ||
1527 | * Caller must ensure that "new_dentry" is pinned before calling is_subdir() | ||
1528 | */ | ||
1529 | |||
1530 | int is_subdir(struct dentry * new_dentry, struct dentry * old_dentry) | ||
1531 | { | ||
1532 | int result; | ||
1533 | struct dentry * saved = new_dentry; | ||
1534 | unsigned long seq; | ||
1535 | |||
1536 | /* need rcu_readlock to protect against the d_parent trashing due to | ||
1537 | * d_move | ||
1538 | */ | ||
1539 | rcu_read_lock(); | ||
1540 | do { | ||
1541 | /* for restarting inner loop in case of seq retry */ | ||
1542 | new_dentry = saved; | ||
1543 | result = 0; | ||
1544 | seq = read_seqbegin(&rename_lock); | ||
1545 | for (;;) { | ||
1546 | if (new_dentry != old_dentry) { | ||
1547 | struct dentry * parent = new_dentry->d_parent; | ||
1548 | if (parent == new_dentry) | ||
1549 | break; | ||
1550 | new_dentry = parent; | ||
1551 | continue; | ||
1552 | } | ||
1553 | result = 1; | ||
1554 | break; | ||
1555 | } | ||
1556 | } while (read_seqretry(&rename_lock, seq)); | ||
1557 | rcu_read_unlock(); | ||
1558 | |||
1559 | return result; | ||
1560 | } | ||
1561 | |||
1562 | void d_genocide(struct dentry *root) | ||
1563 | { | ||
1564 | struct dentry *this_parent = root; | ||
1565 | struct list_head *next; | ||
1566 | |||
1567 | spin_lock(&dcache_lock); | ||
1568 | repeat: | ||
1569 | next = this_parent->d_subdirs.next; | ||
1570 | resume: | ||
1571 | while (next != &this_parent->d_subdirs) { | ||
1572 | struct list_head *tmp = next; | ||
1573 | struct dentry *dentry = list_entry(tmp, struct dentry, d_child); | ||
1574 | next = tmp->next; | ||
1575 | if (d_unhashed(dentry)||!dentry->d_inode) | ||
1576 | continue; | ||
1577 | if (!list_empty(&dentry->d_subdirs)) { | ||
1578 | this_parent = dentry; | ||
1579 | goto repeat; | ||
1580 | } | ||
1581 | atomic_dec(&dentry->d_count); | ||
1582 | } | ||
1583 | if (this_parent != root) { | ||
1584 | next = this_parent->d_child.next; | ||
1585 | atomic_dec(&this_parent->d_count); | ||
1586 | this_parent = this_parent->d_parent; | ||
1587 | goto resume; | ||
1588 | } | ||
1589 | spin_unlock(&dcache_lock); | ||
1590 | } | ||
1591 | |||
1592 | /** | ||
1593 | * find_inode_number - check for dentry with name | ||
1594 | * @dir: directory to check | ||
1595 | * @name: Name to find. | ||
1596 | * | ||
1597 | * Check whether a dentry already exists for the given name, | ||
1598 | * and return the inode number if it has an inode. Otherwise | ||
1599 | * 0 is returned. | ||
1600 | * | ||
1601 | * This routine is used to post-process directory listings for | ||
1602 | * filesystems using synthetic inode numbers, and is necessary | ||
1603 | * to keep getcwd() working. | ||
1604 | */ | ||
1605 | |||
1606 | ino_t find_inode_number(struct dentry *dir, struct qstr *name) | ||
1607 | { | ||
1608 | struct dentry * dentry; | ||
1609 | ino_t ino = 0; | ||
1610 | |||
1611 | /* | ||
1612 | * Check for a fs-specific hash function. Note that we must | ||
1613 | * calculate the standard hash first, as the d_op->d_hash() | ||
1614 | * routine may choose to leave the hash value unchanged. | ||
1615 | */ | ||
1616 | name->hash = full_name_hash(name->name, name->len); | ||
1617 | if (dir->d_op && dir->d_op->d_hash) | ||
1618 | { | ||
1619 | if (dir->d_op->d_hash(dir, name) != 0) | ||
1620 | goto out; | ||
1621 | } | ||
1622 | |||
1623 | dentry = d_lookup(dir, name); | ||
1624 | if (dentry) | ||
1625 | { | ||
1626 | if (dentry->d_inode) | ||
1627 | ino = dentry->d_inode->i_ino; | ||
1628 | dput(dentry); | ||
1629 | } | ||
1630 | out: | ||
1631 | return ino; | ||
1632 | } | ||
1633 | |||
1634 | static __initdata unsigned long dhash_entries; | ||
1635 | static int __init set_dhash_entries(char *str) | ||
1636 | { | ||
1637 | if (!str) | ||
1638 | return 0; | ||
1639 | dhash_entries = simple_strtoul(str, &str, 0); | ||
1640 | return 1; | ||
1641 | } | ||
1642 | __setup("dhash_entries=", set_dhash_entries); | ||
1643 | |||
1644 | static void __init dcache_init_early(void) | ||
1645 | { | ||
1646 | int loop; | ||
1647 | |||
1648 | /* If hashes are distributed across NUMA nodes, defer | ||
1649 | * hash allocation until vmalloc space is available. | ||
1650 | */ | ||
1651 | if (hashdist) | ||
1652 | return; | ||
1653 | |||
1654 | dentry_hashtable = | ||
1655 | alloc_large_system_hash("Dentry cache", | ||
1656 | sizeof(struct hlist_head), | ||
1657 | dhash_entries, | ||
1658 | 13, | ||
1659 | HASH_EARLY, | ||
1660 | &d_hash_shift, | ||
1661 | &d_hash_mask, | ||
1662 | 0); | ||
1663 | |||
1664 | for (loop = 0; loop < (1 << d_hash_shift); loop++) | ||
1665 | INIT_HLIST_HEAD(&dentry_hashtable[loop]); | ||
1666 | } | ||
1667 | |||
1668 | static void __init dcache_init(unsigned long mempages) | ||
1669 | { | ||
1670 | int loop; | ||
1671 | |||
1672 | /* | ||
1673 | * A constructor could be added for stable state like the lists, | ||
1674 | * but it is probably not worth it because of the cache nature | ||
1675 | * of the dcache. | ||
1676 | */ | ||
1677 | dentry_cache = kmem_cache_create("dentry_cache", | ||
1678 | sizeof(struct dentry), | ||
1679 | 0, | ||
1680 | SLAB_RECLAIM_ACCOUNT|SLAB_PANIC, | ||
1681 | NULL, NULL); | ||
1682 | |||
1683 | set_shrinker(DEFAULT_SEEKS, shrink_dcache_memory); | ||
1684 | |||
1685 | /* Hash may have been set up in dcache_init_early */ | ||
1686 | if (!hashdist) | ||
1687 | return; | ||
1688 | |||
1689 | dentry_hashtable = | ||
1690 | alloc_large_system_hash("Dentry cache", | ||
1691 | sizeof(struct hlist_head), | ||
1692 | dhash_entries, | ||
1693 | 13, | ||
1694 | 0, | ||
1695 | &d_hash_shift, | ||
1696 | &d_hash_mask, | ||
1697 | 0); | ||
1698 | |||
1699 | for (loop = 0; loop < (1 << d_hash_shift); loop++) | ||
1700 | INIT_HLIST_HEAD(&dentry_hashtable[loop]); | ||
1701 | } | ||
1702 | |||
1703 | /* SLAB cache for __getname() consumers */ | ||
1704 | kmem_cache_t *names_cachep; | ||
1705 | |||
1706 | /* SLAB cache for file structures */ | ||
1707 | kmem_cache_t *filp_cachep; | ||
1708 | |||
1709 | EXPORT_SYMBOL(d_genocide); | ||
1710 | |||
1711 | extern void bdev_cache_init(void); | ||
1712 | extern void chrdev_init(void); | ||
1713 | |||
1714 | void __init vfs_caches_init_early(void) | ||
1715 | { | ||
1716 | dcache_init_early(); | ||
1717 | inode_init_early(); | ||
1718 | } | ||
1719 | |||
1720 | void __init vfs_caches_init(unsigned long mempages) | ||
1721 | { | ||
1722 | unsigned long reserve; | ||
1723 | |||
1724 | /* Base hash sizes on available memory, with a reserve equal to | ||
1725 | 150% of current kernel size */ | ||
1726 | |||
1727 | reserve = min((mempages - nr_free_pages()) * 3/2, mempages - 1); | ||
1728 | mempages -= reserve; | ||
1729 | |||
1730 | names_cachep = kmem_cache_create("names_cache", PATH_MAX, 0, | ||
1731 | SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); | ||
1732 | |||
1733 | filp_cachep = kmem_cache_create("filp", sizeof(struct file), 0, | ||
1734 | SLAB_HWCACHE_ALIGN|SLAB_PANIC, filp_ctor, filp_dtor); | ||
1735 | |||
1736 | dcache_init(mempages); | ||
1737 | inode_init(mempages); | ||
1738 | files_init(mempages); | ||
1739 | mnt_init(mempages); | ||
1740 | bdev_cache_init(); | ||
1741 | chrdev_init(); | ||
1742 | } | ||
1743 | |||
1744 | EXPORT_SYMBOL(d_alloc); | ||
1745 | EXPORT_SYMBOL(d_alloc_anon); | ||
1746 | EXPORT_SYMBOL(d_alloc_root); | ||
1747 | EXPORT_SYMBOL(d_delete); | ||
1748 | EXPORT_SYMBOL(d_find_alias); | ||
1749 | EXPORT_SYMBOL(d_instantiate); | ||
1750 | EXPORT_SYMBOL(d_invalidate); | ||
1751 | EXPORT_SYMBOL(d_lookup); | ||
1752 | EXPORT_SYMBOL(d_move); | ||
1753 | EXPORT_SYMBOL(d_path); | ||
1754 | EXPORT_SYMBOL(d_prune_aliases); | ||
1755 | EXPORT_SYMBOL(d_rehash); | ||
1756 | EXPORT_SYMBOL(d_splice_alias); | ||
1757 | EXPORT_SYMBOL(d_validate); | ||
1758 | EXPORT_SYMBOL(dget_locked); | ||
1759 | EXPORT_SYMBOL(dput); | ||
1760 | EXPORT_SYMBOL(find_inode_number); | ||
1761 | EXPORT_SYMBOL(have_submounts); | ||
1762 | EXPORT_SYMBOL(names_cachep); | ||
1763 | EXPORT_SYMBOL(shrink_dcache_parent); | ||
1764 | EXPORT_SYMBOL(shrink_dcache_sb); | ||