Disable the test case temporarily for 2 reasons: 1. Because the default test disk size is 500M, while btrfs convert command think it is too small to convert it(actually, just add 10M or 20M more is enough). 2. Btrfs-progs has may have a tiny bug, when execute the command in guestfish, it report some error, but convert the filesystem to btrfs successfully. Signed-off-by: Pino Tsao <caoj.fnst@cn.fujitsu.com> --- daemon/btrfs.c | 29 +++++++++++++++++++++++++++++ generator/actions.ml | 18 ++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/daemon/btrfs.c b/daemon/btrfs.c index 39392f7..fd679cf 100644 --- a/daemon/btrfs.c +++ b/daemon/btrfs.c @@ -38,6 +38,7 @@ GUESTFSD_EXT_CMD(str_btrfsck, btrfsck); GUESTFSD_EXT_CMD(str_mkfs_btrfs, mkfs.btrfs); GUESTFSD_EXT_CMD(str_umount, umount); GUESTFSD_EXT_CMD(str_btrfsimage, btrfs-image); +GUESTFSD_EXT_CMD(str_btrfsconvert, btrfs-convert); int optgroup_btrfs_available (void) @@ -2083,3 +2084,31 @@ do_btrfs_image (char *const *sources, const char *image, return 0; } + +int +do_btrfs_convert (const char *device, int rollback) +{ + const size_t MAX_ARGS = 64; + const char *argv[MAX_ARGS]; + size_t i = 0; + CLEANUP_FREE char *err = NULL; + CLEANUP_FREE char *out = NULL; + int r; + + ADD_ARG (argv, i, str_btrfsconvert); + ADD_ARG (argv, i, device); + + if ((optargs_bitmask & GUESTFS_BTRFS_CONVERT_ROLLBACK_BITMASK) && rollback) + ADD_ARG (argv, i, "-r"); + + ADD_ARG (argv, i, NULL); + + r = commandv (&out, &err, argv); + if (r == -1) { + reply_with_error ("%s: %s", device, err); + return -1; + } + + return 0; +} + diff --git a/generator/actions.ml b/generator/actions.ml index 1a89869..e42f02d 100644 --- a/generator/actions.ml +++ b/generator/actions.ml @@ -12579,6 +12579,24 @@ numbered C<partnum> on device C<device>. It returns C<primary>, C<logical>, or C<extended>." }; + { defaults with + name = "btrfs_convert"; + style = RErr, [Device "device"], [OBool "rollback"]; + proc_nr = Some 455; + optional = Some "btrfs"; camel_name = "BTRFSConvert"; + tests = [ + InitEmpty, Disabled, TestRun ( + [["mkfs"; "ext2"; "/dev/sda"; ""; "NOARG"; ""; ""; "NOARG"]; + ["btrfs_convert"; "/dev/sda"; ""]; + ["btrfs_convert"; "/dev/sda"; "true"]]), [] + ]; + shortdesc = "convert from ext2/3/4 filesystem to btrfs or rollback"; + longdesc = "\ +This is used to convert existed ext2/3/4 to btrfs filesystem, and the original +filesystem image is accessible as from separate subvolume named ext2_saved as file image. + +If you want to rollback to ext2/3/4, set rollback to true." }; + ] (* Non-API meta-commands available only in guestfish. -- 2.1.0
Pino Toscano
2015-Jun-04 16:37 UTC
Re: [Libguestfs] [PATCH RFC][Resend] New API: btrfs_convert
Hi, In data giovedì 4 giugno 2015 11:56:41, Pino Tsao ha scritto:> Disable the test case temporarily for 2 reasons: > 1. Because the default test disk size is 500M, while btrfs > convert command think it is too small to convert it(actually, > just add 10M or 20M more is enough).If the base test disks that are available in tests/c-api/tests are not enough, just write the test (creating handle, scratch disks, partitions, etc) in shell or perl, just like the other ones available in tests/btrfs. This kind of API needs at least some basic coverage.> 2. Btrfs-progs has may have a tiny bug, when execute the command > in guestfish, it report some error, but convert the filesystem to > btrfs successfully.I don't understand, are you saying that `btrfs convert` will exit with failure but doing the actual changes? If so, is that a known/reported upstream bug?> > Signed-off-by: Pino Tsao <caoj.fnst@cn.fujitsu.com> > --- > daemon/btrfs.c | 29 +++++++++++++++++++++++++++++ > generator/actions.ml | 18 ++++++++++++++++++ > 2 files changed, 47 insertions(+) > > diff --git a/daemon/btrfs.c b/daemon/btrfs.c > index 39392f7..fd679cf 100644 > --- a/daemon/btrfs.c > +++ b/daemon/btrfs.c > @@ -38,6 +38,7 @@ GUESTFSD_EXT_CMD(str_btrfsck, btrfsck); > GUESTFSD_EXT_CMD(str_mkfs_btrfs, mkfs.btrfs); > GUESTFSD_EXT_CMD(str_umount, umount); > GUESTFSD_EXT_CMD(str_btrfsimage, btrfs-image); > +GUESTFSD_EXT_CMD(str_btrfsconvert, btrfs-convert); > > int > optgroup_btrfs_available (void) > @@ -2083,3 +2084,31 @@ do_btrfs_image (char *const *sources, const char *image, > > return 0; > } > + > +int > +do_btrfs_convert (const char *device, int rollback) > +{ > + const size_t MAX_ARGS = 64; > + const char *argv[MAX_ARGS]; > + size_t i = 0; > + CLEANUP_FREE char *err = NULL; > + CLEANUP_FREE char *out = NULL; > + int r; > + > + ADD_ARG (argv, i, str_btrfsconvert); > + ADD_ARG (argv, i, device); > + > + if ((optargs_bitmask & GUESTFS_BTRFS_CONVERT_ROLLBACK_BITMASK) && rollback) > + ADD_ARG (argv, i, "-r"); > + > + ADD_ARG (argv, i, NULL); > + > + r = commandv (&out, &err, argv); > + if (r == -1) { > + reply_with_error ("%s: %s", device, err); > + return -1; > + } > + > + return 0; > +}"out" seems not used, so no need to collect it from commandv.> diff --git a/generator/actions.ml b/generator/actions.ml > index 1a89869..e42f02d 100644 > --- a/generator/actions.ml > +++ b/generator/actions.ml > @@ -12579,6 +12579,24 @@ numbered C<partnum> on device C<device>. > > It returns C<primary>, C<logical>, or C<extended>." }; > > + { defaults with > + name = "btrfs_convert"; > + style = RErr, [Device "device"], [OBool "rollback"]; > + proc_nr = Some 455; > + optional = Some "btrfs"; camel_name = "BTRFSConvert"; > + tests = [ > + InitEmpty, Disabled, TestRun ( > + [["mkfs"; "ext2"; "/dev/sda"; ""; "NOARG"; ""; ""; "NOARG"]; > + ["btrfs_convert"; "/dev/sda"; ""]; > + ["btrfs_convert"; "/dev/sda"; "true"]]), [] > + ];^ extra white spaces at the end> + shortdesc = "convert from ext2/3/4 filesystem to btrfs or rollback"; > + longdesc = "\ > +This is used to convert existed ext2/3/4 to btrfs filesystem, and the original > +filesystem image is accessible as from separate subvolume named ext2_saved as file image.While I understand you copied this description from the btrfs-convert(1) man page, please at least make sure it is proper grammar: This is used to convert an existing ext2/3/4 filesystem to btrfs; a copy of the original filesystem image is still available in a separate subvolume named "ext2_saved". Is it still correct? If the upstream documentation is still incorrect, please report the mistakes so it can be fixed there. Thanks, -- Pino Toscano
Hi Toscano 在 2015年06月05日 00:37, Pino Toscano 写道:> Hi, > > In data giovedì 4 giugno 2015 11:56:41, Pino Tsao ha scritto: >> Disable the test case temporarily for 2 reasons: >> 1. Because the default test disk size is 500M, while btrfs >> convert command think it is too small to convert it(actually, >> just add 10M or 20M more is enough). > > If the base test disks that are available in tests/c-api/tests are > not enough, just write the test (creating handle, scratch disks, > partitions, etc) in shell or perl, just like the other ones available > in tests/btrfs. > > This kind of API needs at least some basic coverage.Ok, I can do that. But actually, I think the following 2nd problem matters more, I mean, even if I write the test, but it will still fail ,because of the tiny problem of btrfs-convert> >> 2. Btrfs-progs has may have a tiny bug, when execute the command >> in guestfish, it report some error, but convert the filesystem to >> btrfs successfully. > > I don't understand, are you saying that `btrfs convert` will exit with > failure but doing the actual changes? If so, is that a known/reported > upstream bug? >Yes, exactly, it exit with failure but actually got what we want: convert fs from ext2/3/4 to btrfs successfully. While it can rollback normally without any error. I did the test in guestfish using a img file, and I also checked the result by examining img file outside the guestfish, prove that the API worked. I searched in the btrfs mail list archive, did`t see it is a known bug. because the btrfs convert command works well in my host. It just has that problem in supermin appliance for me for now. I will keep following this problem, with my colleague, who is a contributor of btrfs-progs>> >> Signed-off-by: Pino Tsao <caoj.fnst@cn.fujitsu.com> >> --- >> daemon/btrfs.c | 29 +++++++++++++++++++++++++++++ >> generator/actions.ml | 18 ++++++++++++++++++ >> 2 files changed, 47 insertions(+) >> >> diff --git a/daemon/btrfs.c b/daemon/btrfs.c >> index 39392f7..fd679cf 100644 >> --- a/daemon/btrfs.c >> +++ b/daemon/btrfs.c >> @@ -38,6 +38,7 @@ GUESTFSD_EXT_CMD(str_btrfsck, btrfsck); >> GUESTFSD_EXT_CMD(str_mkfs_btrfs, mkfs.btrfs); >> GUESTFSD_EXT_CMD(str_umount, umount); >> GUESTFSD_EXT_CMD(str_btrfsimage, btrfs-image); >> +GUESTFSD_EXT_CMD(str_btrfsconvert, btrfs-convert); >> >> int >> optgroup_btrfs_available (void) >> @@ -2083,3 +2084,31 @@ do_btrfs_image (char *const *sources, const char *image, >> >> return 0; >> } >> + >> +int >> +do_btrfs_convert (const char *device, int rollback) >> +{ >> + const size_t MAX_ARGS = 64; >> + const char *argv[MAX_ARGS]; >> + size_t i = 0; >> + CLEANUP_FREE char *err = NULL; >> + CLEANUP_FREE char *out = NULL; >> + int r; >> + >> + ADD_ARG (argv, i, str_btrfsconvert); >> + ADD_ARG (argv, i, device); >> + >> + if ((optargs_bitmask & GUESTFS_BTRFS_CONVERT_ROLLBACK_BITMASK) && rollback) >> + ADD_ARG (argv, i, "-r"); >> + >> + ADD_ARG (argv, i, NULL); >> + >> + r = commandv (&out, &err, argv); >> + if (r == -1) { >> + reply_with_error ("%s: %s", device, err); >> + return -1; >> + } >> + >> + return 0; >> +} > > "out" seems not used, so no need to collect it from commandv. >affirmative.>> diff --git a/generator/actions.ml b/generator/actions.ml >> index 1a89869..e42f02d 100644 >> --- a/generator/actions.ml >> +++ b/generator/actions.ml >> @@ -12579,6 +12579,24 @@ numbered C<partnum> on device C<device>. >> >> It returns C<primary>, C<logical>, or C<extended>." }; >> >> + { defaults with >> + name = "btrfs_convert"; >> + style = RErr, [Device "device"], [OBool "rollback"]; >> + proc_nr = Some 455; >> + optional = Some "btrfs"; camel_name = "BTRFSConvert"; >> + tests = [ >> + InitEmpty, Disabled, TestRun ( >> + [["mkfs"; "ext2"; "/dev/sda"; ""; "NOARG"; ""; ""; "NOARG"]; >> + ["btrfs_convert"; "/dev/sda"; ""]; >> + ["btrfs_convert"; "/dev/sda"; "true"]]), [] >> + ]; > > ^ extra white spaces at the endaffirmative.> >> + shortdesc = "convert from ext2/3/4 filesystem to btrfs or rollback"; >> + longdesc = "\ >> +This is used to convert existed ext2/3/4 to btrfs filesystem, and the original >> +filesystem image is accessible as from separate subvolume named ext2_saved as file image. > > While I understand you copied this description from the btrfs-convert(1) > man page, please at least make sure it is proper grammar: > > This is used to convert an existing ext2/3/4 filesystem to btrfs; > a copy of the original filesystem image is still available in a > separate subvolume named "ext2_saved". >affirmative.> Is it still correct? > If the upstream documentation is still incorrect, please report the > mistakes so it can be fixed there.I am not sure what correct you are talking about. I use the latest btrfs-progs(4.0.1), and I check it with "btrfs subvolume list <path>": ID 256 gen 13 top level 5 path ext2_saved the orginal filesystem is accessible as a file named "image" in dir named "ext2_save", where the subvolue mount> > Thanks, >-- Yours Sincerely, Pino Tsao
Pino Tsao
2015-Jun-05 06:26 UTC
Re: [Libguestfs] [PATCH RFC][Resend] New API: btrfs_convert
Hi Toscano, please see my comment inline in the last section:) 在 2015年06月05日 00:37, Pino Toscano 写道:> Hi, > > In data giovedì 4 giugno 2015 11:56:41, Pino Tsao ha scritto: >> Disable the test case temporarily for 2 reasons: >> 1. Because the default test disk size is 500M, while btrfs >> convert command think it is too small to convert it(actually, >> just add 10M or 20M more is enough). > > If the base test disks that are available in tests/c-api/tests are > not enough, just write the test (creating handle, scratch disks, > partitions, etc) in shell or perl, just like the other ones available > in tests/btrfs. > > This kind of API needs at least some basic coverage. > >> 2. Btrfs-progs has may have a tiny bug, when execute the command >> in guestfish, it report some error, but convert the filesystem to >> btrfs successfully. > > I don't understand, are you saying that `btrfs convert` will exit with > failure but doing the actual changes? If so, is that a known/reported > upstream bug? > >> >> Signed-off-by: Pino Tsao <caoj.fnst@cn.fujitsu.com> >> --- >> daemon/btrfs.c | 29 +++++++++++++++++++++++++++++ >> generator/actions.ml | 18 ++++++++++++++++++ >> 2 files changed, 47 insertions(+) >> >> diff --git a/daemon/btrfs.c b/daemon/btrfs.c >> index 39392f7..fd679cf 100644 >> --- a/daemon/btrfs.c >> +++ b/daemon/btrfs.c >> @@ -38,6 +38,7 @@ GUESTFSD_EXT_CMD(str_btrfsck, btrfsck); >> GUESTFSD_EXT_CMD(str_mkfs_btrfs, mkfs.btrfs); >> GUESTFSD_EXT_CMD(str_umount, umount); >> GUESTFSD_EXT_CMD(str_btrfsimage, btrfs-image); >> +GUESTFSD_EXT_CMD(str_btrfsconvert, btrfs-convert); >> >> int >> optgroup_btrfs_available (void) >> @@ -2083,3 +2084,31 @@ do_btrfs_image (char *const *sources, const char *image, >> >> return 0; >> } >> + >> +int >> +do_btrfs_convert (const char *device, int rollback) >> +{ >> + const size_t MAX_ARGS = 64; >> + const char *argv[MAX_ARGS]; >> + size_t i = 0; >> + CLEANUP_FREE char *err = NULL; >> + CLEANUP_FREE char *out = NULL; >> + int r; >> + >> + ADD_ARG (argv, i, str_btrfsconvert); >> + ADD_ARG (argv, i, device); >> + >> + if ((optargs_bitmask & GUESTFS_BTRFS_CONVERT_ROLLBACK_BITMASK) && rollback) >> + ADD_ARG (argv, i, "-r"); >> + >> + ADD_ARG (argv, i, NULL); >> + >> + r = commandv (&out, &err, argv); >> + if (r == -1) { >> + reply_with_error ("%s: %s", device, err); >> + return -1; >> + } >> + >> + return 0; >> +} > > "out" seems not used, so no need to collect it from commandv. > >> diff --git a/generator/actions.ml b/generator/actions.ml >> index 1a89869..e42f02d 100644 >> --- a/generator/actions.ml >> +++ b/generator/actions.ml >> @@ -12579,6 +12579,24 @@ numbered C<partnum> on device C<device>. >> >> It returns C<primary>, C<logical>, or C<extended>." }; >> >> + { defaults with >> + name = "btrfs_convert"; >> + style = RErr, [Device "device"], [OBool "rollback"]; >> + proc_nr = Some 455; >> + optional = Some "btrfs"; camel_name = "BTRFSConvert"; >> + tests = [ >> + InitEmpty, Disabled, TestRun ( >> + [["mkfs"; "ext2"; "/dev/sda"; ""; "NOARG"; ""; ""; "NOARG"]; >> + ["btrfs_convert"; "/dev/sda"; ""]; >> + ["btrfs_convert"; "/dev/sda"; "true"]]), [] >> + ]; > > ^ extra white spaces at the end > >> + shortdesc = "convert from ext2/3/4 filesystem to btrfs or rollback"; >> + longdesc = "\ >> +This is used to convert existed ext2/3/4 to btrfs filesystem, and the original >> +filesystem image is accessible as from separate subvolume named ext2_saved as file image. > > While I understand you copied this description from the btrfs-convert(1) > man page, please at least make sure it is proper grammar: > > This is used to convert an existing ext2/3/4 filesystem to btrfs; > a copy of the original filesystem image is still available in a > separate subvolume named "ext2_saved". > > Is it still correct?I think I misunderstood you just now. Yes, it is still right. I think your correction is better and more clearly, the original description is a little complicated for guys who are not native speaker of English.> If the upstream documentation is still incorrect, please report the > mistakes so it can be fixed there. > > Thanks, >-- Yours Sincerely, Cao Jin