[Libguestfs] [PATCH] uuid: add support to change uuid of btrfs partition

Pino Toscano ptoscano at redhat.com
Tue Jun 23 09:50:29 UTC 2015


Hi,

In data martedì 23 giugno 2015 15:59:19, Chen Hanxiao ha scritto:
> btrfs-progs v4.1 add support to change uuid of btrfs fs.

This needs to support older btrfs-progs versions though, so run
btrfstune to check whether it has the -U parameter, and if not return
the old error message. Something like test_btrfs_device_add_needs_force
for example.

Also:

$ btrfs --version
btrfs-progs v4.0
$ btrfstune --help
btrfstune: invalid option -- '-'
usage: btrfstune [options] device
        -S value        positive value will enable seeding, zero to disable, negative is not allowed
        -r              enable extended inode refs
        -x              enable skinny metadata extent refs
        -f              force to set or clear flags, make sure that you are aware of the dangers

Would be cool if btrfs tools would support -h/--help, so it is not
considered an error (i.e. exiting with 1).

> 
> Signed-off-by: Chen Hanxiao <chenhanxiao at cn.fujitsu.com>
> ---
>  daemon/uuids.c       | 19 +++++++++++++++++--
>  generator/actions.ml |  4 ++++
>  2 files changed, 21 insertions(+), 2 deletions(-)
> 
> diff --git a/daemon/uuids.c b/daemon/uuids.c
> index 06b33e9..c18cb55 100644
> --- a/daemon/uuids.c
> +++ b/daemon/uuids.c
> @@ -30,6 +30,7 @@
>  GUESTFSD_EXT_CMD(str_tune2fs, tune2fs);
>  GUESTFSD_EXT_CMD(str_xfs_admin, xfs_admin);
>  GUESTFSD_EXT_CMD(str_swaplabel, swaplabel);
> +GUESTFSD_EXT_CMD(str_btrfstune, btrfstune);
>  
>  static int
>  e2uuid (const char *device, const char *uuid)
> @@ -91,6 +92,21 @@ swapuuid (const char *device, const char *uuid)
>    return 0;
>  }
>  
> +static int
> +btrfsuuid (const char *device, const char *uuid)
> +{
> +  int r;
> +  CLEANUP_FREE char *err = NULL;
> +
> +  r = command (NULL, &err, str_btrfstune, "-f", "-U", uuid, device, NULL);
> +  if (r == -1) {
> +    reply_with_error ("%s", err);
> +    return -1;
> +  }
> +
> +  return 0;
> +}

While other uuid methods are currently here in uuids.c, IMHO they would
better fit together with their filesystem implementations. Similar to
what I did with 6db3c100 and 8ad667f1 for labels.

>  int
>  do_set_uuid (const char *device, const char *uuid)
>  {
> @@ -111,8 +127,7 @@ do_set_uuid (const char *device, const char *uuid)
>      r = swapuuid (device, uuid);
>  
>    else if (STREQ (vfs_type, "btrfs")) {
> -    reply_with_error ("btrfs filesystems' UUID cannot be changed");
> -    r = -1;
> +    r = btrfsuuid (device, uuid);
>    }
>  
>    else {
> diff --git a/generator/actions.ml b/generator/actions.ml
> index d5e5ccf..ca77c87 100644
> --- a/generator/actions.ml
> +++ b/generator/actions.ml
> @@ -11774,6 +11774,10 @@ parameter.  In future we may allow other flags to be adjusted." };
>          InitBasicFS, Always, TestResultString (
>            [["set_uuid"; "/dev/sda1"; uuid];
>             ["vfs_uuid"; "/dev/sda1"]], uuid), [];
> +        InitPartition, Always, TestResultString (
> +          [["mkfs_btrfs"; "/dev/sda1"; ""; ""; "NOARG"; ""; "NOARG"; "NOARG"; ""; ""];
> +           ["set_uuid"; "/dev/sda1"; uuid];
> +           ["vfs_uuid"; "/dev/sda1"]], uuid), [];

Unfortunately this cannot be added, as it will fail with
btrfs-progs < 4.1. My suggestion is to add a simple shell test in
tests/btrfs, which would create a simple btrfs fs, try to change the
UUID and check that it either returned the old error message, or that
it succeeded.

Thanks,
-- 
Pino Toscano




More information about the Libguestfs mailing list