From: Arne Jansen <sensille@gmx.net>
To: Ilya Dryomov <idryomov@gmail.com>
Cc: linux-btrfs@vger.kernel.org, Chris Mason <chris.mason@oracle.com>,
Hugo Mills <hugo@carfax.org.uk>
Subject: Re: [PATCH 17/21] Btrfs: allow for pausing restriper
Date: Tue, 01 Nov 2011 12:46:28 +0100 [thread overview]
Message-ID: <4EAFDC14.9040200@gmx.net> (raw)
In-Reply-To: <1314129722-31601-18-git-send-email-idryomov@gmail.com>
On 23.08.2011 22:01, Ilya Dryomov wrote:
> Implement an ioctl for pausing restriper. This pauses the relocation,
> but restripe is still considered to be "in progress": restriper item is
> not deleted, other volume operations cannot be started, etc. If paused
> in the middle of profile changing operation we will continue making
> allocations with the target profile.
>
> Add a hook to close_ctree() to be able to pause restriper and free it's
> data structures on unmount. (It's safe to unmount when restriper is in
> 'paused' state, we will resume with the same parameters on the next
> mount)
>
> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
> ---
> fs/btrfs/disk-io.c | 3 +++
> fs/btrfs/ioctl.c | 2 ++
> fs/btrfs/ioctl.h | 1 +
> fs/btrfs/volumes.c | 44 ++++++++++++++++++++++++++++++++++++++++++--
> fs/btrfs/volumes.h | 2 ++
> 5 files changed, 50 insertions(+), 2 deletions(-)
>
> diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
> index 662a6e6..7db5c50 100644
> --- a/fs/btrfs/disk-io.c
> +++ b/fs/btrfs/disk-io.c
> @@ -2542,6 +2542,9 @@ int close_ctree(struct btrfs_root *root)
> fs_info->closing = 1;
> smp_mb();
>
> + /* pause restriper and free restripe_ctl */
> + btrfs_pause_restripe(root->fs_info, 1);
> +
> btrfs_scrub_cancel(root);
>
> /* wait for any defraggers to finish */
> diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
> index d8bdb67..61978ac 100644
> --- a/fs/btrfs/ioctl.c
> +++ b/fs/btrfs/ioctl.c
> @@ -2921,6 +2921,8 @@ static long btrfs_ioctl_restripe_ctl(struct btrfs_root *root,
> switch (cmd) {
> case BTRFS_RESTRIPE_CTL_CANCEL:
> return btrfs_cancel_restripe(root->fs_info);
> + case BTRFS_RESTRIPE_CTL_PAUSE:
> + return btrfs_pause_restripe(root->fs_info, 0);
> }
>
> return -EINVAL;
> diff --git a/fs/btrfs/ioctl.h b/fs/btrfs/ioctl.h
> index 4f6ead5..e468d5b 100644
> --- a/fs/btrfs/ioctl.h
> +++ b/fs/btrfs/ioctl.h
> @@ -110,6 +110,7 @@ struct btrfs_ioctl_fs_info_args {
> };
>
> #define BTRFS_RESTRIPE_CTL_CANCEL 1
> +#define BTRFS_RESTRIPE_CTL_PAUSE 2
>
> struct btrfs_restripe_args {
> __u64 profiles;
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index cd43368..65deaa7 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -2555,7 +2555,8 @@ static int __btrfs_restripe(struct btrfs_root *dev_root)
> while (1) {
> struct btrfs_fs_info *fs_info = dev_root->fs_info;
>
> - if (test_bit(RESTRIPE_CANCEL_REQ, &fs_info->restripe_state)) {
> + if (test_bit(RESTRIPE_CANCEL_REQ, &fs_info->restripe_state) ||
> + test_bit(RESTRIPE_PAUSE_REQ, &fs_info->restripe_state)) {
> ret = -ECANCELED;
> goto error;
> }
> @@ -2730,7 +2731,9 @@ do_restripe:
> mutex_lock(&fs_info->restripe_mutex);
> clear_bit(RESTRIPE_RUNNING, &fs_info->restripe_state);
>
> - if (test_bit(RESTRIPE_CANCEL_REQ, &fs_info->restripe_state)) {
> + if (test_bit(RESTRIPE_CANCEL_REQ, &fs_info->restripe_state) ||
> + (!test_bit(RESTRIPE_PAUSE_REQ, &fs_info->restripe_state) &&
> + !test_bit(RESTRIPE_CANCEL_REQ, &fs_info->restripe_state))) {
> mutex_lock(&fs_info->volume_mutex);
>
> unset_restripe_control(fs_info);
> @@ -2858,6 +2861,43 @@ out:
> return ret;
> }
I don't see a difference in what CANCEL_REQ and PAUSE_REQ do, so it seems
one of them would be enough.
>
> +int btrfs_pause_restripe(struct btrfs_fs_info *fs_info, int unset)
> +{
> + int ret = 0;
> +
> + mutex_lock(&fs_info->restripe_mutex);
> + if (!fs_info->restripe_ctl) {
> + ret = -ENOTCONN;
> + goto out;
> + }
> +
> + /* only running restripe can be paused */
> + if (!test_bit(RESTRIPE_RUNNING, &fs_info->restripe_state)) {
> + ret = -ENOTCONN;
> + goto out_unset;
> + }
> +
> + set_bit(RESTRIPE_PAUSE_REQ, &fs_info->restripe_state);
> + while (test_bit(RESTRIPE_RUNNING, &fs_info->restripe_state)) {
> + mutex_unlock(&fs_info->restripe_mutex);
> + wait_event(fs_info->restripe_wait,
> + !test_bit(RESTRIPE_RUNNING,
> + &fs_info->restripe_state));
> + mutex_lock(&fs_info->restripe_mutex);
> + }
> + clear_bit(RESTRIPE_PAUSE_REQ, &fs_info->restripe_state);
> +
> +out_unset:
> + if (unset) {
> + mutex_lock(&fs_info->volume_mutex);
> + unset_restripe_control(fs_info);
> + mutex_unlock(&fs_info->volume_mutex);
> + }
> +out:
> + mutex_unlock(&fs_info->restripe_mutex);
> + return ret;
> +}
> +
This looks very similar to cancel_restripe. It should be easy to
merge them to one function without making a mess out of it.
> /*
> * shrinking a device means finding all of the device extents past
> * the new size, and then following the back refs to the chunks.
> diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
> index dd1fa7f..b8c234a 100644
> --- a/fs/btrfs/volumes.h
> +++ b/fs/btrfs/volumes.h
> @@ -204,6 +204,7 @@ struct map_lookup {
> */
> #define RESTRIPE_RUNNING 0
> #define RESTRIPE_CANCEL_REQ 1
> +#define RESTRIPE_PAUSE_REQ 2
>
> struct btrfs_restripe_args;
> struct restripe_control {
> @@ -261,6 +262,7 @@ int btrfs_balance(struct btrfs_root *dev_root);
> int btrfs_restripe(struct restripe_control *rctl, int resume);
> int btrfs_recover_restripe(struct btrfs_root *tree_root);
> int btrfs_cancel_restripe(struct btrfs_fs_info *fs_info);
> +int btrfs_pause_restripe(struct btrfs_fs_info *fs_info, int unset);
> int btrfs_chunk_readonly(struct btrfs_root *root, u64 chunk_offset);
> int find_free_dev_extent(struct btrfs_trans_handle *trans,
> struct btrfs_device *device, u64 num_bytes,
next prev parent reply other threads:[~2011-11-01 11:46 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-23 20:01 [PATCH 00/21] [RFC] Btrfs: restriper Ilya Dryomov
2011-08-23 20:01 ` [PATCH 01/21] Btrfs: get rid of *_alloc_profile fields Ilya Dryomov
2011-09-27 12:51 ` David Sterba
2011-08-23 20:01 ` [PATCH 02/21] Btrfs: introduce masks for chunk type and profile Ilya Dryomov
2011-08-23 20:01 ` [PATCH 03/21] Btrfs: add BTRFS_AVAIL_ALLOC_BIT_SINGLE bit Ilya Dryomov
2011-11-01 7:56 ` Arne Jansen
2011-08-23 20:01 ` [PATCH 04/21] Btrfs: make avail_*_alloc_bits fields dynamic Ilya Dryomov
2011-08-23 20:01 ` [PATCH 05/21] Btrfs: add basic restriper infrastructure Ilya Dryomov
2011-11-01 10:08 ` Arne Jansen
2011-11-01 11:07 ` David Sterba
2011-11-01 11:08 ` Arne Jansen
2011-08-23 20:01 ` [PATCH 06/21] Btrfs: implement online profile changing Ilya Dryomov
2011-08-23 20:01 ` [PATCH 07/21] Btrfs: add basic infrastructure for selective balancing Ilya Dryomov
2011-09-27 13:02 ` David Sterba
2011-09-27 17:28 ` Ilya Dryomov
2011-08-23 20:01 ` [PATCH 08/21] Btrfs: soft profile changing mode (aka soft convert) Ilya Dryomov
2011-08-23 20:01 ` [PATCH 09/21] Btrfs: profiles filter Ilya Dryomov
2011-08-23 20:01 ` [PATCH 10/21] Btrfs: usage filter Ilya Dryomov
2011-09-27 13:22 ` David Sterba
2011-11-01 10:18 ` Arne Jansen
2011-08-23 20:01 ` [PATCH 11/21] Btrfs: devid filter Ilya Dryomov
2011-08-23 20:01 ` [PATCH 12/21] Btrfs: devid subset filter Ilya Dryomov
2011-08-23 20:01 ` [PATCH 13/21] Btrfs: virtual address space " Ilya Dryomov
2011-08-23 20:01 ` [PATCH 14/21] Btrfs: save restripe parameters to disk Ilya Dryomov
2011-09-27 13:43 ` David Sterba
2011-11-01 10:29 ` Arne Jansen
2011-08-23 20:01 ` [PATCH 15/21] Btrfs: recover restripe on mount Ilya Dryomov
2011-11-01 10:57 ` Arne Jansen
2011-08-23 20:01 ` [PATCH 16/21] Btrfs: allow for cancelling restriper Ilya Dryomov
2011-08-23 20:01 ` [PATCH 17/21] Btrfs: allow for pausing restriper Ilya Dryomov
2011-11-01 11:46 ` Arne Jansen [this message]
2011-08-23 20:01 ` [PATCH 18/21] Btrfs: allow for resuming restriper after it was paused Ilya Dryomov
2011-08-23 20:02 ` [PATCH 19/21] Btrfs: add skip_restripe mount option Ilya Dryomov
2011-08-23 20:02 ` [PATCH 20/21] Btrfs: get rid of btrfs_balance() function Ilya Dryomov
2011-08-23 20:02 ` [PATCH 21/21] Btrfs: add restripe progress reporting Ilya Dryomov
2011-09-27 12:47 ` [PATCH 00/21] [RFC] Btrfs: restriper David Sterba
2011-11-14 23:59 ` Phillip Susi
2011-11-15 9:22 ` Ilya Dryomov
2011-11-15 14:33 ` Phillip Susi
2011-11-15 15:06 ` Ilya Dryomov
2011-11-17 3:13 ` Phillip Susi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4EAFDC14.9040200@gmx.net \
--to=sensille@gmx.net \
--cc=chris.mason@oracle.com \
--cc=hugo@carfax.org.uk \
--cc=idryomov@gmail.com \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.