diff options
author | Kirill A. Shutemov <kirill.shutemov@linux.intel.com> | 2012-09-25 21:33:07 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-10-02 21:35:55 -0400 |
commit | 8c0a85377048b64c880e76ec7368904fe46d0b94 (patch) | |
tree | 12e075f4159e88b09a89e35866017f82f80bcc7d /fs | |
parent | 99621b44aa194eab594e1f17217231c02b519211 (diff) |
fs: push rcu_barrier() from deactivate_locked_super() to filesystems
There's no reason to call rcu_barrier() on every
deactivate_locked_super(). We only need to make sure that all delayed rcu
free inodes are flushed before we destroy related cache.
Removing rcu_barrier() from deactivate_locked_super() affects some fast
paths. E.g. on my machine exit_group() of a last process in IPC
namespace takes 0.07538s. rcu_barrier() takes 0.05188s of that time.
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
47 files changed, 240 insertions, 6 deletions
diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c index b85efa773949..392c5dac1981 100644 --- a/fs/9p/v9fs.c +++ b/fs/9p/v9fs.c | |||
@@ -560,6 +560,11 @@ static int v9fs_init_inode_cache(void) | |||
560 | */ | 560 | */ |
561 | static void v9fs_destroy_inode_cache(void) | 561 | static void v9fs_destroy_inode_cache(void) |
562 | { | 562 | { |
563 | /* | ||
564 | * Make sure all delayed rcu free inodes are flushed before we | ||
565 | * destroy cache. | ||
566 | */ | ||
567 | rcu_barrier(); | ||
563 | kmem_cache_destroy(v9fs_inode_cache); | 568 | kmem_cache_destroy(v9fs_inode_cache); |
564 | } | 569 | } |
565 | 570 | ||
diff --git a/fs/adfs/super.c b/fs/adfs/super.c index bdaec92353c2..c830c857c663 100644 --- a/fs/adfs/super.c +++ b/fs/adfs/super.c | |||
@@ -275,6 +275,11 @@ static int init_inodecache(void) | |||
275 | 275 | ||
276 | static void destroy_inodecache(void) | 276 | static void destroy_inodecache(void) |
277 | { | 277 | { |
278 | /* | ||
279 | * Make sure all delayed rcu free inodes are flushed before we | ||
280 | * destroy cache. | ||
281 | */ | ||
282 | rcu_barrier(); | ||
278 | kmem_cache_destroy(adfs_inode_cachep); | 283 | kmem_cache_destroy(adfs_inode_cachep); |
279 | } | 284 | } |
280 | 285 | ||
diff --git a/fs/affs/super.c b/fs/affs/super.c index c70f1e5fc024..2f57053bf26c 100644 --- a/fs/affs/super.c +++ b/fs/affs/super.c | |||
@@ -147,6 +147,11 @@ static int init_inodecache(void) | |||
147 | 147 | ||
148 | static void destroy_inodecache(void) | 148 | static void destroy_inodecache(void) |
149 | { | 149 | { |
150 | /* | ||
151 | * Make sure all delayed rcu free inodes are flushed before we | ||
152 | * destroy cache. | ||
153 | */ | ||
154 | rcu_barrier(); | ||
150 | kmem_cache_destroy(affs_inode_cachep); | 155 | kmem_cache_destroy(affs_inode_cachep); |
151 | } | 156 | } |
152 | 157 | ||
diff --git a/fs/afs/super.c b/fs/afs/super.c index df8c6047c2a1..43165009428d 100644 --- a/fs/afs/super.c +++ b/fs/afs/super.c | |||
@@ -123,6 +123,11 @@ void __exit afs_fs_exit(void) | |||
123 | BUG(); | 123 | BUG(); |
124 | } | 124 | } |
125 | 125 | ||
126 | /* | ||
127 | * Make sure all delayed rcu free inodes are flushed before we | ||
128 | * destroy cache. | ||
129 | */ | ||
130 | rcu_barrier(); | ||
126 | kmem_cache_destroy(afs_inode_cachep); | 131 | kmem_cache_destroy(afs_inode_cachep); |
127 | _leave(""); | 132 | _leave(""); |
128 | } | 133 | } |
diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c index cf7f3c67c8b7..962b4f8f7994 100644 --- a/fs/befs/linuxvfs.c +++ b/fs/befs/linuxvfs.c | |||
@@ -454,6 +454,11 @@ befs_init_inodecache(void) | |||
454 | static void | 454 | static void |
455 | befs_destroy_inodecache(void) | 455 | befs_destroy_inodecache(void) |
456 | { | 456 | { |
457 | /* | ||
458 | * Make sure all delayed rcu free inodes are flushed before we | ||
459 | * destroy cache. | ||
460 | */ | ||
461 | rcu_barrier(); | ||
457 | kmem_cache_destroy(befs_inode_cachep); | 462 | kmem_cache_destroy(befs_inode_cachep); |
458 | } | 463 | } |
459 | 464 | ||
diff --git a/fs/bfs/inode.c b/fs/bfs/inode.c index 9870417c26e7..d5fc598d6e4a 100644 --- a/fs/bfs/inode.c +++ b/fs/bfs/inode.c | |||
@@ -280,6 +280,11 @@ static int init_inodecache(void) | |||
280 | 280 | ||
281 | static void destroy_inodecache(void) | 281 | static void destroy_inodecache(void) |
282 | { | 282 | { |
283 | /* | ||
284 | * Make sure all delayed rcu free inodes are flushed before we | ||
285 | * destroy cache. | ||
286 | */ | ||
287 | rcu_barrier(); | ||
283 | kmem_cache_destroy(bfs_inode_cachep); | 288 | kmem_cache_destroy(bfs_inode_cachep); |
284 | } | 289 | } |
285 | 290 | ||
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 4c878476bb91..b08ea4717e9d 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -107,6 +107,12 @@ void extent_io_exit(void) | |||
107 | list_del(&eb->leak_list); | 107 | list_del(&eb->leak_list); |
108 | kmem_cache_free(extent_buffer_cache, eb); | 108 | kmem_cache_free(extent_buffer_cache, eb); |
109 | } | 109 | } |
110 | |||
111 | /* | ||
112 | * Make sure all delayed rcu free are flushed before we | ||
113 | * destroy caches. | ||
114 | */ | ||
115 | rcu_barrier(); | ||
110 | if (extent_state_cache) | 116 | if (extent_state_cache) |
111 | kmem_cache_destroy(extent_state_cache); | 117 | kmem_cache_destroy(extent_state_cache); |
112 | if (extent_buffer_cache) | 118 | if (extent_buffer_cache) |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index ec154f954646..cf03a91d806f 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -7076,6 +7076,11 @@ static void init_once(void *foo) | |||
7076 | 7076 | ||
7077 | void btrfs_destroy_cachep(void) | 7077 | void btrfs_destroy_cachep(void) |
7078 | { | 7078 | { |
7079 | /* | ||
7080 | * Make sure all delayed rcu free inodes are flushed before we | ||
7081 | * destroy cache. | ||
7082 | */ | ||
7083 | rcu_barrier(); | ||
7079 | if (btrfs_inode_cachep) | 7084 | if (btrfs_inode_cachep) |
7080 | kmem_cache_destroy(btrfs_inode_cachep); | 7085 | kmem_cache_destroy(btrfs_inode_cachep); |
7081 | if (btrfs_trans_handle_cachep) | 7086 | if (btrfs_trans_handle_cachep) |
diff --git a/fs/ceph/super.c b/fs/ceph/super.c index b982239f38f9..3a42d9326378 100644 --- a/fs/ceph/super.c +++ b/fs/ceph/super.c | |||
@@ -603,6 +603,11 @@ bad_cap: | |||
603 | 603 | ||
604 | static void destroy_caches(void) | 604 | static void destroy_caches(void) |
605 | { | 605 | { |
606 | /* | ||
607 | * Make sure all delayed rcu free inodes are flushed before we | ||
608 | * destroy cache. | ||
609 | */ | ||
610 | rcu_barrier(); | ||
606 | kmem_cache_destroy(ceph_inode_cachep); | 611 | kmem_cache_destroy(ceph_inode_cachep); |
607 | kmem_cache_destroy(ceph_cap_cachep); | 612 | kmem_cache_destroy(ceph_cap_cachep); |
608 | kmem_cache_destroy(ceph_dentry_cachep); | 613 | kmem_cache_destroy(ceph_dentry_cachep); |
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index db8a404a51dd..d4ce77a02327 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
@@ -977,6 +977,11 @@ cifs_init_inodecache(void) | |||
977 | static void | 977 | static void |
978 | cifs_destroy_inodecache(void) | 978 | cifs_destroy_inodecache(void) |
979 | { | 979 | { |
980 | /* | ||
981 | * Make sure all delayed rcu free inodes are flushed before we | ||
982 | * destroy cache. | ||
983 | */ | ||
984 | rcu_barrier(); | ||
980 | kmem_cache_destroy(cifs_inode_cachep); | 985 | kmem_cache_destroy(cifs_inode_cachep); |
981 | } | 986 | } |
982 | 987 | ||
diff --git a/fs/coda/inode.c b/fs/coda/inode.c index d315c6c5891a..be2aa4909487 100644 --- a/fs/coda/inode.c +++ b/fs/coda/inode.c | |||
@@ -85,6 +85,11 @@ int coda_init_inodecache(void) | |||
85 | 85 | ||
86 | void coda_destroy_inodecache(void) | 86 | void coda_destroy_inodecache(void) |
87 | { | 87 | { |
88 | /* | ||
89 | * Make sure all delayed rcu free inodes are flushed before we | ||
90 | * destroy cache. | ||
91 | */ | ||
92 | rcu_barrier(); | ||
88 | kmem_cache_destroy(coda_inode_cachep); | 93 | kmem_cache_destroy(coda_inode_cachep); |
89 | } | 94 | } |
90 | 95 | ||
diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index 9b627c15010a..34fcde765d24 100644 --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c | |||
@@ -710,6 +710,12 @@ static void ecryptfs_free_kmem_caches(void) | |||
710 | { | 710 | { |
711 | int i; | 711 | int i; |
712 | 712 | ||
713 | /* | ||
714 | * Make sure all delayed rcu free inodes are flushed before we | ||
715 | * destroy cache. | ||
716 | */ | ||
717 | rcu_barrier(); | ||
718 | |||
713 | for (i = 0; i < ARRAY_SIZE(ecryptfs_cache_infos); i++) { | 719 | for (i = 0; i < ARRAY_SIZE(ecryptfs_cache_infos); i++) { |
714 | struct ecryptfs_cache_info *info; | 720 | struct ecryptfs_cache_info *info; |
715 | 721 | ||
diff --git a/fs/efs/super.c b/fs/efs/super.c index e755ec746c69..2002431ef9a0 100644 --- a/fs/efs/super.c +++ b/fs/efs/super.c | |||
@@ -96,6 +96,11 @@ static int init_inodecache(void) | |||
96 | 96 | ||
97 | static void destroy_inodecache(void) | 97 | static void destroy_inodecache(void) |
98 | { | 98 | { |
99 | /* | ||
100 | * Make sure all delayed rcu free inodes are flushed before we | ||
101 | * destroy cache. | ||
102 | */ | ||
103 | rcu_barrier(); | ||
99 | kmem_cache_destroy(efs_inode_cachep); | 104 | kmem_cache_destroy(efs_inode_cachep); |
100 | } | 105 | } |
101 | 106 | ||
diff --git a/fs/exofs/super.c b/fs/exofs/super.c index dde41a75c7c8..59e3bbfac0b1 100644 --- a/fs/exofs/super.c +++ b/fs/exofs/super.c | |||
@@ -206,6 +206,11 @@ static int init_inodecache(void) | |||
206 | */ | 206 | */ |
207 | static void destroy_inodecache(void) | 207 | static void destroy_inodecache(void) |
208 | { | 208 | { |
209 | /* | ||
210 | * Make sure all delayed rcu free inodes are flushed before we | ||
211 | * destroy cache. | ||
212 | */ | ||
213 | rcu_barrier(); | ||
209 | kmem_cache_destroy(exofs_inode_cachep); | 214 | kmem_cache_destroy(exofs_inode_cachep); |
210 | } | 215 | } |
211 | 216 | ||
diff --git a/fs/ext2/super.c b/fs/ext2/super.c index af74d9e27b71..6c205d0c565b 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c | |||
@@ -206,6 +206,11 @@ static int init_inodecache(void) | |||
206 | 206 | ||
207 | static void destroy_inodecache(void) | 207 | static void destroy_inodecache(void) |
208 | { | 208 | { |
209 | /* | ||
210 | * Make sure all delayed rcu free inodes are flushed before we | ||
211 | * destroy cache. | ||
212 | */ | ||
213 | rcu_barrier(); | ||
209 | kmem_cache_destroy(ext2_inode_cachep); | 214 | kmem_cache_destroy(ext2_inode_cachep); |
210 | } | 215 | } |
211 | 216 | ||
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 8c892e93d8e7..8d41c8889eee 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
@@ -532,6 +532,11 @@ static int init_inodecache(void) | |||
532 | 532 | ||
533 | static void destroy_inodecache(void) | 533 | static void destroy_inodecache(void) |
534 | { | 534 | { |
535 | /* | ||
536 | * Make sure all delayed rcu free inodes are flushed before we | ||
537 | * destroy cache. | ||
538 | */ | ||
539 | rcu_barrier(); | ||
535 | kmem_cache_destroy(ext3_inode_cachep); | 540 | kmem_cache_destroy(ext3_inode_cachep); |
536 | } | 541 | } |
537 | 542 | ||
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index c6e0cb3d1f4a..455b7d8c6d62 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -1019,6 +1019,11 @@ static int init_inodecache(void) | |||
1019 | 1019 | ||
1020 | static void destroy_inodecache(void) | 1020 | static void destroy_inodecache(void) |
1021 | { | 1021 | { |
1022 | /* | ||
1023 | * Make sure all delayed rcu free inodes are flushed before we | ||
1024 | * destroy cache. | ||
1025 | */ | ||
1026 | rcu_barrier(); | ||
1022 | kmem_cache_destroy(ext4_inode_cachep); | 1027 | kmem_cache_destroy(ext4_inode_cachep); |
1023 | } | 1028 | } |
1024 | 1029 | ||
diff --git a/fs/fat/inode.c b/fs/fat/inode.c index 05e897fe9866..fd8e47cd898b 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c | |||
@@ -521,6 +521,11 @@ static int __init fat_init_inodecache(void) | |||
521 | 521 | ||
522 | static void __exit fat_destroy_inodecache(void) | 522 | static void __exit fat_destroy_inodecache(void) |
523 | { | 523 | { |
524 | /* | ||
525 | * Make sure all delayed rcu free inodes are flushed before we | ||
526 | * destroy cache. | ||
527 | */ | ||
528 | rcu_barrier(); | ||
524 | kmem_cache_destroy(fat_inode_cachep); | 529 | kmem_cache_destroy(fat_inode_cachep); |
525 | } | 530 | } |
526 | 531 | ||
diff --git a/fs/freevxfs/vxfs_super.c b/fs/freevxfs/vxfs_super.c index d4fabd26084e..fed2c8afb3a9 100644 --- a/fs/freevxfs/vxfs_super.c +++ b/fs/freevxfs/vxfs_super.c | |||
@@ -279,6 +279,11 @@ static void __exit | |||
279 | vxfs_cleanup(void) | 279 | vxfs_cleanup(void) |
280 | { | 280 | { |
281 | unregister_filesystem(&vxfs_fs_type); | 281 | unregister_filesystem(&vxfs_fs_type); |
282 | /* | ||
283 | * Make sure all delayed rcu free inodes are flushed before we | ||
284 | * destroy cache. | ||
285 | */ | ||
286 | rcu_barrier(); | ||
282 | kmem_cache_destroy(vxfs_inode_cachep); | 287 | kmem_cache_destroy(vxfs_inode_cachep); |
283 | } | 288 | } |
284 | 289 | ||
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index fca222dabe3c..f0eda124cffb 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c | |||
@@ -1197,6 +1197,12 @@ static void fuse_fs_cleanup(void) | |||
1197 | { | 1197 | { |
1198 | unregister_filesystem(&fuse_fs_type); | 1198 | unregister_filesystem(&fuse_fs_type); |
1199 | unregister_fuseblk(); | 1199 | unregister_fuseblk(); |
1200 | |||
1201 | /* | ||
1202 | * Make sure all delayed rcu free inodes are flushed before we | ||
1203 | * destroy cache. | ||
1204 | */ | ||
1205 | rcu_barrier(); | ||
1200 | kmem_cache_destroy(fuse_inode_cachep); | 1206 | kmem_cache_destroy(fuse_inode_cachep); |
1201 | } | 1207 | } |
1202 | 1208 | ||
diff --git a/fs/hfs/super.c b/fs/hfs/super.c index 4eb873e0c07b..941d7a8c2197 100644 --- a/fs/hfs/super.c +++ b/fs/hfs/super.c | |||
@@ -482,6 +482,12 @@ static int __init init_hfs_fs(void) | |||
482 | static void __exit exit_hfs_fs(void) | 482 | static void __exit exit_hfs_fs(void) |
483 | { | 483 | { |
484 | unregister_filesystem(&hfs_fs_type); | 484 | unregister_filesystem(&hfs_fs_type); |
485 | |||
486 | /* | ||
487 | * Make sure all delayed rcu free inodes are flushed before we | ||
488 | * destroy cache. | ||
489 | */ | ||
490 | rcu_barrier(); | ||
485 | kmem_cache_destroy(hfs_inode_cachep); | 491 | kmem_cache_destroy(hfs_inode_cachep); |
486 | } | 492 | } |
487 | 493 | ||
diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c index fdafb2d71654..811a84d2d964 100644 --- a/fs/hfsplus/super.c +++ b/fs/hfsplus/super.c | |||
@@ -635,6 +635,12 @@ static int __init init_hfsplus_fs(void) | |||
635 | static void __exit exit_hfsplus_fs(void) | 635 | static void __exit exit_hfsplus_fs(void) |
636 | { | 636 | { |
637 | unregister_filesystem(&hfsplus_fs_type); | 637 | unregister_filesystem(&hfsplus_fs_type); |
638 | |||
639 | /* | ||
640 | * Make sure all delayed rcu free inodes are flushed before we | ||
641 | * destroy cache. | ||
642 | */ | ||
643 | rcu_barrier(); | ||
638 | kmem_cache_destroy(hfsplus_inode_cachep); | 644 | kmem_cache_destroy(hfsplus_inode_cachep); |
639 | } | 645 | } |
640 | 646 | ||
diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c index 706a12c083ea..3cb1da56eb73 100644 --- a/fs/hpfs/super.c +++ b/fs/hpfs/super.c | |||
@@ -210,6 +210,11 @@ static int init_inodecache(void) | |||
210 | 210 | ||
211 | static void destroy_inodecache(void) | 211 | static void destroy_inodecache(void) |
212 | { | 212 | { |
213 | /* | ||
214 | * Make sure all delayed rcu free inodes are flushed before we | ||
215 | * destroy cache. | ||
216 | */ | ||
217 | rcu_barrier(); | ||
213 | kmem_cache_destroy(hpfs_inode_cachep); | 218 | kmem_cache_destroy(hpfs_inode_cachep); |
214 | } | 219 | } |
215 | 220 | ||
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 8349a899912e..c4b85d064e6b 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
@@ -1042,6 +1042,11 @@ static int __init init_hugetlbfs_fs(void) | |||
1042 | 1042 | ||
1043 | static void __exit exit_hugetlbfs_fs(void) | 1043 | static void __exit exit_hugetlbfs_fs(void) |
1044 | { | 1044 | { |
1045 | /* | ||
1046 | * Make sure all delayed rcu free inodes are flushed before we | ||
1047 | * destroy cache. | ||
1048 | */ | ||
1049 | rcu_barrier(); | ||
1045 | kmem_cache_destroy(hugetlbfs_inode_cachep); | 1050 | kmem_cache_destroy(hugetlbfs_inode_cachep); |
1046 | kern_unmount(hugetlbfs_vfsmount); | 1051 | kern_unmount(hugetlbfs_vfsmount); |
1047 | unregister_filesystem(&hugetlbfs_fs_type); | 1052 | unregister_filesystem(&hugetlbfs_fs_type); |
diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index 29037c365ba4..f94cde4527e8 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c | |||
@@ -114,6 +114,11 @@ static int init_inodecache(void) | |||
114 | 114 | ||
115 | static void destroy_inodecache(void) | 115 | static void destroy_inodecache(void) |
116 | { | 116 | { |
117 | /* | ||
118 | * Make sure all delayed rcu free inodes are flushed before we | ||
119 | * destroy cache. | ||
120 | */ | ||
121 | rcu_barrier(); | ||
117 | kmem_cache_destroy(isofs_inode_cachep); | 122 | kmem_cache_destroy(isofs_inode_cachep); |
118 | } | 123 | } |
119 | 124 | ||
diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c index 61ea41389f90..ff487954cd96 100644 --- a/fs/jffs2/super.c +++ b/fs/jffs2/super.c | |||
@@ -418,6 +418,12 @@ static void __exit exit_jffs2_fs(void) | |||
418 | unregister_filesystem(&jffs2_fs_type); | 418 | unregister_filesystem(&jffs2_fs_type); |
419 | jffs2_destroy_slab_caches(); | 419 | jffs2_destroy_slab_caches(); |
420 | jffs2_compressors_exit(); | 420 | jffs2_compressors_exit(); |
421 | |||
422 | /* | ||
423 | * Make sure all delayed rcu free inodes are flushed before we | ||
424 | * destroy cache. | ||
425 | */ | ||
426 | rcu_barrier(); | ||
421 | kmem_cache_destroy(jffs2_inode_cachep); | 427 | kmem_cache_destroy(jffs2_inode_cachep); |
422 | } | 428 | } |
423 | 429 | ||
diff --git a/fs/jfs/super.c b/fs/jfs/super.c index c55c7452d285..3735347fd5f6 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c | |||
@@ -903,6 +903,12 @@ static void __exit exit_jfs_fs(void) | |||
903 | jfs_proc_clean(); | 903 | jfs_proc_clean(); |
904 | #endif | 904 | #endif |
905 | unregister_filesystem(&jfs_fs_type); | 905 | unregister_filesystem(&jfs_fs_type); |
906 | |||
907 | /* | ||
908 | * Make sure all delayed rcu free inodes are flushed before we | ||
909 | * destroy cache. | ||
910 | */ | ||
911 | rcu_barrier(); | ||
906 | kmem_cache_destroy(jfs_inode_cachep); | 912 | kmem_cache_destroy(jfs_inode_cachep); |
907 | } | 913 | } |
908 | 914 | ||
diff --git a/fs/logfs/inode.c b/fs/logfs/inode.c index 6984562738d3..121bba2cf6f2 100644 --- a/fs/logfs/inode.c +++ b/fs/logfs/inode.c | |||
@@ -417,5 +417,10 @@ int logfs_init_inode_cache(void) | |||
417 | 417 | ||
418 | void logfs_destroy_inode_cache(void) | 418 | void logfs_destroy_inode_cache(void) |
419 | { | 419 | { |
420 | /* | ||
421 | * Make sure all delayed rcu free inodes are flushed before we | ||
422 | * destroy cache. | ||
423 | */ | ||
424 | rcu_barrier(); | ||
420 | kmem_cache_destroy(logfs_inode_cache); | 425 | kmem_cache_destroy(logfs_inode_cache); |
421 | } | 426 | } |
diff --git a/fs/minix/inode.c b/fs/minix/inode.c index 2a503ad020d5..dc8d3629c20a 100644 --- a/fs/minix/inode.c +++ b/fs/minix/inode.c | |||
@@ -100,6 +100,11 @@ static int init_inodecache(void) | |||
100 | 100 | ||
101 | static void destroy_inodecache(void) | 101 | static void destroy_inodecache(void) |
102 | { | 102 | { |
103 | /* | ||
104 | * Make sure all delayed rcu free inodes are flushed before we | ||
105 | * destroy cache. | ||
106 | */ | ||
107 | rcu_barrier(); | ||
103 | kmem_cache_destroy(minix_inode_cachep); | 108 | kmem_cache_destroy(minix_inode_cachep); |
104 | } | 109 | } |
105 | 110 | ||
diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c index 333df07ae3bd..0c62c55b25d7 100644 --- a/fs/ncpfs/inode.c +++ b/fs/ncpfs/inode.c | |||
@@ -89,6 +89,11 @@ static int init_inodecache(void) | |||
89 | 89 | ||
90 | static void destroy_inodecache(void) | 90 | static void destroy_inodecache(void) |
91 | { | 91 | { |
92 | /* | ||
93 | * Make sure all delayed rcu free inodes are flushed before we | ||
94 | * destroy cache. | ||
95 | */ | ||
96 | rcu_barrier(); | ||
92 | kmem_cache_destroy(ncp_inode_cachep); | 97 | kmem_cache_destroy(ncp_inode_cachep); |
93 | } | 98 | } |
94 | 99 | ||
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 9b47610338f5..e4c716d374a8 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
@@ -1571,6 +1571,11 @@ static int __init nfs_init_inodecache(void) | |||
1571 | 1571 | ||
1572 | static void nfs_destroy_inodecache(void) | 1572 | static void nfs_destroy_inodecache(void) |
1573 | { | 1573 | { |
1574 | /* | ||
1575 | * Make sure all delayed rcu free inodes are flushed before we | ||
1576 | * destroy cache. | ||
1577 | */ | ||
1578 | rcu_barrier(); | ||
1574 | kmem_cache_destroy(nfs_inode_cachep); | 1579 | kmem_cache_destroy(nfs_inode_cachep); |
1575 | } | 1580 | } |
1576 | 1581 | ||
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c index 6a10812711c1..3c991dc84f2f 100644 --- a/fs/nilfs2/super.c +++ b/fs/nilfs2/super.c | |||
@@ -1382,6 +1382,12 @@ static void nilfs_segbuf_init_once(void *obj) | |||
1382 | 1382 | ||
1383 | static void nilfs_destroy_cachep(void) | 1383 | static void nilfs_destroy_cachep(void) |
1384 | { | 1384 | { |
1385 | /* | ||
1386 | * Make sure all delayed rcu free inodes are flushed before we | ||
1387 | * destroy cache. | ||
1388 | */ | ||
1389 | rcu_barrier(); | ||
1390 | |||
1385 | if (nilfs_inode_cachep) | 1391 | if (nilfs_inode_cachep) |
1386 | kmem_cache_destroy(nilfs_inode_cachep); | 1392 | kmem_cache_destroy(nilfs_inode_cachep); |
1387 | if (nilfs_transaction_cachep) | 1393 | if (nilfs_transaction_cachep) |
diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c index 2bc149d6a784..fe08d4afa106 100644 --- a/fs/ntfs/super.c +++ b/fs/ntfs/super.c | |||
@@ -3168,6 +3168,12 @@ static void __exit exit_ntfs_fs(void) | |||
3168 | ntfs_debug("Unregistering NTFS driver."); | 3168 | ntfs_debug("Unregistering NTFS driver."); |
3169 | 3169 | ||
3170 | unregister_filesystem(&ntfs_fs_type); | 3170 | unregister_filesystem(&ntfs_fs_type); |
3171 | |||
3172 | /* | ||
3173 | * Make sure all delayed rcu free inodes are flushed before we | ||
3174 | * destroy cache. | ||
3175 | */ | ||
3176 | rcu_barrier(); | ||
3171 | kmem_cache_destroy(ntfs_big_inode_cache); | 3177 | kmem_cache_destroy(ntfs_big_inode_cache); |
3172 | kmem_cache_destroy(ntfs_inode_cache); | 3178 | kmem_cache_destroy(ntfs_inode_cache); |
3173 | kmem_cache_destroy(ntfs_name_cache); | 3179 | kmem_cache_destroy(ntfs_name_cache); |
diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c index 83b6f98e0665..16b712d260d4 100644 --- a/fs/ocfs2/dlmfs/dlmfs.c +++ b/fs/ocfs2/dlmfs/dlmfs.c | |||
@@ -691,6 +691,11 @@ static void __exit exit_dlmfs_fs(void) | |||
691 | flush_workqueue(user_dlm_worker); | 691 | flush_workqueue(user_dlm_worker); |
692 | destroy_workqueue(user_dlm_worker); | 692 | destroy_workqueue(user_dlm_worker); |
693 | 693 | ||
694 | /* | ||
695 | * Make sure all delayed rcu free inodes are flushed before we | ||
696 | * destroy cache. | ||
697 | */ | ||
698 | rcu_barrier(); | ||
694 | kmem_cache_destroy(dlmfs_inode_cache); | 699 | kmem_cache_destroy(dlmfs_inode_cache); |
695 | 700 | ||
696 | bdi_destroy(&dlmfs_backing_dev_info); | 701 | bdi_destroy(&dlmfs_backing_dev_info); |
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 68f4541c2db9..0e91ec22a940 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c | |||
@@ -1818,6 +1818,11 @@ static int ocfs2_initialize_mem_caches(void) | |||
1818 | 1818 | ||
1819 | static void ocfs2_free_mem_caches(void) | 1819 | static void ocfs2_free_mem_caches(void) |
1820 | { | 1820 | { |
1821 | /* | ||
1822 | * Make sure all delayed rcu free inodes are flushed before we | ||
1823 | * destroy cache. | ||
1824 | */ | ||
1825 | rcu_barrier(); | ||
1821 | if (ocfs2_inode_cachep) | 1826 | if (ocfs2_inode_cachep) |
1822 | kmem_cache_destroy(ocfs2_inode_cachep); | 1827 | kmem_cache_destroy(ocfs2_inode_cachep); |
1823 | ocfs2_inode_cachep = NULL; | 1828 | ocfs2_inode_cachep = NULL; |
diff --git a/fs/openpromfs/inode.c b/fs/openpromfs/inode.c index 4a3477949bca..2ad080faca34 100644 --- a/fs/openpromfs/inode.c +++ b/fs/openpromfs/inode.c | |||
@@ -463,6 +463,11 @@ static int __init init_openprom_fs(void) | |||
463 | static void __exit exit_openprom_fs(void) | 463 | static void __exit exit_openprom_fs(void) |
464 | { | 464 | { |
465 | unregister_filesystem(&openprom_fs_type); | 465 | unregister_filesystem(&openprom_fs_type); |
466 | /* | ||
467 | * Make sure all delayed rcu free inodes are flushed before we | ||
468 | * destroy cache. | ||
469 | */ | ||
470 | rcu_barrier(); | ||
466 | kmem_cache_destroy(op_inode_cachep); | 471 | kmem_cache_destroy(op_inode_cachep); |
467 | } | 472 | } |
468 | 473 | ||
diff --git a/fs/qnx4/inode.c b/fs/qnx4/inode.c index 552e994e3aa1..9534b4f76579 100644 --- a/fs/qnx4/inode.c +++ b/fs/qnx4/inode.c | |||
@@ -391,6 +391,11 @@ static int init_inodecache(void) | |||
391 | 391 | ||
392 | static void destroy_inodecache(void) | 392 | static void destroy_inodecache(void) |
393 | { | 393 | { |
394 | /* | ||
395 | * Make sure all delayed rcu free inodes are flushed before we | ||
396 | * destroy cache. | ||
397 | */ | ||
398 | rcu_barrier(); | ||
394 | kmem_cache_destroy(qnx4_inode_cachep); | 399 | kmem_cache_destroy(qnx4_inode_cachep); |
395 | } | 400 | } |
396 | 401 | ||
diff --git a/fs/qnx6/inode.c b/fs/qnx6/inode.c index 2049c814bda4..1b37fff7b5ff 100644 --- a/fs/qnx6/inode.c +++ b/fs/qnx6/inode.c | |||
@@ -651,6 +651,11 @@ static int init_inodecache(void) | |||
651 | 651 | ||
652 | static void destroy_inodecache(void) | 652 | static void destroy_inodecache(void) |
653 | { | 653 | { |
654 | /* | ||
655 | * Make sure all delayed rcu free inodes are flushed before we | ||
656 | * destroy cache. | ||
657 | */ | ||
658 | rcu_barrier(); | ||
654 | kmem_cache_destroy(qnx6_inode_cachep); | 659 | kmem_cache_destroy(qnx6_inode_cachep); |
655 | } | 660 | } |
656 | 661 | ||
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index 7a37dabf5a96..1078ae179993 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
@@ -608,6 +608,11 @@ static int init_inodecache(void) | |||
608 | 608 | ||
609 | static void destroy_inodecache(void) | 609 | static void destroy_inodecache(void) |
610 | { | 610 | { |
611 | /* | ||
612 | * Make sure all delayed rcu free inodes are flushed before we | ||
613 | * destroy cache. | ||
614 | */ | ||
615 | rcu_barrier(); | ||
611 | kmem_cache_destroy(reiserfs_inode_cachep); | 616 | kmem_cache_destroy(reiserfs_inode_cachep); |
612 | } | 617 | } |
613 | 618 | ||
diff --git a/fs/romfs/super.c b/fs/romfs/super.c index 77c5f2173983..fd7c5f60b46b 100644 --- a/fs/romfs/super.c +++ b/fs/romfs/super.c | |||
@@ -648,6 +648,11 @@ error_register: | |||
648 | static void __exit exit_romfs_fs(void) | 648 | static void __exit exit_romfs_fs(void) |
649 | { | 649 | { |
650 | unregister_filesystem(&romfs_fs_type); | 650 | unregister_filesystem(&romfs_fs_type); |
651 | /* | ||
652 | * Make sure all delayed rcu free inodes are flushed before we | ||
653 | * destroy cache. | ||
654 | */ | ||
655 | rcu_barrier(); | ||
651 | kmem_cache_destroy(romfs_inode_cachep); | 656 | kmem_cache_destroy(romfs_inode_cachep); |
652 | } | 657 | } |
653 | 658 | ||
diff --git a/fs/squashfs/super.c b/fs/squashfs/super.c index 29cd014ed3a1..260e3928d4f5 100644 --- a/fs/squashfs/super.c +++ b/fs/squashfs/super.c | |||
@@ -425,6 +425,11 @@ static int __init init_inodecache(void) | |||
425 | 425 | ||
426 | static void destroy_inodecache(void) | 426 | static void destroy_inodecache(void) |
427 | { | 427 | { |
428 | /* | ||
429 | * Make sure all delayed rcu free inodes are flushed before we | ||
430 | * destroy cache. | ||
431 | */ | ||
432 | rcu_barrier(); | ||
428 | kmem_cache_destroy(squashfs_inode_cachep); | 433 | kmem_cache_destroy(squashfs_inode_cachep); |
429 | } | 434 | } |
430 | 435 | ||
diff --git a/fs/super.c b/fs/super.c index 0902cfa6a12e..5fdf7ff32c4e 100644 --- a/fs/super.c +++ b/fs/super.c | |||
@@ -307,12 +307,6 @@ void deactivate_locked_super(struct super_block *s) | |||
307 | 307 | ||
308 | /* caches are now gone, we can safely kill the shrinker now */ | 308 | /* caches are now gone, we can safely kill the shrinker now */ |
309 | unregister_shrinker(&s->s_shrink); | 309 | unregister_shrinker(&s->s_shrink); |
310 | |||
311 | /* | ||
312 | * We need to call rcu_barrier so all the delayed rcu free | ||
313 | * inodes are flushed before we release the fs module. | ||
314 | */ | ||
315 | rcu_barrier(); | ||
316 | put_filesystem(fs); | 310 | put_filesystem(fs); |
317 | put_super(s); | 311 | put_super(s); |
318 | } else { | 312 | } else { |
diff --git a/fs/sysv/inode.c b/fs/sysv/inode.c index 80e1e2b18df1..0d0c50bd3321 100644 --- a/fs/sysv/inode.c +++ b/fs/sysv/inode.c | |||
@@ -360,5 +360,10 @@ int __init sysv_init_icache(void) | |||
360 | 360 | ||
361 | void sysv_destroy_icache(void) | 361 | void sysv_destroy_icache(void) |
362 | { | 362 | { |
363 | /* | ||
364 | * Make sure all delayed rcu free inodes are flushed before we | ||
365 | * destroy cache. | ||
366 | */ | ||
367 | rcu_barrier(); | ||
363 | kmem_cache_destroy(sysv_inode_cachep); | 368 | kmem_cache_destroy(sysv_inode_cachep); |
364 | } | 369 | } |
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index 71a197f0f93d..36e09ca9130b 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c | |||
@@ -2298,6 +2298,12 @@ static void __exit ubifs_exit(void) | |||
2298 | dbg_debugfs_exit(); | 2298 | dbg_debugfs_exit(); |
2299 | ubifs_compressors_exit(); | 2299 | ubifs_compressors_exit(); |
2300 | unregister_shrinker(&ubifs_shrinker_info); | 2300 | unregister_shrinker(&ubifs_shrinker_info); |
2301 | |||
2302 | /* | ||
2303 | * Make sure all delayed rcu free inodes are flushed before we | ||
2304 | * destroy cache. | ||
2305 | */ | ||
2306 | rcu_barrier(); | ||
2301 | kmem_cache_destroy(ubifs_inode_slab); | 2307 | kmem_cache_destroy(ubifs_inode_slab); |
2302 | unregister_filesystem(&ubifs_fs_type); | 2308 | unregister_filesystem(&ubifs_fs_type); |
2303 | } | 2309 | } |
diff --git a/fs/udf/super.c b/fs/udf/super.c index 18fc038a438d..b8d27642ab06 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
@@ -171,6 +171,11 @@ static int init_inodecache(void) | |||
171 | 171 | ||
172 | static void destroy_inodecache(void) | 172 | static void destroy_inodecache(void) |
173 | { | 173 | { |
174 | /* | ||
175 | * Make sure all delayed rcu free inodes are flushed before we | ||
176 | * destroy cache. | ||
177 | */ | ||
178 | rcu_barrier(); | ||
174 | kmem_cache_destroy(udf_inode_cachep); | 179 | kmem_cache_destroy(udf_inode_cachep); |
175 | } | 180 | } |
176 | 181 | ||
diff --git a/fs/ufs/super.c b/fs/ufs/super.c index 444927e5706b..f7cfecfe1cab 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c | |||
@@ -1466,6 +1466,11 @@ static int init_inodecache(void) | |||
1466 | 1466 | ||
1467 | static void destroy_inodecache(void) | 1467 | static void destroy_inodecache(void) |
1468 | { | 1468 | { |
1469 | /* | ||
1470 | * Make sure all delayed rcu free inodes are flushed before we | ||
1471 | * destroy cache. | ||
1472 | */ | ||
1473 | rcu_barrier(); | ||
1469 | kmem_cache_destroy(ufs_inode_cachep); | 1474 | kmem_cache_destroy(ufs_inode_cachep); |
1470 | } | 1475 | } |
1471 | 1476 | ||
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 19e2380fb867..83d36e473d2f 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c | |||
@@ -1506,6 +1506,11 @@ xfs_init_zones(void) | |||
1506 | STATIC void | 1506 | STATIC void |
1507 | xfs_destroy_zones(void) | 1507 | xfs_destroy_zones(void) |
1508 | { | 1508 | { |
1509 | /* | ||
1510 | * Make sure all delayed rcu free are flushed before we | ||
1511 | * destroy caches. | ||
1512 | */ | ||
1513 | rcu_barrier(); | ||
1509 | kmem_zone_destroy(xfs_ili_zone); | 1514 | kmem_zone_destroy(xfs_ili_zone); |
1510 | kmem_zone_destroy(xfs_inode_zone); | 1515 | kmem_zone_destroy(xfs_inode_zone); |
1511 | kmem_zone_destroy(xfs_efi_zone); | 1516 | kmem_zone_destroy(xfs_efi_zone); |