Signed-off-by: Chen Hanxiao <chenhanx...@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);
+    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 $@;
+    }
+}
+
 $g->shutdown ();
 $g->close ();
-- 
2.1.0

_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://www.redhat.com/mailman/listinfo/libguestfs

Reply via email to