1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#include <linux/syscalls.h>
18#include <linux/string.h>
19#include <linux/mm.h>
20#include <linux/fs.h>
21#include <linux/fsnotify.h>
22#include <linux/slab.h>
23#include <linux/init.h>
24#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>
34#include <linux/fs_struct.h>
35#include <linux/hardirq.h>
36#include <linux/bit_spinlock.h>
37#include <linux/rculist_bl.h>
38#include <linux/prefetch.h>
39#include <linux/ratelimit.h>
40#include "internal.h"
41#include "mount.h"
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81int sysctl_vfs_cache_pressure __read_mostly = 100;
82EXPORT_SYMBOL_GPL(sysctl_vfs_cache_pressure);
83
84static __cacheline_aligned_in_smp DEFINE_SPINLOCK(dcache_lru_lock);
85__cacheline_aligned_in_smp DEFINE_SEQLOCK(rename_lock);
86
87EXPORT_SYMBOL(rename_lock);
88
89static struct kmem_cache *dentry_cache __read_mostly;
90
91
92
93
94
95
96
97
98
99#define D_HASHBITS d_hash_shift
100#define D_HASHMASK d_hash_mask
101
102static unsigned int d_hash_mask __read_mostly;
103static unsigned int d_hash_shift __read_mostly;
104
105static struct hlist_bl_head *dentry_hashtable __read_mostly;
106
107static inline struct hlist_bl_head *d_hash(const struct dentry *parent,
108 unsigned long hash)
109{
110 hash += ((unsigned long) parent ^ GOLDEN_RATIO_PRIME) / L1_CACHE_BYTES;
111 hash = hash ^ ((hash ^ GOLDEN_RATIO_PRIME) >> D_HASHBITS);
112 return dentry_hashtable + (hash & D_HASHMASK);
113}
114
115
116struct dentry_stat_t dentry_stat = {
117 .age_limit = 45,
118};
119
120static DEFINE_PER_CPU(unsigned int, nr_dentry);
121
122#if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS)
123static int get_nr_dentry(void)
124{
125 int i;
126 int sum = 0;
127 for_each_possible_cpu(i)
128 sum += per_cpu(nr_dentry, i);
129 return sum < 0 ? 0 : sum;
130}
131
132int proc_nr_dentry(ctl_table *table, int write, void __user *buffer,
133 size_t *lenp, loff_t *ppos)
134{
135 dentry_stat.nr_dentry = get_nr_dentry();
136 return proc_dointvec(table, write, buffer, lenp, ppos);
137}
138#endif
139
140
141
142
143
144static inline int dentry_cmp(const unsigned char *cs, size_t scount,
145 const unsigned char *ct, size_t tcount)
146{
147 if (scount != tcount)
148 return 1;
149
150 do {
151 if (*cs != *ct)
152 return 1;
153 cs++;
154 ct++;
155 tcount--;
156 } while (tcount);
157 return 0;
158}
159
160static void __d_free(struct rcu_head *head)
161{
162 struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu);
163
164 WARN_ON(!list_empty(&dentry->d_alias));
165 if (dname_external(dentry))
166 kfree(dentry->d_name.name);
167 kmem_cache_free(dentry_cache, dentry);
168}
169
170
171
172
173static void d_free(struct dentry *dentry)
174{
175 BUG_ON(dentry->d_count);
176 this_cpu_dec(nr_dentry);
177 if (dentry->d_op && dentry->d_op->d_release)
178 dentry->d_op->d_release(dentry);
179
180
181 if (!(dentry->d_flags & DCACHE_RCUACCESS))
182 __d_free(&dentry->d_u.d_rcu);
183 else
184 call_rcu(&dentry->d_u.d_rcu, __d_free);
185}
186
187
188
189
190
191
192
193
194static inline void dentry_rcuwalk_barrier(struct dentry *dentry)
195{
196 assert_spin_locked(&dentry->d_lock);
197
198 write_seqcount_barrier(&dentry->d_seq);
199}
200
201
202
203
204
205
206static void dentry_iput(struct dentry * dentry)
207 __releases(dentry->d_lock)
208 __releases(dentry->d_inode->i_lock)
209{
210 struct inode *inode = dentry->d_inode;
211 if (inode) {
212 dentry->d_inode = NULL;
213 list_del_init(&dentry->d_alias);
214 spin_unlock(&dentry->d_lock);
215 spin_unlock(&inode->i_lock);
216 if (!inode->i_nlink)
217 fsnotify_inoderemove(inode);
218 if (dentry->d_op && dentry->d_op->d_iput)
219 dentry->d_op->d_iput(dentry, inode);
220 else
221 iput(inode);
222 } else {
223 spin_unlock(&dentry->d_lock);
224 }
225}
226
227
228
229
230
231static void dentry_unlink_inode(struct dentry * dentry)
232 __releases(dentry->d_lock)
233 __releases(dentry->d_inode->i_lock)
234{
235 struct inode *inode = dentry->d_inode;
236 dentry->d_inode = NULL;
237 list_del_init(&dentry->d_alias);
238 dentry_rcuwalk_barrier(dentry);
239 spin_unlock(&dentry->d_lock);
240 spin_unlock(&inode->i_lock);
241 if (!inode->i_nlink)
242 fsnotify_inoderemove(inode);
243 if (dentry->d_op && dentry->d_op->d_iput)
244 dentry->d_op->d_iput(dentry, inode);
245 else
246 iput(inode);
247}
248
249
250
251
252static void dentry_lru_add(struct dentry *dentry)
253{
254 if (list_empty(&dentry->d_lru)) {
255 spin_lock(&dcache_lru_lock);
256 list_add(&dentry->d_lru, &dentry->d_sb->s_dentry_lru);
257 dentry->d_sb->s_nr_dentry_unused++;
258 dentry_stat.nr_unused++;
259 spin_unlock(&dcache_lru_lock);
260 }
261}
262
263static void __dentry_lru_del(struct dentry *dentry)
264{
265 list_del_init(&dentry->d_lru);
266 dentry->d_flags &= ~DCACHE_SHRINK_LIST;
267 dentry->d_sb->s_nr_dentry_unused--;
268 dentry_stat.nr_unused--;
269}
270
271
272
273
274static void dentry_lru_del(struct dentry *dentry)
275{
276 if (!list_empty(&dentry->d_lru)) {
277 spin_lock(&dcache_lru_lock);
278 __dentry_lru_del(dentry);
279 spin_unlock(&dcache_lru_lock);
280 }
281}
282
283
284
285
286
287
288static void dentry_lru_prune(struct dentry *dentry)
289{
290 if (!list_empty(&dentry->d_lru)) {
291 if (dentry->d_flags & DCACHE_OP_PRUNE)
292 dentry->d_op->d_prune(dentry);
293
294 spin_lock(&dcache_lru_lock);
295 __dentry_lru_del(dentry);
296 spin_unlock(&dcache_lru_lock);
297 }
298}
299
300static void dentry_lru_move_list(struct dentry *dentry, struct list_head *list)
301{
302 spin_lock(&dcache_lru_lock);
303 if (list_empty(&dentry->d_lru)) {
304 list_add_tail(&dentry->d_lru, list);
305 dentry->d_sb->s_nr_dentry_unused++;
306 dentry_stat.nr_unused++;
307 } else {
308 list_move_tail(&dentry->d_lru, list);
309 }
310 spin_unlock(&dcache_lru_lock);
311}
312
313
314
315
316
317
318
319
320
321
322
323
324
325static struct dentry *d_kill(struct dentry *dentry, struct dentry *parent)
326 __releases(dentry->d_lock)
327 __releases(parent->d_lock)
328 __releases(dentry->d_inode->i_lock)
329{
330 list_del(&dentry->d_u.d_child);
331
332
333
334
335 dentry->d_flags |= DCACHE_DISCONNECTED;
336 if (parent)
337 spin_unlock(&parent->d_lock);
338 dentry_iput(dentry);
339
340
341
342
343 d_free(dentry);
344 return parent;
345}
346
347
348
349
350
351
352static void __d_shrink(struct dentry *dentry)
353{
354 if (!d_unhashed(dentry)) {
355 struct hlist_bl_head *b;
356 if (unlikely(dentry->d_flags & DCACHE_DISCONNECTED))
357 b = &dentry->d_sb->s_anon;
358 else
359 b = d_hash(dentry->d_parent, dentry->d_name.hash);
360
361 hlist_bl_lock(b);
362 __hlist_bl_del(&dentry->d_hash);
363 dentry->d_hash.pprev = NULL;
364 hlist_bl_unlock(b);
365 }
366}
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383void __d_drop(struct dentry *dentry)
384{
385 if (!d_unhashed(dentry)) {
386 __d_shrink(dentry);
387 dentry_rcuwalk_barrier(dentry);
388 }
389}
390EXPORT_SYMBOL(__d_drop);
391
392void d_drop(struct dentry *dentry)
393{
394 spin_lock(&dentry->d_lock);
395 __d_drop(dentry);
396 spin_unlock(&dentry->d_lock);
397}
398EXPORT_SYMBOL(d_drop);
399
400
401
402
403
404
405
406
407
408
409void d_clear_need_lookup(struct dentry *dentry)
410{
411 spin_lock(&dentry->d_lock);
412 __d_drop(dentry);
413 dentry->d_flags &= ~DCACHE_NEED_LOOKUP;
414 spin_unlock(&dentry->d_lock);
415}
416EXPORT_SYMBOL(d_clear_need_lookup);
417
418
419
420
421
422
423
424static inline struct dentry *dentry_kill(struct dentry *dentry, int ref)
425 __releases(dentry->d_lock)
426{
427 struct inode *inode;
428 struct dentry *parent;
429
430 inode = dentry->d_inode;
431 if (inode && !spin_trylock(&inode->i_lock)) {
432relock:
433 spin_unlock(&dentry->d_lock);
434 cpu_relax();
435 return dentry;
436 }
437 if (IS_ROOT(dentry))
438 parent = NULL;
439 else
440 parent = dentry->d_parent;
441 if (parent && !spin_trylock(&parent->d_lock)) {
442 if (inode)
443 spin_unlock(&inode->i_lock);
444 goto relock;
445 }
446
447 if (ref)
448 dentry->d_count--;
449
450
451
452
453
454 dentry_lru_prune(dentry);
455
456 __d_drop(dentry);
457 return d_kill(dentry, parent);
458}
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486void dput(struct dentry *dentry)
487{
488 if (!dentry)
489 return;
490
491repeat:
492 if (dentry->d_count == 1)
493 might_sleep();
494 spin_lock(&dentry->d_lock);
495 BUG_ON(!dentry->d_count);
496 if (dentry->d_count > 1) {
497 dentry->d_count--;
498 spin_unlock(&dentry->d_lock);
499 return;
500 }
501
502 if (dentry->d_flags & DCACHE_OP_DELETE) {
503 if (dentry->d_op->d_delete(dentry))
504 goto kill_it;
505 }
506
507
508 if (d_unhashed(dentry))
509 goto kill_it;
510
511
512
513
514
515
516 if (!d_need_lookup(dentry))
517 dentry->d_flags |= DCACHE_REFERENCED;
518 dentry_lru_add(dentry);
519
520 dentry->d_count--;
521 spin_unlock(&dentry->d_lock);
522 return;
523
524kill_it:
525 dentry = dentry_kill(dentry, 1);
526 if (dentry)
527 goto repeat;
528}
529EXPORT_SYMBOL(dput);
530
531
532
533
534
535
536
537
538
539
540
541
542
543int d_invalidate(struct dentry * dentry)
544{
545
546
547
548 spin_lock(&dentry->d_lock);
549 if (d_unhashed(dentry)) {
550 spin_unlock(&dentry->d_lock);
551 return 0;
552 }
553
554
555
556
557 if (!list_empty(&dentry->d_subdirs)) {
558 spin_unlock(&dentry->d_lock);
559 shrink_dcache_parent(dentry);
560 spin_lock(&dentry->d_lock);
561 }
562
563
564
565
566
567
568
569
570
571
572
573
574
575 if (dentry->d_count > 1 && dentry->d_inode) {
576 if (S_ISDIR(dentry->d_inode->i_mode) || d_mountpoint(dentry)) {
577 spin_unlock(&dentry->d_lock);
578 return -EBUSY;
579 }
580 }
581
582 __d_drop(dentry);
583 spin_unlock(&dentry->d_lock);
584 return 0;
585}
586EXPORT_SYMBOL(d_invalidate);
587
588
589static inline void __dget_dlock(struct dentry *dentry)
590{
591 dentry->d_count++;
592}
593
594static inline void __dget(struct dentry *dentry)
595{
596 spin_lock(&dentry->d_lock);
597 __dget_dlock(dentry);
598 spin_unlock(&dentry->d_lock);
599}
600
601struct dentry *dget_parent(struct dentry *dentry)
602{
603 struct dentry *ret;
604
605repeat:
606
607
608
609
610 rcu_read_lock();
611 ret = dentry->d_parent;
612 spin_lock(&ret->d_lock);
613 if (unlikely(ret != dentry->d_parent)) {
614 spin_unlock(&ret->d_lock);
615 rcu_read_unlock();
616 goto repeat;
617 }
618 rcu_read_unlock();
619 BUG_ON(!ret->d_count);
620 ret->d_count++;
621 spin_unlock(&ret->d_lock);
622 return ret;
623}
624EXPORT_SYMBOL(dget_parent);
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642static struct dentry *__d_find_alias(struct inode *inode, int want_discon)
643{
644 struct dentry *alias, *discon_alias;
645
646again:
647 discon_alias = NULL;
648 list_for_each_entry(alias, &inode->i_dentry, d_alias) {
649 spin_lock(&alias->d_lock);
650 if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) {
651 if (IS_ROOT(alias) &&
652 (alias->d_flags & DCACHE_DISCONNECTED)) {
653 discon_alias = alias;
654 } else if (!want_discon) {
655 __dget_dlock(alias);
656 spin_unlock(&alias->d_lock);
657 return alias;
658 }
659 }
660 spin_unlock(&alias->d_lock);
661 }
662 if (discon_alias) {
663 alias = discon_alias;
664 spin_lock(&alias->d_lock);
665 if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) {
666 if (IS_ROOT(alias) &&
667 (alias->d_flags & DCACHE_DISCONNECTED)) {
668 __dget_dlock(alias);
669 spin_unlock(&alias->d_lock);
670 return alias;
671 }
672 }
673 spin_unlock(&alias->d_lock);
674 goto again;
675 }
676 return NULL;
677}
678
679struct dentry *d_find_alias(struct inode *inode)
680{
681 struct dentry *de = NULL;
682
683 if (!list_empty(&inode->i_dentry)) {
684 spin_lock(&inode->i_lock);
685 de = __d_find_alias(inode, 0);
686 spin_unlock(&inode->i_lock);
687 }
688 return de;
689}
690EXPORT_SYMBOL(d_find_alias);
691
692
693
694
695
696void d_prune_aliases(struct inode *inode)
697{
698 struct dentry *dentry;
699restart:
700 spin_lock(&inode->i_lock);
701 list_for_each_entry(dentry, &inode->i_dentry, d_alias) {
702 spin_lock(&dentry->d_lock);
703 if (!dentry->d_count) {
704 __dget_dlock(dentry);
705 __d_drop(dentry);
706 spin_unlock(&dentry->d_lock);
707 spin_unlock(&inode->i_lock);
708 dput(dentry);
709 goto restart;
710 }
711 spin_unlock(&dentry->d_lock);
712 }
713 spin_unlock(&inode->i_lock);
714}
715EXPORT_SYMBOL(d_prune_aliases);
716
717
718
719
720
721
722
723
724static void try_prune_one_dentry(struct dentry *dentry)
725 __releases(dentry->d_lock)
726{
727 struct dentry *parent;
728
729 parent = dentry_kill(dentry, 0);
730
731
732
733
734
735
736
737
738
739
740 if (!parent)
741 return;
742 if (parent == dentry)
743 return;
744
745
746 dentry = parent;
747 while (dentry) {
748 spin_lock(&dentry->d_lock);
749 if (dentry->d_count > 1) {
750 dentry->d_count--;
751 spin_unlock(&dentry->d_lock);
752 return;
753 }
754 dentry = dentry_kill(dentry, 1);
755 }
756}
757
758static void shrink_dentry_list(struct list_head *list)
759{
760 struct dentry *dentry;
761
762 rcu_read_lock();
763 for (;;) {
764 dentry = list_entry_rcu(list->prev, struct dentry, d_lru);
765 if (&dentry->d_lru == list)
766 break;
767 spin_lock(&dentry->d_lock);
768 if (dentry != list_entry(list->prev, struct dentry, d_lru)) {
769 spin_unlock(&dentry->d_lock);
770 continue;
771 }
772
773
774
775
776
777
778 if (dentry->d_count) {
779 dentry_lru_del(dentry);
780 spin_unlock(&dentry->d_lock);
781 continue;
782 }
783
784 rcu_read_unlock();
785
786 try_prune_one_dentry(dentry);
787
788 rcu_read_lock();
789 }
790 rcu_read_unlock();
791}
792
793
794
795
796
797
798
799
800
801
802
803
804
805void prune_dcache_sb(struct super_block *sb, int count)
806{
807 struct dentry *dentry;
808 LIST_HEAD(referenced);
809 LIST_HEAD(tmp);
810
811relock:
812 spin_lock(&dcache_lru_lock);
813 while (!list_empty(&sb->s_dentry_lru)) {
814 dentry = list_entry(sb->s_dentry_lru.prev,
815 struct dentry, d_lru);
816 BUG_ON(dentry->d_sb != sb);
817
818 if (!spin_trylock(&dentry->d_lock)) {
819 spin_unlock(&dcache_lru_lock);
820 cpu_relax();
821 goto relock;
822 }
823
824 if (dentry->d_flags & DCACHE_REFERENCED) {
825 dentry->d_flags &= ~DCACHE_REFERENCED;
826 list_move(&dentry->d_lru, &referenced);
827 spin_unlock(&dentry->d_lock);
828 } else {
829 list_move_tail(&dentry->d_lru, &tmp);
830 dentry->d_flags |= DCACHE_SHRINK_LIST;
831 spin_unlock(&dentry->d_lock);
832 if (!--count)
833 break;
834 }
835 cond_resched_lock(&dcache_lru_lock);
836 }
837 if (!list_empty(&referenced))
838 list_splice(&referenced, &sb->s_dentry_lru);
839 spin_unlock(&dcache_lru_lock);
840
841 shrink_dentry_list(&tmp);
842}
843
844
845
846
847
848
849
850
851void shrink_dcache_sb(struct super_block *sb)
852{
853 LIST_HEAD(tmp);
854
855 spin_lock(&dcache_lru_lock);
856 while (!list_empty(&sb->s_dentry_lru)) {
857 list_splice_init(&sb->s_dentry_lru, &tmp);
858 spin_unlock(&dcache_lru_lock);
859 shrink_dentry_list(&tmp);
860 spin_lock(&dcache_lru_lock);
861 }
862 spin_unlock(&dcache_lru_lock);
863}
864EXPORT_SYMBOL(shrink_dcache_sb);
865
866
867
868
869
870
871static void shrink_dcache_for_umount_subtree(struct dentry *dentry)
872{
873 struct dentry *parent;
874
875 BUG_ON(!IS_ROOT(dentry));
876
877 for (;;) {
878
879 while (!list_empty(&dentry->d_subdirs))
880 dentry = list_entry(dentry->d_subdirs.next,
881 struct dentry, d_u.d_child);
882
883
884
885 do {
886 struct inode *inode;
887
888
889
890
891
892
893 dentry_lru_prune(dentry);
894 __d_shrink(dentry);
895
896 if (dentry->d_count != 0) {
897 printk(KERN_ERR
898 "BUG: Dentry %p{i=%lx,n=%s}"
899 " still in use (%d)"
900 " [unmount of %s %s]\n",
901 dentry,
902 dentry->d_inode ?
903 dentry->d_inode->i_ino : 0UL,
904 dentry->d_name.name,
905 dentry->d_count,
906 dentry->d_sb->s_type->name,
907 dentry->d_sb->s_id);
908 BUG();
909 }
910
911 if (IS_ROOT(dentry)) {
912 parent = NULL;
913 list_del(&dentry->d_u.d_child);
914 } else {
915 parent = dentry->d_parent;
916 parent->d_count--;
917 list_del(&dentry->d_u.d_child);
918 }
919
920 inode = dentry->d_inode;
921 if (inode) {
922 dentry->d_inode = NULL;
923 list_del_init(&dentry->d_alias);
924 if (dentry->d_op && dentry->d_op->d_iput)
925 dentry->d_op->d_iput(dentry, inode);
926 else
927 iput(inode);
928 }
929
930 d_free(dentry);
931
932
933
934
935 if (!parent)
936 return;
937 dentry = parent;
938 } while (list_empty(&dentry->d_subdirs));
939
940 dentry = list_entry(dentry->d_subdirs.next,
941 struct dentry, d_u.d_child);
942 }
943}
944
945
946
947
948
949
950
951
952
953
954
955void shrink_dcache_for_umount(struct super_block *sb)
956{
957 struct dentry *dentry;
958
959 if (down_read_trylock(&sb->s_umount))
960 BUG();
961
962 dentry = sb->s_root;
963 sb->s_root = NULL;
964 dentry->d_count--;
965 shrink_dcache_for_umount_subtree(dentry);
966
967 while (!hlist_bl_empty(&sb->s_anon)) {
968 dentry = hlist_bl_entry(hlist_bl_first(&sb->s_anon), struct dentry, d_hash);
969 shrink_dcache_for_umount_subtree(dentry);
970 }
971}
972
973
974
975
976
977
978
979static struct dentry *try_to_ascend(struct dentry *old, int locked, unsigned seq)
980{
981 struct dentry *new = old->d_parent;
982
983 rcu_read_lock();
984 spin_unlock(&old->d_lock);
985 spin_lock(&new->d_lock);
986
987
988
989
990
991 if (new != old->d_parent ||
992 (old->d_flags & DCACHE_DISCONNECTED) ||
993 (!locked && read_seqretry(&rename_lock, seq))) {
994 spin_unlock(&new->d_lock);
995 new = NULL;
996 }
997 rcu_read_unlock();
998 return new;
999}
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015int have_submounts(struct dentry *parent)
1016{
1017 struct dentry *this_parent;
1018 struct list_head *next;
1019 unsigned seq;
1020 int locked = 0;
1021
1022 seq = read_seqbegin(&rename_lock);
1023again:
1024 this_parent = parent;
1025
1026 if (d_mountpoint(parent))
1027 goto positive;
1028 spin_lock(&this_parent->d_lock);
1029repeat:
1030 next = this_parent->d_subdirs.next;
1031resume:
1032 while (next != &this_parent->d_subdirs) {
1033 struct list_head *tmp = next;
1034 struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
1035 next = tmp->next;
1036
1037 spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
1038
1039 if (d_mountpoint(dentry)) {
1040 spin_unlock(&dentry->d_lock);
1041 spin_unlock(&this_parent->d_lock);
1042 goto positive;
1043 }
1044 if (!list_empty(&dentry->d_subdirs)) {
1045 spin_unlock(&this_parent->d_lock);
1046 spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_);
1047 this_parent = dentry;
1048 spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_);
1049 goto repeat;
1050 }
1051 spin_unlock(&dentry->d_lock);
1052 }
1053
1054
1055
1056 if (this_parent != parent) {
1057 struct dentry *child = this_parent;
1058 this_parent = try_to_ascend(this_parent, locked, seq);
1059 if (!this_parent)
1060 goto rename_retry;
1061 next = child->d_u.d_child.next;
1062 goto resume;
1063 }
1064 spin_unlock(&this_parent->d_lock);
1065 if (!locked && read_seqretry(&rename_lock, seq))
1066 goto rename_retry;
1067 if (locked)
1068 write_sequnlock(&rename_lock);
1069 return 0;
1070positive:
1071 if (!locked && read_seqretry(&rename_lock, seq))
1072 goto rename_retry;
1073 if (locked)
1074 write_sequnlock(&rename_lock);
1075 return 1;
1076
1077rename_retry:
1078 locked = 1;
1079 write_seqlock(&rename_lock);
1080 goto again;
1081}
1082EXPORT_SYMBOL(have_submounts);
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098static int select_parent(struct dentry *parent, struct list_head *dispose)
1099{
1100 struct dentry *this_parent;
1101 struct list_head *next;
1102 unsigned seq;
1103 int found = 0;
1104 int locked = 0;
1105
1106 seq = read_seqbegin(&rename_lock);
1107again:
1108 this_parent = parent;
1109 spin_lock(&this_parent->d_lock);
1110repeat:
1111 next = this_parent->d_subdirs.next;
1112resume:
1113 while (next != &this_parent->d_subdirs) {
1114 struct list_head *tmp = next;
1115 struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
1116 next = tmp->next;
1117
1118 spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128 if (dentry->d_count) {
1129 dentry_lru_del(dentry);
1130 } else if (!(dentry->d_flags & DCACHE_SHRINK_LIST)) {
1131 dentry_lru_move_list(dentry, dispose);
1132 dentry->d_flags |= DCACHE_SHRINK_LIST;
1133 found++;
1134 }
1135
1136
1137
1138
1139
1140 if (found && need_resched()) {
1141 spin_unlock(&dentry->d_lock);
1142 goto out;
1143 }
1144
1145
1146
1147
1148 if (!list_empty(&dentry->d_subdirs)) {
1149 spin_unlock(&this_parent->d_lock);
1150 spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_);
1151 this_parent = dentry;
1152 spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_);
1153 goto repeat;
1154 }
1155
1156 spin_unlock(&dentry->d_lock);
1157 }
1158
1159
1160
1161 if (this_parent != parent) {
1162 struct dentry *child = this_parent;
1163 this_parent = try_to_ascend(this_parent, locked, seq);
1164 if (!this_parent)
1165 goto rename_retry;
1166 next = child->d_u.d_child.next;
1167 goto resume;
1168 }
1169out:
1170 spin_unlock(&this_parent->d_lock);
1171 if (!locked && read_seqretry(&rename_lock, seq))
1172 goto rename_retry;
1173 if (locked)
1174 write_sequnlock(&rename_lock);
1175 return found;
1176
1177rename_retry:
1178 if (found)
1179 return found;
1180 locked = 1;
1181 write_seqlock(&rename_lock);
1182 goto again;
1183}
1184
1185
1186
1187
1188
1189
1190
1191void shrink_dcache_parent(struct dentry * parent)
1192{
1193 LIST_HEAD(dispose);
1194 int found;
1195
1196 while ((found = select_parent(parent, &dispose)) != 0)
1197 shrink_dentry_list(&dispose);
1198}
1199EXPORT_SYMBOL(shrink_dcache_parent);
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name)
1212{
1213 struct dentry *dentry;
1214 char *dname;
1215
1216 dentry = kmem_cache_alloc(dentry_cache, GFP_KERNEL);
1217 if (!dentry)
1218 return NULL;
1219
1220 if (name->len > DNAME_INLINE_LEN-1) {
1221 dname = kmalloc(name->len + 1, GFP_KERNEL);
1222 if (!dname) {
1223 kmem_cache_free(dentry_cache, dentry);
1224 return NULL;
1225 }
1226 } else {
1227 dname = dentry->d_iname;
1228 }
1229 dentry->d_name.name = dname;
1230
1231 dentry->d_name.len = name->len;
1232 dentry->d_name.hash = name->hash;
1233 memcpy(dname, name->name, name->len);
1234 dname[name->len] = 0;
1235
1236 dentry->d_count = 1;
1237 dentry->d_flags = 0;
1238 spin_lock_init(&dentry->d_lock);
1239 seqcount_init(&dentry->d_seq);
1240 dentry->d_inode = NULL;
1241 dentry->d_parent = dentry;
1242 dentry->d_sb = sb;
1243 dentry->d_op = NULL;
1244 dentry->d_fsdata = NULL;
1245 INIT_HLIST_BL_NODE(&dentry->d_hash);
1246 INIT_LIST_HEAD(&dentry->d_lru);
1247 INIT_LIST_HEAD(&dentry->d_subdirs);
1248 INIT_LIST_HEAD(&dentry->d_alias);
1249 INIT_LIST_HEAD(&dentry->d_u.d_child);
1250 d_set_d_op(dentry, dentry->d_sb->s_d_op);
1251
1252 this_cpu_inc(nr_dentry);
1253
1254 return dentry;
1255}
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266struct dentry *d_alloc(struct dentry * parent, const struct qstr *name)
1267{
1268 struct dentry *dentry = __d_alloc(parent->d_sb, name);
1269 if (!dentry)
1270 return NULL;
1271
1272 spin_lock(&parent->d_lock);
1273
1274
1275
1276
1277 __dget_dlock(parent);
1278 dentry->d_parent = parent;
1279 list_add(&dentry->d_u.d_child, &parent->d_subdirs);
1280 spin_unlock(&parent->d_lock);
1281
1282 return dentry;
1283}
1284EXPORT_SYMBOL(d_alloc);
1285
1286struct dentry *d_alloc_pseudo(struct super_block *sb, const struct qstr *name)
1287{
1288 struct dentry *dentry = __d_alloc(sb, name);
1289 if (dentry)
1290 dentry->d_flags |= DCACHE_DISCONNECTED;
1291 return dentry;
1292}
1293EXPORT_SYMBOL(d_alloc_pseudo);
1294
1295struct dentry *d_alloc_name(struct dentry *parent, const char *name)
1296{
1297 struct qstr q;
1298
1299 q.name = name;
1300 q.len = strlen(name);
1301 q.hash = full_name_hash(q.name, q.len);
1302 return d_alloc(parent, &q);
1303}
1304EXPORT_SYMBOL(d_alloc_name);
1305
1306void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op)
1307{
1308 WARN_ON_ONCE(dentry->d_op);
1309 WARN_ON_ONCE(dentry->d_flags & (DCACHE_OP_HASH |
1310 DCACHE_OP_COMPARE |
1311 DCACHE_OP_REVALIDATE |
1312 DCACHE_OP_DELETE ));
1313 dentry->d_op = op;
1314 if (!op)
1315 return;
1316 if (op->d_hash)
1317 dentry->d_flags |= DCACHE_OP_HASH;
1318 if (op->d_compare)
1319 dentry->d_flags |= DCACHE_OP_COMPARE;
1320 if (op->d_revalidate)
1321 dentry->d_flags |= DCACHE_OP_REVALIDATE;
1322 if (op->d_delete)
1323 dentry->d_flags |= DCACHE_OP_DELETE;
1324 if (op->d_prune)
1325 dentry->d_flags |= DCACHE_OP_PRUNE;
1326
1327}
1328EXPORT_SYMBOL(d_set_d_op);
1329
1330static void __d_instantiate(struct dentry *dentry, struct inode *inode)
1331{
1332 spin_lock(&dentry->d_lock);
1333 if (inode) {
1334 if (unlikely(IS_AUTOMOUNT(inode)))
1335 dentry->d_flags |= DCACHE_NEED_AUTOMOUNT;
1336 list_add(&dentry->d_alias, &inode->i_dentry);
1337 }
1338 dentry->d_inode = inode;
1339 dentry_rcuwalk_barrier(dentry);
1340 spin_unlock(&dentry->d_lock);
1341 fsnotify_d_instantiate(dentry, inode);
1342}
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359void d_instantiate(struct dentry *entry, struct inode * inode)
1360{
1361 BUG_ON(!list_empty(&entry->d_alias));
1362 if (inode)
1363 spin_lock(&inode->i_lock);
1364 __d_instantiate(entry, inode);
1365 if (inode)
1366 spin_unlock(&inode->i_lock);
1367 security_d_instantiate(entry, inode);
1368}
1369EXPORT_SYMBOL(d_instantiate);
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387static struct dentry *__d_instantiate_unique(struct dentry *entry,
1388 struct inode *inode)
1389{
1390 struct dentry *alias;
1391 int len = entry->d_name.len;
1392 const char *name = entry->d_name.name;
1393 unsigned int hash = entry->d_name.hash;
1394
1395 if (!inode) {
1396 __d_instantiate(entry, NULL);
1397 return NULL;
1398 }
1399
1400 list_for_each_entry(alias, &inode->i_dentry, d_alias) {
1401 struct qstr *qstr = &alias->d_name;
1402
1403
1404
1405
1406
1407
1408 if (qstr->hash != hash)
1409 continue;
1410 if (alias->d_parent != entry->d_parent)
1411 continue;
1412 if (dentry_cmp(qstr->name, qstr->len, name, len))
1413 continue;
1414 __dget(alias);
1415 return alias;
1416 }
1417
1418 __d_instantiate(entry, inode);
1419 return NULL;
1420}
1421
1422struct dentry *d_instantiate_unique(struct dentry *entry, struct inode *inode)
1423{
1424 struct dentry *result;
1425
1426 BUG_ON(!list_empty(&entry->d_alias));
1427
1428 if (inode)
1429 spin_lock(&inode->i_lock);
1430 result = __d_instantiate_unique(entry, inode);
1431 if (inode)
1432 spin_unlock(&inode->i_lock);
1433
1434 if (!result) {
1435 security_d_instantiate(entry, inode);
1436 return NULL;
1437 }
1438
1439 BUG_ON(!d_unhashed(result));
1440 iput(inode);
1441 return result;
1442}
1443
1444EXPORT_SYMBOL(d_instantiate_unique);
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455struct dentry * d_alloc_root(struct inode * root_inode)
1456{
1457 struct dentry *res = NULL;
1458
1459 if (root_inode) {
1460 static const struct qstr name = { .name = "/", .len = 1 };
1461
1462 res = __d_alloc(root_inode->i_sb, &name);
1463 if (res)
1464 d_instantiate(res, root_inode);
1465 }
1466 return res;
1467}
1468EXPORT_SYMBOL(d_alloc_root);
1469
1470struct dentry *d_make_root(struct inode *root_inode)
1471{
1472 struct dentry *res = NULL;
1473
1474 if (root_inode) {
1475 static const struct qstr name = { .name = "/", .len = 1 };
1476
1477 res = __d_alloc(root_inode->i_sb, &name);
1478 if (res)
1479 d_instantiate(res, root_inode);
1480 else
1481 iput(root_inode);
1482 }
1483 return res;
1484}
1485EXPORT_SYMBOL(d_make_root);
1486
1487static struct dentry * __d_find_any_alias(struct inode *inode)
1488{
1489 struct dentry *alias;
1490
1491 if (list_empty(&inode->i_dentry))
1492 return NULL;
1493 alias = list_first_entry(&inode->i_dentry, struct dentry, d_alias);
1494 __dget(alias);
1495 return alias;
1496}
1497
1498
1499
1500
1501
1502
1503
1504
1505struct dentry *d_find_any_alias(struct inode *inode)
1506{
1507 struct dentry *de;
1508
1509 spin_lock(&inode->i_lock);
1510 de = __d_find_any_alias(inode);
1511 spin_unlock(&inode->i_lock);
1512 return de;
1513}
1514EXPORT_SYMBOL(d_find_any_alias);
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534struct dentry *d_obtain_alias(struct inode *inode)
1535{
1536 static const struct qstr anonstring = { .name = "" };
1537 struct dentry *tmp;
1538 struct dentry *res;
1539
1540 if (!inode)
1541 return ERR_PTR(-ESTALE);
1542 if (IS_ERR(inode))
1543 return ERR_CAST(inode);
1544
1545 res = d_find_any_alias(inode);
1546 if (res)
1547 goto out_iput;
1548
1549 tmp = __d_alloc(inode->i_sb, &anonstring);
1550 if (!tmp) {
1551 res = ERR_PTR(-ENOMEM);
1552 goto out_iput;
1553 }
1554
1555 spin_lock(&inode->i_lock);
1556 res = __d_find_any_alias(inode);
1557 if (res) {
1558 spin_unlock(&inode->i_lock);
1559 dput(tmp);
1560 goto out_iput;
1561 }
1562
1563
1564 spin_lock(&tmp->d_lock);
1565 tmp->d_inode = inode;
1566 tmp->d_flags |= DCACHE_DISCONNECTED;
1567 list_add(&tmp->d_alias, &inode->i_dentry);
1568 hlist_bl_lock(&tmp->d_sb->s_anon);
1569 hlist_bl_add_head(&tmp->d_hash, &tmp->d_sb->s_anon);
1570 hlist_bl_unlock(&tmp->d_sb->s_anon);
1571 spin_unlock(&tmp->d_lock);
1572 spin_unlock(&inode->i_lock);
1573 security_d_instantiate(tmp, inode);
1574
1575 return tmp;
1576
1577 out_iput:
1578 if (res && !IS_ERR(res))
1579 security_d_instantiate(res, inode);
1580 iput(inode);
1581 return res;
1582}
1583EXPORT_SYMBOL(d_obtain_alias);
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601struct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry)
1602{
1603 struct dentry *new = NULL;
1604
1605 if (IS_ERR(inode))
1606 return ERR_CAST(inode);
1607
1608 if (inode && S_ISDIR(inode->i_mode)) {
1609 spin_lock(&inode->i_lock);
1610 new = __d_find_alias(inode, 1);
1611 if (new) {
1612 BUG_ON(!(new->d_flags & DCACHE_DISCONNECTED));
1613 spin_unlock(&inode->i_lock);
1614 security_d_instantiate(new, inode);
1615 d_move(new, dentry);
1616 iput(inode);
1617 } else {
1618
1619 __d_instantiate(dentry, inode);
1620 spin_unlock(&inode->i_lock);
1621 security_d_instantiate(dentry, inode);
1622 d_rehash(dentry);
1623 }
1624 } else
1625 d_add(dentry, inode);
1626 return new;
1627}
1628EXPORT_SYMBOL(d_splice_alias);
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode,
1647 struct qstr *name)
1648{
1649 int error;
1650 struct dentry *found;
1651 struct dentry *new;
1652
1653
1654
1655
1656
1657 found = d_hash_and_lookup(dentry->d_parent, name);
1658 if (!found) {
1659 new = d_alloc(dentry->d_parent, name);
1660 if (!new) {
1661 error = -ENOMEM;
1662 goto err_out;
1663 }
1664
1665 found = d_splice_alias(inode, new);
1666 if (found) {
1667 dput(new);
1668 return found;
1669 }
1670 return new;
1671 }
1672
1673
1674
1675
1676
1677
1678
1679 if (found->d_inode) {
1680 if (unlikely(found->d_inode != inode)) {
1681
1682 BUG_ON(!is_bad_inode(inode));
1683 BUG_ON(!is_bad_inode(found->d_inode));
1684 }
1685 iput(inode);
1686 return found;
1687 }
1688
1689
1690
1691
1692
1693 if (unlikely(d_need_lookup(found)))
1694 d_clear_need_lookup(found);
1695
1696
1697
1698
1699
1700 new = d_splice_alias(inode, found);
1701 if (new) {
1702 dput(found);
1703 found = new;
1704 }
1705 return found;
1706
1707err_out:
1708 iput(inode);
1709 return ERR_PTR(error);
1710}
1711EXPORT_SYMBOL(d_add_ci);
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740struct dentry *__d_lookup_rcu(const struct dentry *parent,
1741 const struct qstr *name,
1742 unsigned *seqp, struct inode **inode)
1743{
1744 unsigned int len = name->len;
1745 unsigned int hash = name->hash;
1746 const unsigned char *str = name->name;
1747 struct hlist_bl_head *b = d_hash(parent, hash);
1748 struct hlist_bl_node *node;
1749 struct dentry *dentry;
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771 hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) {
1772 unsigned seq;
1773 struct inode *i;
1774 const char *tname;
1775 int tlen;
1776
1777 if (dentry->d_name.hash != hash)
1778 continue;
1779
1780seqretry:
1781 seq = read_seqcount_begin(&dentry->d_seq);
1782 if (dentry->d_parent != parent)
1783 continue;
1784 if (d_unhashed(dentry))
1785 continue;
1786 tlen = dentry->d_name.len;
1787 tname = dentry->d_name.name;
1788 i = dentry->d_inode;
1789 prefetch(tname);
1790
1791
1792
1793
1794
1795
1796 if (read_seqcount_retry(&dentry->d_seq, seq))
1797 goto seqretry;
1798 if (unlikely(parent->d_flags & DCACHE_OP_COMPARE)) {
1799 if (parent->d_op->d_compare(parent, *inode,
1800 dentry, i,
1801 tlen, tname, name))
1802 continue;
1803 } else {
1804 if (dentry_cmp(tname, tlen, str, len))
1805 continue;
1806 }
1807
1808
1809
1810
1811
1812
1813 *seqp = seq;
1814 *inode = i;
1815 return dentry;
1816 }
1817 return NULL;
1818}
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831struct dentry *d_lookup(struct dentry *parent, struct qstr *name)
1832{
1833 struct dentry *dentry;
1834 unsigned seq;
1835
1836 do {
1837 seq = read_seqbegin(&rename_lock);
1838 dentry = __d_lookup(parent, name);
1839 if (dentry)
1840 break;
1841 } while (read_seqretry(&rename_lock, seq));
1842 return dentry;
1843}
1844EXPORT_SYMBOL(d_lookup);
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861struct dentry *__d_lookup(struct dentry *parent, struct qstr *name)
1862{
1863 unsigned int len = name->len;
1864 unsigned int hash = name->hash;
1865 const unsigned char *str = name->name;
1866 struct hlist_bl_head *b = d_hash(parent, hash);
1867 struct hlist_bl_node *node;
1868 struct dentry *found = NULL;
1869 struct dentry *dentry;
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891 rcu_read_lock();
1892
1893 hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) {
1894 const char *tname;
1895 int tlen;
1896
1897 if (dentry->d_name.hash != hash)
1898 continue;
1899
1900 spin_lock(&dentry->d_lock);
1901 if (dentry->d_parent != parent)
1902 goto next;
1903 if (d_unhashed(dentry))
1904 goto next;
1905
1906
1907
1908
1909
1910 tlen = dentry->d_name.len;
1911 tname = dentry->d_name.name;
1912 if (parent->d_flags & DCACHE_OP_COMPARE) {
1913 if (parent->d_op->d_compare(parent, parent->d_inode,
1914 dentry, dentry->d_inode,
1915 tlen, tname, name))
1916 goto next;
1917 } else {
1918 if (dentry_cmp(tname, tlen, str, len))
1919 goto next;
1920 }
1921
1922 dentry->d_count++;
1923 found = dentry;
1924 spin_unlock(&dentry->d_lock);
1925 break;
1926next:
1927 spin_unlock(&dentry->d_lock);
1928 }
1929 rcu_read_unlock();
1930
1931 return found;
1932}
1933
1934
1935
1936
1937
1938
1939
1940
1941struct dentry *d_hash_and_lookup(struct dentry *dir, struct qstr *name)
1942{
1943 struct dentry *dentry = NULL;
1944
1945
1946
1947
1948
1949
1950 name->hash = full_name_hash(name->name, name->len);
1951 if (dir->d_flags & DCACHE_OP_HASH) {
1952 if (dir->d_op->d_hash(dir, dir->d_inode, name) < 0)
1953 goto out;
1954 }
1955 dentry = d_lookup(dir, name);
1956out:
1957 return dentry;
1958}
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971int d_validate(struct dentry *dentry, struct dentry *dparent)
1972{
1973 struct dentry *child;
1974
1975 spin_lock(&dparent->d_lock);
1976 list_for_each_entry(child, &dparent->d_subdirs, d_u.d_child) {
1977 if (dentry == child) {
1978 spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
1979 __dget_dlock(dentry);
1980 spin_unlock(&dentry->d_lock);
1981 spin_unlock(&dparent->d_lock);
1982 return 1;
1983 }
1984 }
1985 spin_unlock(&dparent->d_lock);
1986
1987 return 0;
1988}
1989EXPORT_SYMBOL(d_validate);
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012void d_delete(struct dentry * dentry)
2013{
2014 struct inode *inode;
2015 int isdir = 0;
2016
2017
2018
2019again:
2020 spin_lock(&dentry->d_lock);
2021 inode = dentry->d_inode;
2022 isdir = S_ISDIR(inode->i_mode);
2023 if (dentry->d_count == 1) {
2024 if (inode && !spin_trylock(&inode->i_lock)) {
2025 spin_unlock(&dentry->d_lock);
2026 cpu_relax();
2027 goto again;
2028 }
2029 dentry->d_flags &= ~DCACHE_CANT_MOUNT;
2030 dentry_unlink_inode(dentry);
2031 fsnotify_nameremove(dentry, isdir);
2032 return;
2033 }
2034
2035 if (!d_unhashed(dentry))
2036 __d_drop(dentry);
2037
2038 spin_unlock(&dentry->d_lock);
2039
2040 fsnotify_nameremove(dentry, isdir);
2041}
2042EXPORT_SYMBOL(d_delete);
2043
2044static void __d_rehash(struct dentry * entry, struct hlist_bl_head *b)
2045{
2046 BUG_ON(!d_unhashed(entry));
2047 hlist_bl_lock(b);
2048 entry->d_flags |= DCACHE_RCUACCESS;
2049 hlist_bl_add_head_rcu(&entry->d_hash, b);
2050 hlist_bl_unlock(b);
2051}
2052
2053static void _d_rehash(struct dentry * entry)
2054{
2055 __d_rehash(entry, d_hash(entry->d_parent, entry->d_name.hash));
2056}
2057
2058
2059
2060
2061
2062
2063
2064
2065void d_rehash(struct dentry * entry)
2066{
2067 spin_lock(&entry->d_lock);
2068 _d_rehash(entry);
2069 spin_unlock(&entry->d_lock);
2070}
2071EXPORT_SYMBOL(d_rehash);
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087void dentry_update_name_case(struct dentry *dentry, struct qstr *name)
2088{
2089 BUG_ON(!mutex_is_locked(&dentry->d_parent->d_inode->i_mutex));
2090 BUG_ON(dentry->d_name.len != name->len);
2091
2092 spin_lock(&dentry->d_lock);
2093 write_seqcount_begin(&dentry->d_seq);
2094 memcpy((unsigned char *)dentry->d_name.name, name->name, name->len);
2095 write_seqcount_end(&dentry->d_seq);
2096 spin_unlock(&dentry->d_lock);
2097}
2098EXPORT_SYMBOL(dentry_update_name_case);
2099
2100static void switch_names(struct dentry *dentry, struct dentry *target)
2101{
2102 if (dname_external(target)) {
2103 if (dname_external(dentry)) {
2104
2105
2106
2107 swap(target->d_name.name, dentry->d_name.name);
2108 } else {
2109
2110
2111
2112
2113 memcpy(target->d_iname, dentry->d_name.name,
2114 dentry->d_name.len + 1);
2115 dentry->d_name.name = target->d_name.name;
2116 target->d_name.name = target->d_iname;
2117 }
2118 } else {
2119 if (dname_external(dentry)) {
2120
2121
2122
2123
2124 memcpy(dentry->d_iname, target->d_name.name,
2125 target->d_name.len + 1);
2126 target->d_name.name = dentry->d_name.name;
2127 dentry->d_name.name = dentry->d_iname;
2128 } else {
2129
2130
2131
2132 memcpy(dentry->d_iname, target->d_name.name,
2133 target->d_name.len + 1);
2134 dentry->d_name.len = target->d_name.len;
2135 return;
2136 }
2137 }
2138 swap(dentry->d_name.len, target->d_name.len);
2139}
2140
2141static void dentry_lock_for_move(struct dentry *dentry, struct dentry *target)
2142{
2143
2144
2145
2146 if (IS_ROOT(dentry) || dentry->d_parent == target->d_parent)
2147 spin_lock(&target->d_parent->d_lock);
2148 else {
2149 if (d_ancestor(dentry->d_parent, target->d_parent)) {
2150 spin_lock(&dentry->d_parent->d_lock);
2151 spin_lock_nested(&target->d_parent->d_lock,
2152 DENTRY_D_LOCK_NESTED);
2153 } else {
2154 spin_lock(&target->d_parent->d_lock);
2155 spin_lock_nested(&dentry->d_parent->d_lock,
2156 DENTRY_D_LOCK_NESTED);
2157 }
2158 }
2159 if (target < dentry) {
2160 spin_lock_nested(&target->d_lock, 2);
2161 spin_lock_nested(&dentry->d_lock, 3);
2162 } else {
2163 spin_lock_nested(&dentry->d_lock, 2);
2164 spin_lock_nested(&target->d_lock, 3);
2165 }
2166}
2167
2168static void dentry_unlock_parents_for_move(struct dentry *dentry,
2169 struct dentry *target)
2170{
2171 if (target->d_parent != dentry->d_parent)
2172 spin_unlock(&dentry->d_parent->d_lock);
2173 if (target->d_parent != target)
2174 spin_unlock(&target->d_parent->d_lock);
2175}
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198static void __d_move(struct dentry * dentry, struct dentry * target)
2199{
2200 if (!dentry->d_inode)
2201 printk(KERN_WARNING "VFS: moving negative dcache entry\n");
2202
2203 BUG_ON(d_ancestor(dentry, target));
2204 BUG_ON(d_ancestor(target, dentry));
2205
2206 dentry_lock_for_move(dentry, target);
2207
2208 write_seqcount_begin(&dentry->d_seq);
2209 write_seqcount_begin(&target->d_seq);
2210
2211
2212
2213
2214
2215
2216
2217 __d_drop(dentry);
2218 __d_rehash(dentry, d_hash(target->d_parent, target->d_name.hash));
2219
2220
2221 __d_drop(target);
2222
2223 list_del(&dentry->d_u.d_child);
2224 list_del(&target->d_u.d_child);
2225
2226
2227 switch_names(dentry, target);
2228 swap(dentry->d_name.hash, target->d_name.hash);
2229
2230
2231 if (IS_ROOT(dentry)) {
2232 dentry->d_parent = target->d_parent;
2233 target->d_parent = target;
2234 INIT_LIST_HEAD(&target->d_u.d_child);
2235 } else {
2236 swap(dentry->d_parent, target->d_parent);
2237
2238
2239 list_add(&target->d_u.d_child, &target->d_parent->d_subdirs);
2240 }
2241
2242 list_add(&dentry->d_u.d_child, &dentry->d_parent->d_subdirs);
2243
2244 write_seqcount_end(&target->d_seq);
2245 write_seqcount_end(&dentry->d_seq);
2246
2247 dentry_unlock_parents_for_move(dentry, target);
2248 spin_unlock(&target->d_lock);
2249 fsnotify_d_move(dentry);
2250 spin_unlock(&dentry->d_lock);
2251}
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262void d_move(struct dentry *dentry, struct dentry *target)
2263{
2264 write_seqlock(&rename_lock);
2265 __d_move(dentry, target);
2266 write_sequnlock(&rename_lock);
2267}
2268EXPORT_SYMBOL(d_move);
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278struct dentry *d_ancestor(struct dentry *p1, struct dentry *p2)
2279{
2280 struct dentry *p;
2281
2282 for (p = p2; !IS_ROOT(p); p = p->d_parent) {
2283 if (p->d_parent == p1)
2284 return p;
2285 }
2286 return NULL;
2287}
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298static struct dentry *__d_unalias(struct inode *inode,
2299 struct dentry *dentry, struct dentry *alias)
2300{
2301 struct mutex *m1 = NULL, *m2 = NULL;
2302 struct dentry *ret;
2303
2304
2305 if (alias->d_parent == dentry->d_parent)
2306 goto out_unalias;
2307
2308
2309 ret = ERR_PTR(-EBUSY);
2310 if (!mutex_trylock(&dentry->d_sb->s_vfs_rename_mutex))
2311 goto out_err;
2312 m1 = &dentry->d_sb->s_vfs_rename_mutex;
2313 if (!mutex_trylock(&alias->d_parent->d_inode->i_mutex))
2314 goto out_err;
2315 m2 = &alias->d_parent->d_inode->i_mutex;
2316out_unalias:
2317 __d_move(alias, dentry);
2318 ret = alias;
2319out_err:
2320 spin_unlock(&inode->i_lock);
2321 if (m2)
2322 mutex_unlock(m2);
2323 if (m1)
2324 mutex_unlock(m1);
2325 return ret;
2326}
2327
2328
2329
2330
2331
2332
2333static void __d_materialise_dentry(struct dentry *dentry, struct dentry *anon)
2334{
2335 struct dentry *dparent, *aparent;
2336
2337 dentry_lock_for_move(anon, dentry);
2338
2339 write_seqcount_begin(&dentry->d_seq);
2340 write_seqcount_begin(&anon->d_seq);
2341
2342 dparent = dentry->d_parent;
2343 aparent = anon->d_parent;
2344
2345 switch_names(dentry, anon);
2346 swap(dentry->d_name.hash, anon->d_name.hash);
2347
2348 dentry->d_parent = (aparent == anon) ? dentry : aparent;
2349 list_del(&dentry->d_u.d_child);
2350 if (!IS_ROOT(dentry))
2351 list_add(&dentry->d_u.d_child, &dentry->d_parent->d_subdirs);
2352 else
2353 INIT_LIST_HEAD(&dentry->d_u.d_child);
2354
2355 anon->d_parent = (dparent == dentry) ? anon : dparent;
2356 list_del(&anon->d_u.d_child);
2357 if (!IS_ROOT(anon))
2358 list_add(&anon->d_u.d_child, &anon->d_parent->d_subdirs);
2359 else
2360 INIT_LIST_HEAD(&anon->d_u.d_child);
2361
2362 write_seqcount_end(&dentry->d_seq);
2363 write_seqcount_end(&anon->d_seq);
2364
2365 dentry_unlock_parents_for_move(anon, dentry);
2366 spin_unlock(&dentry->d_lock);
2367
2368
2369 anon->d_flags &= ~DCACHE_DISCONNECTED;
2370}
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381struct dentry *d_materialise_unique(struct dentry *dentry, struct inode *inode)
2382{
2383 struct dentry *actual;
2384
2385 BUG_ON(!d_unhashed(dentry));
2386
2387 if (!inode) {
2388 actual = dentry;
2389 __d_instantiate(dentry, NULL);
2390 d_rehash(actual);
2391 goto out_nolock;
2392 }
2393
2394 spin_lock(&inode->i_lock);
2395
2396 if (S_ISDIR(inode->i_mode)) {
2397 struct dentry *alias;
2398
2399
2400 alias = __d_find_alias(inode, 0);
2401 if (alias) {
2402 actual = alias;
2403 write_seqlock(&rename_lock);
2404
2405 if (d_ancestor(alias, dentry)) {
2406
2407 actual = ERR_PTR(-ELOOP);
2408 } else if (IS_ROOT(alias)) {
2409
2410
2411 __d_materialise_dentry(dentry, alias);
2412 write_sequnlock(&rename_lock);
2413 __d_drop(alias);
2414 goto found;
2415 } else {
2416
2417
2418 actual = __d_unalias(inode, dentry, alias);
2419 }
2420 write_sequnlock(&rename_lock);
2421 if (IS_ERR(actual)) {
2422 if (PTR_ERR(actual) == -ELOOP)
2423 pr_warn_ratelimited(
2424 "VFS: Lookup of '%s' in %s %s"
2425 " would have caused loop\n",
2426 dentry->d_name.name,
2427 inode->i_sb->s_type->name,
2428 inode->i_sb->s_id);
2429 dput(alias);
2430 }
2431 goto out_nolock;
2432 }
2433 }
2434
2435
2436 actual = __d_instantiate_unique(dentry, inode);
2437 if (!actual)
2438 actual = dentry;
2439 else
2440 BUG_ON(!d_unhashed(actual));
2441
2442 spin_lock(&actual->d_lock);
2443found:
2444 _d_rehash(actual);
2445 spin_unlock(&actual->d_lock);
2446 spin_unlock(&inode->i_lock);
2447out_nolock:
2448 if (actual == dentry) {
2449 security_d_instantiate(dentry, inode);
2450 return NULL;
2451 }
2452
2453 iput(inode);
2454 return actual;
2455}
2456EXPORT_SYMBOL_GPL(d_materialise_unique);
2457
2458static int prepend(char **buffer, int *buflen, const char *str, int namelen)
2459{
2460 *buflen -= namelen;
2461 if (*buflen < 0)
2462 return -ENAMETOOLONG;
2463 *buffer -= namelen;
2464 memcpy(*buffer, str, namelen);
2465 return 0;
2466}
2467
2468static int prepend_name(char **buffer, int *buflen, struct qstr *name)
2469{
2470 return prepend(buffer, buflen, name->name, name->len);
2471}
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482static int prepend_path(const struct path *path,
2483 const struct path *root,
2484 char **buffer, int *buflen)
2485{
2486 struct dentry *dentry = path->dentry;
2487 struct vfsmount *vfsmnt = path->mnt;
2488 struct mount *mnt = real_mount(vfsmnt);
2489 bool slash = false;
2490 int error = 0;
2491
2492 br_read_lock(vfsmount_lock);
2493 while (dentry != root->dentry || vfsmnt != root->mnt) {
2494 struct dentry * parent;
2495
2496 if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) {
2497
2498 if (!mnt_has_parent(mnt))
2499 goto global_root;
2500 dentry = mnt->mnt_mountpoint;
2501 mnt = mnt->mnt_parent;
2502 vfsmnt = &mnt->mnt;
2503 continue;
2504 }
2505 parent = dentry->d_parent;
2506 prefetch(parent);
2507 spin_lock(&dentry->d_lock);
2508 error = prepend_name(buffer, buflen, &dentry->d_name);
2509 spin_unlock(&dentry->d_lock);
2510 if (!error)
2511 error = prepend(buffer, buflen, "/", 1);
2512 if (error)
2513 break;
2514
2515 slash = true;
2516 dentry = parent;
2517 }
2518
2519 if (!error && !slash)
2520 error = prepend(buffer, buflen, "/", 1);
2521
2522out:
2523 br_read_unlock(vfsmount_lock);
2524 return error;
2525
2526global_root:
2527
2528
2529
2530
2531 if (IS_ROOT(dentry) &&
2532 (dentry->d_name.len != 1 || dentry->d_name.name[0] != '/')) {
2533 WARN(1, "Root dentry has weird name <%.*s>\n",
2534 (int) dentry->d_name.len, dentry->d_name.name);
2535 }
2536 if (!slash)
2537 error = prepend(buffer, buflen, "/", 1);
2538 if (!error)
2539 error = real_mount(vfsmnt)->mnt_ns ? 1 : 2;
2540 goto out;
2541}
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559char *__d_path(const struct path *path,
2560 const struct path *root,
2561 char *buf, int buflen)
2562{
2563 char *res = buf + buflen;
2564 int error;
2565
2566 prepend(&res, &buflen, "\0", 1);
2567 write_seqlock(&rename_lock);
2568 error = prepend_path(path, root, &res, &buflen);
2569 write_sequnlock(&rename_lock);
2570
2571 if (error < 0)
2572 return ERR_PTR(error);
2573 if (error > 0)
2574 return NULL;
2575 return res;
2576}
2577
2578char *d_absolute_path(const struct path *path,
2579 char *buf, int buflen)
2580{
2581 struct path root = {};
2582 char *res = buf + buflen;
2583 int error;
2584
2585 prepend(&res, &buflen, "\0", 1);
2586 write_seqlock(&rename_lock);
2587 error = prepend_path(path, &root, &res, &buflen);
2588 write_sequnlock(&rename_lock);
2589
2590 if (error > 1)
2591 error = -EINVAL;
2592 if (error < 0)
2593 return ERR_PTR(error);
2594 return res;
2595}
2596
2597
2598
2599
2600static int path_with_deleted(const struct path *path,
2601 const struct path *root,
2602 char **buf, int *buflen)
2603{
2604 prepend(buf, buflen, "\0", 1);
2605 if (d_unlinked(path->dentry)) {
2606 int error = prepend(buf, buflen, " (deleted)", 10);
2607 if (error)
2608 return error;
2609 }
2610
2611 return prepend_path(path, root, buf, buflen);
2612}
2613
2614static int prepend_unreachable(char **buffer, int *buflen)
2615{
2616 return prepend(buffer, buflen, "(unreachable)", 13);
2617}
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635char *d_path(const struct path *path, char *buf, int buflen)
2636{
2637 char *res = buf + buflen;
2638 struct path root;
2639 int error;
2640
2641
2642
2643
2644
2645
2646
2647
2648 if (path->dentry->d_op && path->dentry->d_op->d_dname)
2649 return path->dentry->d_op->d_dname(path->dentry, buf, buflen);
2650
2651 get_fs_root(current->fs, &root);
2652 write_seqlock(&rename_lock);
2653 error = path_with_deleted(path, &root, &res, &buflen);
2654 if (error < 0)
2655 res = ERR_PTR(error);
2656 write_sequnlock(&rename_lock);
2657 path_put(&root);
2658 return res;
2659}
2660EXPORT_SYMBOL(d_path);
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671char *d_path_with_unreachable(const struct path *path, char *buf, int buflen)
2672{
2673 char *res = buf + buflen;
2674 struct path root;
2675 int error;
2676
2677 if (path->dentry->d_op && path->dentry->d_op->d_dname)
2678 return path->dentry->d_op->d_dname(path->dentry, buf, buflen);
2679
2680 get_fs_root(current->fs, &root);
2681 write_seqlock(&rename_lock);
2682 error = path_with_deleted(path, &root, &res, &buflen);
2683 if (error > 0)
2684 error = prepend_unreachable(&res, &buflen);
2685 write_sequnlock(&rename_lock);
2686 path_put(&root);
2687 if (error)
2688 res = ERR_PTR(error);
2689
2690 return res;
2691}
2692
2693
2694
2695
2696char *dynamic_dname(struct dentry *dentry, char *buffer, int buflen,
2697 const char *fmt, ...)
2698{
2699 va_list args;
2700 char temp[64];
2701 int sz;
2702
2703 va_start(args, fmt);
2704 sz = vsnprintf(temp, sizeof(temp), fmt, args) + 1;
2705 va_end(args);
2706
2707 if (sz > sizeof(temp) || sz > buflen)
2708 return ERR_PTR(-ENAMETOOLONG);
2709
2710 buffer += buflen - sz;
2711 return memcpy(buffer, temp, sz);
2712}
2713
2714
2715
2716
2717static char *__dentry_path(struct dentry *dentry, char *buf, int buflen)
2718{
2719 char *end = buf + buflen;
2720 char *retval;
2721
2722 prepend(&end, &buflen, "\0", 1);
2723 if (buflen < 1)
2724 goto Elong;
2725
2726 retval = end-1;
2727 *retval = '/';
2728
2729 while (!IS_ROOT(dentry)) {
2730 struct dentry *parent = dentry->d_parent;
2731 int error;
2732
2733 prefetch(parent);
2734 spin_lock(&dentry->d_lock);
2735 error = prepend_name(&end, &buflen, &dentry->d_name);
2736 spin_unlock(&dentry->d_lock);
2737 if (error != 0 || prepend(&end, &buflen, "/", 1) != 0)
2738 goto Elong;
2739
2740 retval = end;
2741 dentry = parent;
2742 }
2743 return retval;
2744Elong:
2745 return ERR_PTR(-ENAMETOOLONG);
2746}
2747
2748char *dentry_path_raw(struct dentry *dentry, char *buf, int buflen)
2749{
2750 char *retval;
2751
2752 write_seqlock(&rename_lock);
2753 retval = __dentry_path(dentry, buf, buflen);
2754 write_sequnlock(&rename_lock);
2755
2756 return retval;
2757}
2758EXPORT_SYMBOL(dentry_path_raw);
2759
2760char *dentry_path(struct dentry *dentry, char *buf, int buflen)
2761{
2762 char *p = NULL;
2763 char *retval;
2764
2765 write_seqlock(&rename_lock);
2766 if (d_unlinked(dentry)) {
2767 p = buf + buflen;
2768 if (prepend(&p, &buflen, "//deleted", 10) != 0)
2769 goto Elong;
2770 buflen++;
2771 }
2772 retval = __dentry_path(dentry, buf, buflen);
2773 write_sequnlock(&rename_lock);
2774 if (!IS_ERR(retval) && p)
2775 *p = '/';
2776 return retval;
2777Elong:
2778 return ERR_PTR(-ENAMETOOLONG);
2779}
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
2800{
2801 int error;
2802 struct path pwd, root;
2803 char *page = (char *) __get_free_page(GFP_USER);
2804
2805 if (!page)
2806 return -ENOMEM;
2807
2808 get_fs_root_and_pwd(current->fs, &root, &pwd);
2809
2810 error = -ENOENT;
2811 write_seqlock(&rename_lock);
2812 if (!d_unlinked(pwd.dentry)) {
2813 unsigned long len;
2814 char *cwd = page + PAGE_SIZE;
2815 int buflen = PAGE_SIZE;
2816
2817 prepend(&cwd, &buflen, "\0", 1);
2818 error = prepend_path(&pwd, &root, &cwd, &buflen);
2819 write_sequnlock(&rename_lock);
2820
2821 if (error < 0)
2822 goto out;
2823
2824
2825 if (error > 0) {
2826 error = prepend_unreachable(&cwd, &buflen);
2827 if (error)
2828 goto out;
2829 }
2830
2831 error = -ERANGE;
2832 len = PAGE_SIZE + page - cwd;
2833 if (len <= size) {
2834 error = len;
2835 if (copy_to_user(buf, cwd, len))
2836 error = -EFAULT;
2837 }
2838 } else {
2839 write_sequnlock(&rename_lock);
2840 }
2841
2842out:
2843 path_put(&pwd);
2844 path_put(&root);
2845 free_page((unsigned long) page);
2846 return error;
2847}
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865int is_subdir(struct dentry *new_dentry, struct dentry *old_dentry)
2866{
2867 int result;
2868 unsigned seq;
2869
2870 if (new_dentry == old_dentry)
2871 return 1;
2872
2873 do {
2874
2875 seq = read_seqbegin(&rename_lock);
2876
2877
2878
2879
2880 rcu_read_lock();
2881 if (d_ancestor(old_dentry, new_dentry))
2882 result = 1;
2883 else
2884 result = 0;
2885 rcu_read_unlock();
2886 } while (read_seqretry(&rename_lock, seq));
2887
2888 return result;
2889}
2890
2891void d_genocide(struct dentry *root)
2892{
2893 struct dentry *this_parent;
2894 struct list_head *next;
2895 unsigned seq;
2896 int locked = 0;
2897
2898 seq = read_seqbegin(&rename_lock);
2899again:
2900 this_parent = root;
2901 spin_lock(&this_parent->d_lock);
2902repeat:
2903 next = this_parent->d_subdirs.next;
2904resume:
2905 while (next != &this_parent->d_subdirs) {
2906 struct list_head *tmp = next;
2907 struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
2908 next = tmp->next;
2909
2910 spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
2911 if (d_unhashed(dentry) || !dentry->d_inode) {
2912 spin_unlock(&dentry->d_lock);
2913 continue;
2914 }
2915 if (!list_empty(&dentry->d_subdirs)) {
2916 spin_unlock(&this_parent->d_lock);
2917 spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_);
2918 this_parent = dentry;
2919 spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_);
2920 goto repeat;
2921 }
2922 if (!(dentry->d_flags & DCACHE_GENOCIDE)) {
2923 dentry->d_flags |= DCACHE_GENOCIDE;
2924 dentry->d_count--;
2925 }
2926 spin_unlock(&dentry->d_lock);
2927 }
2928 if (this_parent != root) {
2929 struct dentry *child = this_parent;
2930 if (!(this_parent->d_flags & DCACHE_GENOCIDE)) {
2931 this_parent->d_flags |= DCACHE_GENOCIDE;
2932 this_parent->d_count--;
2933 }
2934 this_parent = try_to_ascend(this_parent, locked, seq);
2935 if (!this_parent)
2936 goto rename_retry;
2937 next = child->d_u.d_child.next;
2938 goto resume;
2939 }
2940 spin_unlock(&this_parent->d_lock);
2941 if (!locked && read_seqretry(&rename_lock, seq))
2942 goto rename_retry;
2943 if (locked)
2944 write_sequnlock(&rename_lock);
2945 return;
2946
2947rename_retry:
2948 locked = 1;
2949 write_seqlock(&rename_lock);
2950 goto again;
2951}
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967ino_t find_inode_number(struct dentry *dir, struct qstr *name)
2968{
2969 struct dentry * dentry;
2970 ino_t ino = 0;
2971
2972 dentry = d_hash_and_lookup(dir, name);
2973 if (dentry) {
2974 if (dentry->d_inode)
2975 ino = dentry->d_inode->i_ino;
2976 dput(dentry);
2977 }
2978 return ino;
2979}
2980EXPORT_SYMBOL(find_inode_number);
2981
2982static __initdata unsigned long dhash_entries;
2983static int __init set_dhash_entries(char *str)
2984{
2985 if (!str)
2986 return 0;
2987 dhash_entries = simple_strtoul(str, &str, 0);
2988 return 1;
2989}
2990__setup("dhash_entries=", set_dhash_entries);
2991
2992static void __init dcache_init_early(void)
2993{
2994 unsigned int loop;
2995
2996
2997
2998
2999 if (hashdist)
3000 return;
3001
3002 dentry_hashtable =
3003 alloc_large_system_hash("Dentry cache",
3004 sizeof(struct hlist_bl_head),
3005 dhash_entries,
3006 13,
3007 HASH_EARLY,
3008 &d_hash_shift,
3009 &d_hash_mask,
3010 0);
3011
3012 for (loop = 0; loop < (1U << d_hash_shift); loop++)
3013 INIT_HLIST_BL_HEAD(dentry_hashtable + loop);
3014}
3015
3016static void __init dcache_init(void)
3017{
3018 unsigned int loop;
3019
3020
3021
3022
3023
3024
3025 dentry_cache = KMEM_CACHE(dentry,
3026 SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_MEM_SPREAD);
3027
3028
3029 if (!hashdist)
3030 return;
3031
3032 dentry_hashtable =
3033 alloc_large_system_hash("Dentry cache",
3034 sizeof(struct hlist_bl_head),
3035 dhash_entries,
3036 13,
3037 0,
3038 &d_hash_shift,
3039 &d_hash_mask,
3040 0);
3041
3042 for (loop = 0; loop < (1U << d_hash_shift); loop++)
3043 INIT_HLIST_BL_HEAD(dentry_hashtable + loop);
3044}
3045
3046
3047struct kmem_cache *names_cachep __read_mostly;
3048EXPORT_SYMBOL(names_cachep);
3049
3050EXPORT_SYMBOL(d_genocide);
3051
3052void __init vfs_caches_init_early(void)
3053{
3054 dcache_init_early();
3055 inode_init_early();
3056}
3057
3058void __init vfs_caches_init(unsigned long mempages)
3059{
3060 unsigned long reserve;
3061
3062
3063
3064
3065 reserve = min((mempages - nr_free_pages()) * 3/2, mempages - 1);
3066 mempages -= reserve;
3067
3068 names_cachep = kmem_cache_create("names_cache", PATH_MAX, 0,
3069 SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
3070
3071 dcache_init();
3072 inode_init();
3073 files_init(mempages);
3074 mnt_init();
3075 bdev_cache_init();
3076 chrdev_init();
3077}
3078