Btrfs: return failure if btrfs_dev_replace_finishing() failed
authorEryu Guan <guaneryu@gmail.com>
Mon, 13 Oct 2014 04:42:12 +0000 (12:42 +0800)
committerChris Mason <clm@fb.com>
Fri, 21 Nov 2014 01:14:28 +0000 (17:14 -0800)
commit2fc9f6baa24ac230166df41ed636224969523341
tree41ea291cb5ab8d7d1eef3c4c5a49afddec266a1b
parent6b3a4d60dbf7a60b91d810498e8c212f26718efd
Btrfs: return failure if btrfs_dev_replace_finishing() failed

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: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/dev-replace.c
include/uapi/linux/btrfs.h