• Miao Xie's avatar
    Btrfs: protect fs_info->alloc_start · c018daec
    Miao Xie authored
    fs_info->alloc_start is a 64bits variant, can be accessed by
    multi-task, but it is not protected strictly, it can be changed
    while we are accessing it. On 32bit machine, we will get wrong
    value because we access it by two instructions.(In fact, it is
    also possible that the same problem happens on the 64bit machine,
    because the compiler may split the 64bit operation into two 32bit
    operation.)
    
    For example:
    Assuming -> alloc_start is 0x0000 0000 0001 0000 at the beginning,
    then we remount and set ->alloc_start to 0x0000 0100 0000 0000.
    	Task0 			Task1
    				load high 32 bits
    	set high 32 bits
    	set low 32 bits
    				load low 32 bits
    
    Task1 will get 0.
    
    This patch fixes this problem by using two locks to protect it
    	fs_info->chunk_mutex
    	sb->s_umount
    On the read side, we just need get one of these two locks, and on
    the write side, we must lock all of them.
    Signed-off-by: default avatarMiao Xie <miaox@cn.fujitsu.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
    c018daec
super.c 45.4 KB