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