In data venerdì 26 giugno 2015 17:35:44, 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 | 11 +++++++++++
4 files changed, 59 insertions(+), 1 deletion(-)
diff --git a/daemon/uuids.c b/daemon/uuids.c
index 5238f3e..4530491 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 ("don't know how to set the random UUID for '%s'
filesystems",
+ vfs_type);
+ r = -1;
Being a new API, we could make this return ENOTSUP, documenting this
error on unsupported filesystems. This way, users could know an error
is due to a filesystem not supported by this API, instead of a real
failure of one of the programs used.
+ }
+
+ return r;
+}
diff --git a/generator/actions.ml b/generator/actions.ml
index d5e5ccf..0328858 100644
--- a/generator/actions.ml
+++ b/generator/actions.ml
@@ -12593,6 +12593,22 @@ numbered C<partnum> on device C<device>.
It returns C<primary>, C<logical>, or C<extended>." };
+ { defaults with
+ name = "set_uuid_random"; added = (1, 29, 47);
+ style = RErr, [Device "device"], [];
+ proc_nr = Some 455;
+ tests = [
+ InitBasicFS, Always, TestRun (
+ [["set_uuid_random"; "/dev/sda1"]]), [];
+ ];
+ shortdesc = "set the random filesystem UUID";
This sounds like it is setting some particular random UUID. I'd be
better as
"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 515f19a..4930863 100644
--- a/src/MAX_PROC_NR
+++ b/src/MAX_PROC_NR
@@ -1 +1 @@
-454
+455
diff --git a/tests/btrfs/test-btrfs-misc.pl b/tests/btrfs/test-btrfs-misc.pl
index b47caab..4982f0d 100755
--- a/tests/btrfs/test-btrfs-misc.pl
+++ b/tests/btrfs/test-btrfs-misc.pl
@@ -64,5 +64,16 @@ if ($err == 0) {
warn "$0: skipping test for btrfs UUID change feature is not
available\n";
}
+# Setting btrfs random UUID.
+eval {
+ $g->set_uuid_random ("/dev/sda1")
+};
+# FIXME: ignore ESRCH
What is ESRCH about?
+my $err = $g->last_errno ();
+
+if ($err == Errno::ENOTSUP()) {
+ warn "$0: skipping test for btrfs UUID change feature is not
available\n";
+}
You need to care in case $err is non-zero, that is a real error.
Thanks,
--
Pino Toscano