Re: [PATCH] btrfs: Allow forced conversion of metadata to dup profile on multiple devices

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Feb 24, 2014 at 3:44 PM, Austin S Hemmelgarn
<ahferroin7@xxxxxxxxx> wrote:
> On 2014-02-24 08:37, Ilya Dryomov wrote:
>> On Thu, Feb 20, 2014 at 6:57 PM, David Sterba <dsterba@xxxxxxx> wrote:
>>> On Wed, Feb 19, 2014 at 11:10:41AM -0500, Austin S Hemmelgarn wrote:
>>>> Currently, btrfs balance start fails when trying to convert metadata or
>>>> system chunks to dup profile on filesystems with multiple devices.  This
>>>> requires that a conversion from a multi-device filesystem to a single
>>>> device filesystem use the following methodology:
>>>>     1. btrfs balance start -dconvert=single -mconvert=single \
>>>>        -sconvert=single -f /
>>>>     2. btrfs device delete / /dev/sdx
>>>>     3. btrfs balance start -mconvert=dup -sconvert=dup /
>>>> This results in a period of time (possibly very long if the devices are
>>>> big) where you don't have the protection guarantees of multiple copies
>>>> of metadata chunks.
>>>>
>>>> After applying this patch, one can instead use the following methodology
>>>> for conversion from a multi-device filesystem to a single device
>>>> filesystem:
>>>>     1. btrfs balance start -dconvert=single -mconvert=dup \
>>>>        -sconvert=dup -f /
>>>>     2. btrfs device delete / /dev/sdx
>>>> This greatly reduces the chances of the operation causing data loss due
>>>> to a read error during the device delete.
>>>>
>>>> Signed-off-by: Austin S. Hemmelgarn <ahferroin7@xxxxxxxxx>
>>> Reviewed-by: David Sterba <dsterba@xxxxxxx>
>>>
>>> Sounds useful. The muliple devices + DUP is allowed setup when the
>>> device is added, this patch only adds the 'delete' counterpart. The
>>> imroved data loss protection during the process is a good thing.
>>
>> Hi,
>>
>> Have you actually tried to queue it?  Unless I'm missing something, it won't
>> compile, and on top of that, it seems to be corrupted too..
> The patch itself was made using git, AFAICT it should be fine.  I've
> personally built and tested it using UML.

It doesn't look fine.  It was generated with git, but it got corrupted
on the way: either how you pasted it or the email client you use is the
problem.

On Wed, Feb 19, 2014 at 6:10 PM, Austin S Hemmelgarn
<ahferroin7@xxxxxxxxx> wrote:
> Currently, btrfs balance start fails when trying to convert metadata or
> system chunks to dup profile on filesystems with multiple devices.  This
> requires that a conversion from a multi-device filesystem to a single
> device filesystem use the following methodology:
>     1. btrfs balance start -dconvert=single -mconvert=single \
>        -sconvert=single -f /
>     2. btrfs device delete / /dev/sdx
>     3. btrfs balance start -mconvert=dup -sconvert=dup /
> This results in a period of time (possibly very long if the devices are
> big) where you don't have the protection guarantees of multiple copies
> of metadata chunks.
>
> After applying this patch, one can instead use the following methodology
> for conversion from a multi-device filesystem to a single device
> filesystem:
>     1. btrfs balance start -dconvert=single -mconvert=dup \
>        -sconvert=dup -f /
>     2. btrfs device delete / /dev/sdx
> This greatly reduces the chances of the operation causing data loss due
> to a read error during the device delete.
>
> Signed-off-by: Austin S. Hemmelgarn <ahferroin7@xxxxxxxxx>
> ---
>  fs/btrfs/volumes.c | 21 +++++++++++++++++----
>  1 file changed, 17 insertions(+), 4 deletions(-)
>
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index 07629e9..38a9522 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -3152,10 +3152,8 @@ int btrfs_balance(struct btrfs_balance_control
> *bctl,

^^^, that should be a single line

>                 num_devices--;
>         }
>         btrfs_dev_replace_unlock(&fs_info->dev_replace);
> -       allowed = BTRFS_AVAIL_ALLOC_BIT_SINGLE;
> -       if (num_devices == 1)
> -               allowed |= BTRFS_BLOCK_GROUP_DUP;
> -       else if (num_devices > 1)
> +       allowed = BTRFS_AVAIL_ALLOC_BIT_SINGLE | BTRFS_BLOCK_GROUP_DUP;
> +       if (num_devices > 1)
>                 allowed |= (BTRFS_BLOCK_GROUP_RAID0 | BTRFS_BLOCK_GROUP_RAID1);
>         if (num_devices > 2)
>                 allowed |= BTRFS_BLOCK_GROUP_RAID5;
> @@ -3221,6 +3219,21 @@ int btrfs_balance(struct btrfs_balance_control
> *bctl,

^^^, ditto

>                                 goto out;
>                         }
>                 }
> +               if (((bctl->sys.flags & BTRFS_BALANCE_ARGS_CONVERT) &&
> +                   (bctl->sys.target & ~BTRFS_BLOCK_GROUP_DUP) ||
> +                   (bctl->meta.flags & BTRFS_BALANCE_ARGS_CONVERT) &&
> +                   (bctl->meta.target & ~BTRFS_BLOCK_GROUP_DUP)) &&
> +                   (num_devs > 1)) {
> +                       if (bctl->flags & BTRFS_BALANCE_FORCE) {
> +                               btrfs_info(fs_info, "force conversion of metadata "
> +                                          "to dup profile on multiple devices");
> +                       } else {
> +                               btrfs_err(fs_info, "balance will reduce metadata "
> +                                         "integrity, use force if you want this");
> +                               ret = -EINVAL;
> +                               goto out;
> +                       }
> +               }
>         } while (read_seqretry(&fs_info->profiles_lock, seq));
>         if (bctl->sys.flags & BTRFS_BALANCE_ARGS_CONVERT) {

^^^, there should be 3 lines of context here.  It looks like an empty
line between "} while ..." and "if (bctl..." is missing.

There is probably more, those just stand out.

Thanks,

                Ilya
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux