Btrfs: allow for resuming restriper after it was paused
authorIlya Dryomov <idryomov@gmail.com>
Mon, 16 Jan 2012 20:04:49 +0000 (22:04 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 16 Jan 2012 20:04:49 +0000 (22:04 +0200)
Recognize BTRFS_BALANCE_RESUME flag passed from userspace.  We use the
same heuristics used when recovering balance after a crash to try to
start where we left off last time.

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/btrfs/ioctl.c

index 60852217ce9ae19294064e6f61bd3a0f06280c7d..85e546ffe3c7919c7c2c0b3c52f594fe7bd59f17 100644 (file)
@@ -3106,6 +3106,20 @@ static long btrfs_ioctl_balance(struct btrfs_root *root, void __user *arg)
                        ret = PTR_ERR(bargs);
                        goto out;
                }
+
+               if (bargs->flags & BTRFS_BALANCE_RESUME) {
+                       if (!fs_info->balance_ctl) {
+                               ret = -ENOTCONN;
+                               goto out_bargs;
+                       }
+
+                       bctl = fs_info->balance_ctl;
+                       spin_lock(&fs_info->balance_lock);
+                       bctl->flags |= BTRFS_BALANCE_RESUME;
+                       spin_unlock(&fs_info->balance_lock);
+
+                       goto do_balance;
+               }
        } else {
                bargs = NULL;
        }
@@ -3133,6 +3147,7 @@ static long btrfs_ioctl_balance(struct btrfs_root *root, void __user *arg)
                bctl->flags |= BTRFS_BALANCE_TYPE_MASK;
        }
 
+do_balance:
        ret = btrfs_balance(bctl, bargs);
        /*
         * bctl is freed in __cancel_balance or in free_fs_info if