mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	vfs: call rcu_barrier after ->kill_sb()
In commit fa0d7e3de6 ("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 <boyu.mt@taobao.com>
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Cc: Nick Piggin <npiggin@kernel.dk>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Chris Mason <chris.mason@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
			
			
This commit is contained in:
		
							parent
							
								
									2dab597441
								
							
						
					
					
						commit
						d863b50ab0
					
				
					 1 changed files with 5 additions and 0 deletions
				
			
		|  | @ -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 { | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Boaz Harrosh
						Boaz Harrosh