Chen Hanxiao
2015-Jun-23 07:59 UTC
[Libguestfs] [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
Pino Toscano
2015-Jun-23 09:50 UTC
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. 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
Chen, Hanxiao
2015-Jun-23 10:07 UTC
Re: [Libguestfs] [PATCH] uuid: add support to change uuid of btrfs partition
> -----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
Apparently Analagous Threads
- [PATCH 0/5] uuid: add btrfs uuid change support and some rework
- Re: [PATCH v2 1/5] uuid: add support to change uuid of btrfs partition
- Re: [PATCH] uuid: add support to change uuid of btrfs partition
- [PATCH v3 0/4] uuid: add btrfs uuid change support and some rework
- [PATCH v3.1 0/9] uuid: add btrfs uuid change support and set_uuid_random