[Libguestfs] [PATCH] xfs: add new api xfs_admin

Richard W.M. Jones rjones at redhat.com
Mon Aug 20 08:00:28 UTC 2012


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




More information about the Libguestfs mailing list