summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorIlya Dryomov2012-01-16 21:04:49 +0100
committerIlya Dryomov2012-01-16 21:04:49 +0100
commitde322263d3a6d4ffd4ed7c4d0c6536e9497aec9b (patch)
tree26761c92c8d135aa62702562bae3337ccad9f74d /fs
parentBtrfs: allow for canceling restriper (diff)
downloadkernel-qcow2-linux-de322263d3a6d4ffd4ed7c4d0c6536e9497aec9b.tar.gz
kernel-qcow2-linux-de322263d3a6d4ffd4ed7c4d0c6536e9497aec9b.tar.xz
kernel-qcow2-linux-de322263d3a6d4ffd4ed7c4d0c6536e9497aec9b.zip
Btrfs: allow for resuming restriper after it was paused
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>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/ioctl.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 60852217ce9a..85e546ffe3c7 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -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