[PATCH] uuid: add support to change uuid of btrfs partition
btrfs-progs v4.1 add support to change uuid of btrfs fs. 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; +} + 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), []; ]); shortdesc = "set the filesystem UUID"; longdesc = "\ -- 2.1.0
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
-----Original Message----- From: libguestfs-bounces@redhat.com [mailto:libguestfs-bounces@redhat.com] On Behalf Of Pino Toscano Sent: Tuesday, June 23, 2015 5:50 PM To: libguestfs@redhat.com Subject: Re: [Libguestfs] [PATCH] uuid: add support to change uuid of btrfs partition
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.
Sure.
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).
Unfortunately they don't have. I've talked to my colleagues, he said that this may be added if he had time. If I had time, I'll send a btrfs-progs patch for it. Also, for back compact, we may still use the old method as we did in daemon/btrfs.c.
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.
That sounds good. Like other XXuuid in uuids.c, it's a simple function. Or maybe we could do the same thing to other XXuuid.
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 for your comments. Will do in v2. Regards, - Chen
Thanks, -- Pino Toscano
_______________________________________________ Libguestfs mailing list Libguestfs@redhat.com https://www.redhat.com/mailman/listinfo/libguestfs
participants (3)
-
Chen Hanxiao -
Chen, Hanxiao -
Pino Toscano