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@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