diff mbox series

btrfs-progs: fix return code for failed replace start

Message ID 48194115537d723d04bba0505411525b77f3e73b.1601402292.git.anand.jain@oracle.com (mailing list archive)
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(-)

Comments

David Sterba Feb. 19, 2021, 7 p.m. UTC | #1
On Wed, Sep 30, 2020 at 10:46:14AM +0800, Anand Jain wrote:
> 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>

Added to devel, thanks.
diff mbox series

Patch

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,
 			      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) {