aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoaz Harrosh <[email protected]>2011-02-10 15:01:20 -0800
committerLinus Torvalds <[email protected]>2011-02-11 16:12:19 -0800
commitd863b50ab01333659314c2034890cb76d9fdc3c7 (patch)
tree88d27ed4717bb49ba696f2efb5ef024388412af3
parent2dab597441667d6c04451a7dcf215241ad4c74f6 (diff)
vfs: call rcu_barrier after ->kill_sb()
In commit fa0d7e3de6d6 ("fs: icache RCU free inodes"), we use rcu free inode instead of freeing the inode directly. It causes a crash when we rmmod immediately after we umount the volume[1]. So we need to call rcu_barrier after we kill_sb so that the inode is freed before we do rmmod. The idea is inspired by Aneesh Kumar. rcu_barrier will wait for all callbacks to end before preceding. The original patch was done by Tao Ma, but synchronize_rcu() is not enough here. 1. http://marc.info/?l=linux-fsdevel&m=129680863330185&w=2 Tested-by: Tao Ma <[email protected]> Signed-off-by: Boaz Harrosh <[email protected]> Cc: Nick Piggin <[email protected]> Cc: Al Viro <[email protected]> Cc: Chris Mason <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
-rw-r--r--fs/super.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/fs/super.c b/fs/super.c
index 74e149efed81..7e9dd4cc2c01 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -177,6 +177,11 @@ void deactivate_locked_super(struct super_block *s)
struct file_system_type *fs = s->s_type;
if (atomic_dec_and_test(&s->s_active)) {
fs->kill_sb(s);
+ /*
+ * We need to call rcu_barrier so all the delayed rcu free
+ * inodes are flushed before we release the fs module.
+ */
+ rcu_barrier();
put_filesystem(fs);
put_super(s);
} else {