In data martedì 30 giugno 2015 19:23:14, Chen Hanxiao ha scritto:
 Signed-off-by: Chen Hanxiao <chenhanxiao(a)cn.fujitsu.com>
 ---
  daemon/uuids.c                 | 31 +++++++++++++++++++++++++++++++
  generator/actions.ml           | 16 ++++++++++++++++
  src/MAX_PROC_NR                |  2 +-
  tests/btrfs/test-btrfs-misc.pl | 15 +++++++++++++++
  4 files changed, 63 insertions(+), 1 deletion(-)
 
 diff --git a/daemon/uuids.c b/daemon/uuids.c
 index 5238f3e..cd5787f 100644
 --- a/daemon/uuids.c
 +++ b/daemon/uuids.c
 @@ -85,3 +85,34 @@ do_set_uuid (const char *device, const char *uuid)
  
    return r;
  }
 +
 +int
 +do_set_uuid_random (const char *device)
 +{
 +  int r;
 +
 +  /* How we set the UUID depends on the filesystem type. */
 +  CLEANUP_FREE char *vfs_type = get_blkid_tag (device, "TYPE");
 +  if (vfs_type == NULL)
 +    return -1;
 +
 +  if (fstype_is_extfs (vfs_type))
 +    r = set_e2uuid_random (device);
 +
 +  else if (STREQ (vfs_type, "xfs"))
 +    r = xfs_set_uuid_random (device);
 +
 +  else if (STREQ (vfs_type, "swap"))
 +    r = swap_set_uuid_random (device);
 +
 +  else if (STREQ (vfs_type, "btrfs"))
 +    r = btrfs_set_uuid_random (device);
 +
 +  else {
 +    reply_with_error_errno (ENOTSUP, "don't know how to set the random UUID for
'%s' filesystems",
 +                      vfs_type); 
You can use a NOT_SUPPORTED(-1, "...") macro here.
 +    r = -1;
 +  }
 +
 +  return r;
 +}
 diff --git a/generator/actions.ml b/generator/actions.ml
 index 372e50e..52404ab 100644
 --- a/generator/actions.ml
 +++ b/generator/actions.ml
 @@ -12623,6 +12623,22 @@ removed from the filesystem.
  The C<targetdev> needs to be same size or larger than the C<srcdev>.
Devices
  which are currently mounted are never allowed to be used as the
C<targetdev>." };
  
 +  { defaults with
 +    name = "set_uuid_random"; added = (1, 29, 48);
 +    style = RErr, [Device "device"], [];
 +    proc_nr = Some 456;
 +    tests = [
 +        InitBasicFS, Always, TestRun (
 +            [["set_uuid_random"; "/dev/sda1"]]), [];
 +      ];
 +    shortdesc = "set a random UUID for the filesystem";
 +    longdesc = "\
 +Set the filesystem UUID on C<device> to a random UUID.
 +
 +Only some filesystem types support setting UUIDs.
 +
 +To read the UUID on a filesystem, call C<guestfs_vfs_uuid>." };
 +
  ]
  
  (* Non-API meta-commands available only in guestfish.
 diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR
 index 4930863..8d38505 100644
 --- a/src/MAX_PROC_NR
 +++ b/src/MAX_PROC_NR
 @@ -1 +1 @@
 -455
 +456
 diff --git a/tests/btrfs/test-btrfs-misc.pl b/tests/btrfs/test-btrfs-misc.pl
 index 0643eeb..224d075 100755
 --- a/tests/btrfs/test-btrfs-misc.pl
 +++ b/tests/btrfs/test-btrfs-misc.pl
 @@ -68,5 +68,20 @@ if ($@) {
      unless $uuid eq "12345678-1234-1234-1234-123456789012";
  }
  
 +# Setting btrfs random UUID.
 +eval {
 +    $g->set_uuid_random ("/dev/sda1")
 +};
 +
 +$err = $g->last_errno ();
 +
 +if ($@) {
 +    if ($err == Errno::ENOTSUP()) {
 +        warn "$0: skipping test for btrfs UUID change feature is not
available";
 +    } elsif ($err) {
 +        die $@;
 +    }
 +} 
Some note as in patch 1 about $@ and $err.
Thanks,
-- 
Pino Toscano