diff mbox series

btrfs-progs: fix return code for failed replace start

Message ID 48194115537d723d04bba0505411525b77f3e73b.1601402292.git.anand.jain@oracle.com
State New, archived
Headers show
Series btrfs-progs: fix return code for failed replace start | expand

Commit Message

Anand Jain Sept. 30, 2020, 2:46 a.m. UTC
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 adding a goto leave_with_error for this error which also fixes
the device open leak.

Signed-off-by: Anand Jain <anand.jain@oracle.com>
This patch has passed fstests -g replace.

 cmds/replace.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
diff mbox series


diff --git a/cmds/replace.c b/cmds/replace.c
index 84fcb80ed495..f4e81574804e 100644
--- a/cmds/replace.c
+++ b/cmds/replace.c
@@ -297,9 +297,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,
+			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) {