btrfs-progs: fix return code for failed replace start

When replace starts with no-background and fails for the reason that
a BTRFS_FS_EXCL_OP is in progress, we still return the value 0 and also
leak the target device open, because in cmd_replace_start() we missed
the goto leave_with_error for this error.

So the test case btrfs/064 in its seqres.full output reports...

  Replacing /dev/sdf with /dev/sdc
  ERROR: /dev/sdc is mounted

instead of...

  Replacing /dev/sdc with /dev/sdf
  ERROR: ioctl(DEV_REPLACE_START) '/mnt/scratch': add/delete/balance/replace/resize operation in progress

for the failed replace attempts in the test case

Fix it by jumping to the error label which also fixes the leaked open
device.

Signed-off-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Anand Jain 2020-09-30 10:46:14 +08:00 committed by David Sterba
parent feb8f56ba2
commit ddf878187e
1 changed files with 3 additions and 1 deletions

View File

@ -323,9 +323,11 @@ static int cmd_replace_start(const struct cmd_struct *cmd,
goto leave_with_error;
}
if (ret > 0)
if (ret > 0) {
error("ioctl(DEV_REPLACE_START) '%s': %s", path,
btrfs_err_str(ret));
goto leave_with_error;
}
if (start_args.result != BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_RESULT &&
start_args.result != BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_ERROR) {