• Eryu Guan's avatar
    Btrfs: return failure if btrfs_dev_replace_finishing() failed · 2fc9f6ba
    Eryu Guan authored
    device replace could fail due to another running scrub process or any
    other errors btrfs_scrub_dev() may hit, but this failure doesn't get
    returned to userspace.
    
    The following steps could reproduce this issue
    
    	mkfs -t btrfs -f /dev/sdb1 /dev/sdb2
    	mount /dev/sdb1 /mnt/btrfs
    	while true; do btrfs scrub start -B /mnt/btrfs >/dev/null 2>&1; done &
    	btrfs replace start -Bf /dev/sdb2 /dev/sdb3 /mnt/btrfs
    	# if this replace succeeded, do the following and repeat until
    	# you see this log in dmesg
    	# BTRFS: btrfs_scrub_dev(/dev/sdb2, 2, /dev/sdb3) failed -115
    	#btrfs replace start -Bf /dev/sdb3 /dev/sdb2 /mnt/btrfs
    
    	# once you see the error log in dmesg, check return value of
    	# replace
    	echo $?
    
    Introduce a new dev replace result
    
    BTRFS_IOCTL_DEV_REPLACE_RESULT_SCRUB_INPROGRESS
    
    to catch -EINPROGRESS explicitly and return other errors directly to
    userspace.
    Signed-off-by: default avatarEryu Guan <guaneryu@gmail.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    2fc9f6ba
dev-replace.c 29.5 KB