On Mon, Aug 20, 2012 at 03:51:54PM +0800, Wanlong Gao
wrote:> Add new api xfs_admin to change parameters of an XFS filesystem.
>
> Signed-off-by: Wanlong Gao <gaowanlong at cn.fujitsu.com>
I've just realized that I forgot about the virt-diff patch that
you sent two weeks ago. Can you resend that, rebased?
> daemon/xfs.c | 78
++++++++++++++++++++++++++++++++++++++++++
> generator/generator_actions.ml | 21 ++++++++++++
> gobject/Makefile.inc | 6 ++--
> guestfs-release-notes.txt | 1 +
> po/POTFILES | 1 +
> src/MAX_PROC_NR | 2 +-
> 6 files changed, 106 insertions(+), 3 deletions(-)
>
> diff --git a/daemon/xfs.c b/daemon/xfs.c
> index b331b9b..b32d256 100644
> --- a/daemon/xfs.c
> +++ b/daemon/xfs.c
> @@ -460,3 +460,81 @@ error:
> if (out) free (out);
> return NULL;
> }
> +
> +char *
> +do_xfs_admin (const char *device,
> + int extunwritten, int imgfile, int v2log,
> + int printlabel, int projid32bit, int printuuid,
> + int lazycounter, const char *label, const char *uuid)
> +{
> + int r;
> + char *out = NULL, *err = NULL;
> + const char *argv[MAX_ARGS];
> + size_t i = 0;
> +
> + ADD_ARG (argv, i, "xfs_admin");
> +
> + /* Optional arguments */
> + if (!(optargs_bitmask & GUESTFS_XFS_ADMIN_EXTUNWRITTEN_BITMASK))
> + extunwritten = 0;
> + if (!(optargs_bitmask & GUESTFS_XFS_ADMIN_IMGFILE_BITMASK))
> + imgfile = 0;
> + if (!(optargs_bitmask & GUESTFS_XFS_ADMIN_V2LOG_BITMASK))
> + v2log = 0;
> + if (!(optargs_bitmask & GUESTFS_XFS_ADMIN_PRINTLABEL_BITMASK))
> + printlabel = 0;
> + if (!(optargs_bitmask & GUESTFS_XFS_ADMIN_PRINTUUID_BITMASK))
> + printuuid = 0;
> + if (!(optargs_bitmask & GUESTFS_XFS_ADMIN_PROJID32BIT_BITMASK))
> + projid32bit = 0;
> +
> + if (extunwritten)
> + ADD_ARG (argv, i, "-e");
> + if (imgfile)
> + ADD_ARG (argv, i, "-f");
> + if (v2log)
> + ADD_ARG (argv, i, "-j");
> + if (printlabel)
> + ADD_ARG (argv, i, "-l");
> + if (printuuid)
> + ADD_ARG (argv, i, "-u");
> + if (projid32bit)
> + ADD_ARG (argv, i, "-p");
> +
> + if (optargs_bitmask & GUESTFS_XFS_ADMIN_LAZYCOUNTER_BITMASK) {
> + if (lazycounter) {
> + ADD_ARG (argv, i, "-c");
> + ADD_ARG (argv, i, "1");
> + } else {
> + ADD_ARG (argv, i, "-c");
> + ADD_ARG (argv, i, "0");
> + }
> + }
> +
> + if (optargs_bitmask & GUESTFS_XFS_ADMIN_LABEL_BITMASK) {
> + ADD_ARG (argv, i, "-L");
> + ADD_ARG (argv, i, label);
> + }
> +
> + if (optargs_bitmask & GUESTFS_XFS_ADMIN_UUID_BITMASK) {
> + ADD_ARG (argv, i, "-U");
> + ADD_ARG (argv, i, uuid);
> + }
> +
> + ADD_ARG (argv, i, device);
> + ADD_ARG (argv, i, NULL);
> +
> + r = commandv (&out, &err, argv);
> + if (r == -1) {
> + reply_with_error ("%s: %s", device, err);
> + goto error;
> + }
> +
> + free (err);
> + return out;
What is the output of the xfs_admin command? I don't think we should
return unstructured strings, so either this output should be parsed if
it contains useful information, or it should be dropped.
> +error:
> + if (err) free (err);
> + if (out) free (out);
> + return NULL;
> +}
> diff --git a/generator/generator_actions.ml
b/generator/generator_actions.ml
> index d45558d..5173503 100644
> --- a/generator/generator_actions.ml
> +++ b/generator/generator_actions.ml
> @@ -9432,6 +9432,27 @@ empty files in the directory C<dir> with names
C<00000000>
> through C<nr-1> (ie. each file name is 8 digits long padded
> with zeroes)." };
>
> + { defaults with
> + name = "xfs_admin";
> + style = RString "info", [Device "device"], [OBool
"extunwritten"; OBool "imgfile"; OBool "v2log";
OBool "printlabel"; OBool "projid32bit"; OBool
"printuuid"; OBool "lazycounter"; OString "label";
OString "uuid"];
As above, either the output should be parsed, or this function
should return RErr.
> + proc_nr = Some 349;
> + optional = Some "xfs";
> + tests = [
> + InitEmpty, IfAvailable "xfs", TestOutputStruct (
> + [["part_disk"; "/dev/sda"; "mbr"];
> + ["mkfs"; "xfs"; "/dev/sda1";
""; "NOARG"; ""; ""];
> + ["xfs_admin"; "/dev/sda1"; "";
""; ""; ""; ""; "";
"false"; ""; ""];
> + ["mount"; "/dev/sda1"; "/"];
> + ["xfs_info"; "/"]],
> + [CompareWithInt ("xfs_lazycount", 0);
> + ])
> + ];
> + shortdesc = "change parameters of an XFS filesystem";
> + longdesc = "\
> +Devices that are mounted cannot be modified. Administrators must unmount
> +filesystems before C<xfs_admin> can convert parameters. A number of
parameters
> +of a mounted filesystem can be examined and modified using the
C<xfs_growfs>." };
> +
> ]
>
> (* Non-API meta-commands available only in guestfish.
> diff --git a/gobject/Makefile.inc b/gobject/Makefile.inc
> index 49f9538..9f81cd2 100644
> --- a/gobject/Makefile.inc
> +++ b/gobject/Makefile.inc
> @@ -72,7 +72,8 @@ guestfs_gobject_headers= \
> include/guestfs-gobject/optargs-xfs_growfs.h \
> include/guestfs-gobject/optargs-rsync.h \
> include/guestfs-gobject/optargs-rsync_in.h \
> - include/guestfs-gobject/optargs-rsync_out.h
> + include/guestfs-gobject/optargs-rsync_out.h \
> + include/guestfs-gobject/optargs-xfs_admin.h
>
> guestfs_gobject_sources= \
> src/session.c \
> @@ -126,4 +127,5 @@ guestfs_gobject_sources= \
> src/optargs-xfs_growfs.c \
> src/optargs-rsync.c \
> src/optargs-rsync_in.c \
> - src/optargs-rsync_out.c
> + src/optargs-rsync_out.c \
> + src/optargs-xfs_admin.c
> diff --git a/guestfs-release-notes.txt b/guestfs-release-notes.txt
> index 8fe0103..3c7d02b 100644
> --- a/guestfs-release-notes.txt
> +++ b/guestfs-release-notes.txt
> @@ -89,6 +89,7 @@ RELEASE NOTES FOR LIBGUESTFS 1.20
>
> For further information, see
> https://bugzilla.redhat.com/show_bug.cgi?id=788642
> + <https://bugzilla.redhat.com/show_bug.cgi?id=788642>
>
> New APIs
>
> diff --git a/po/POTFILES b/po/POTFILES
> index 60887dc..d961ac1 100644
> --- a/po/POTFILES
> +++ b/po/POTFILES
> @@ -167,6 +167,7 @@ gobject/src/optargs-tar_out.c
> gobject/src/optargs-tune2fs.c
> gobject/src/optargs-umount.c
> gobject/src/optargs-umount_local.c
> +gobject/src/optargs-xfs_admin.c
> gobject/src/optargs-xfs_growfs.c
> gobject/src/session.c
> gobject/src/struct-application.c
> diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR
> index 71627d7..aef2e27 100644
> --- a/src/MAX_PROC_NR
> +++ b/src/MAX_PROC_NR
> @@ -1 +1 @@
> -348
> +349
> --
> 1.7.12
The API looks fine, but I don't like the fact that it returns an
unstructured string.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
libguestfs lets you edit virtual machines. Supports shell scripting,
bindings from many languages. http://libguestfs.org