[Libguestfs] [PATCH v4 1/2] New API: btrfs_balance_status
Richard W.M. Jones
rjones at redhat.com
Fri Feb 13 10:48:37 UTC 2015
On Fri, Feb 13, 2015 at 06:06:54PM +0800, Chen Hanxiao wrote:
> From: Hu Tao <hutao at cn.fujitsu.com>
>
> Signed-off-by: Hu Tao <hutao at cn.fujitsu.com>
> Signed-off-by: Chen Hanxiao <chenhanxiao at cn.fujitsu.com>
> ---
> daemon/btrfs.c | 126 +++++++++++++++++++++++++++++++
> generator/actions.ml | 10 +++
> generator/structs.ml | 12 +++
> gobject/Makefile.inc | 2 +
> java/Makefile.inc | 1 +
> java/com/redhat/et/libguestfs/.gitignore | 1 +
> po/POTFILES | 1 +
> src/MAX_PROC_NR | 2 +-
> 8 files changed, 154 insertions(+), 1 deletion(-)
>
> diff --git a/daemon/btrfs.c b/daemon/btrfs.c
> index 5cab52a..a979327 100644
> --- a/daemon/btrfs.c
> +++ b/daemon/btrfs.c
> @@ -1659,3 +1659,129 @@ do_btrfs_rescue_super_recover (const char *device)
>
> return 0;
> }
> +
> +guestfs_int_btrfsbalance *
> +do_btrfs_balance_status (const char *path)
> +{
> + const size_t MAX_ARGS = 64;
> + const char *argv[MAX_ARGS];
> + size_t i = 0;
> + CLEANUP_FREE char *path_buf = NULL;
> + CLEANUP_FREE char *err = NULL;
> + char *out;
> + int r;
> + guestfs_int_btrfsbalance *ret;
> + char **lines;
> + size_t nlines;
> + const char *errptr;
> + int erroffset;
> +#define N_MATCH 2
> + int ovector[N_MATCH * 3];
> + pcre *re = NULL;
> +
> + path_buf = sysroot_path (path);
> + if (path_buf == NULL) {
> + reply_with_perror ("malloc");
> + return NULL;
> + }
> +
> + ADD_ARG (argv, i, str_btrfs);
> + ADD_ARG (argv, i, "balance");
> + ADD_ARG (argv, i, "status");
> + ADD_ARG (argv, i, path_buf);
> + ADD_ARG (argv, i, NULL);
> +
> + r = commandv (&out, &err, argv);
> + if (r == -1) {
> + reply_with_error ("%s: %s", path, err);
> + return NULL;
> + }
> +
> + lines = split_lines (out);
> + if (!lines)
> + return NULL;
> +
> + nlines = count_strings (lines);
> +
> + ret = malloc(sizeof *ret);
> + if (ret == NULL) {
> + reply_with_perror ("malloc");
> + goto error;
> + }
> + memset (ret, 0, sizeof(*ret));
> +
> + /* Output of `btrfs balance status' is like:
> + *
> + * running:
> + *
> + * Balance on '/' is running
> + * 3 out of about 8 chunks balanced (3 considered), 62% left
> + *
> + * paused:
> + *
> + * Balance on '/' is paused
> + * 3 out of about 8 chunks balanced (3 considered), 62% left
> + *
> + * no balance running:
> + *
> + * No Balance found on '/'
> + *
> + */
> + if (nlines < 1) {
> + reply_with_perror ("No balance status output");
reply_with_perror uses errno implicitly, but errno would not be set to
anything interesting here.
I will push these patches, with a few fixes.
Thanks,
Rich.
> + return NULL;
> + }
> +
> + if (strstr (lines[0], "No balance found on")) {
> + ret->btrfsbalance_status = strdup("none");
> + if (ret->btrfsbalance_status == NULL) {
> + reply_with_perror ("strdup");
> + return NULL;
> + }
> + return ret;
> + }
> +
> + re = pcre_compile ("Balance on '.*' is (.*)", 0, &errptr, &erroffset, NULL);
> + if (re == NULL) {
> + reply_with_error ("pcre_compile (%i): %s", erroffset, errptr);
> + goto error;
> + }
> + if (pcre_exec (re, NULL, lines[0], strlen (lines[0]), 0, 0,
> + ovector, N_MATCH * 3) < 0) {
> + reply_with_error ("unexpected output from 'btrfs balance status' command: %s", lines[0]);
> + goto error;
> + }
> +#undef N_MATCH
> +
> + if (STREQ (lines[0] + ovector[2], "running"))
> + ret->btrfsbalance_status = strdup("running");
> + else if (STREQ (lines[0] + ovector[2], "paused"))
> + ret->btrfsbalance_status = strdup("paused");
> + else {
> + reply_with_error ("unexpected output from 'btrfs balance status' command: %s", lines[0]);
> + goto error;
> + }
> +
> + if (nlines < 2) {
> + reply_with_error ("truncated output from 'btrfs balance status' command");
> + goto error;
> + }
> +
> + if (sscanf (lines[1], "%" SCNu64 " out of about %" SCNu64
> + " chunks balanced (%" SCNu64 " considered), %" SCNu64 "%% left",
> + &ret->btrfsbalance_balanced, &ret->btrfsbalance_total,
> + &ret->btrfsbalance_considered, &ret->btrfsbalance_left) != 4) {
> + reply_with_perror ("sscanf");
> + goto error;
> + }
> +
> + pcre_free (re);
> + return ret;
> +
> +error:
> + free (ret->btrfsbalance_status);
> + free (ret);
> + pcre_free (re);
> +
> + return NULL;
> +}
> diff --git a/generator/actions.ml b/generator/actions.ml
> index 6b37712..5301a29 100644
> --- a/generator/actions.ml
> +++ b/generator/actions.ml
> @@ -12449,6 +12449,16 @@ valid GUID." };
> longdesc = "\
> Return the GUID of numbered GPT partition C<partnum>." };
>
> +{ defaults with
> + name = "btrfs_balance_status";
> + style = RStruct ("status", "btrfsbalance"), [Pathname "path"], [];
> + proc_nr = Some 448;
> + optional = Some "btrfs"; camel_name = "BTRFSBalanceStatus";
> + test_excuse = "test disk isn't large enough that btrfs_balance completes before we can get its status";
> + shortdesc = "show the status of a running or paused balance";
> + longdesc = "\
> +Show the status of a running or paused balance on a btrfs filesystem." };
> +
> ]
>
> (* Non-API meta-commands available only in guestfish.
> diff --git a/generator/structs.ml b/generator/structs.ml
> index 5b466a2..af42529 100644
> --- a/generator/structs.ml
> +++ b/generator/structs.ml
> @@ -340,6 +340,18 @@ let structs = [
> ];
> s_camel_name = "BTRFSQgroup" };
>
> + (* btrfs balance status output *)
> + { defaults with
> + s_name = "btrfsbalance";
> + s_cols = [
> + "btrfsbalance_status", FString;
> + "btrfsbalance_total", FUInt64;
> + "btrfsbalance_balanced", FUInt64;
> + "btrfsbalance_considered", FUInt64;
> + "btrfsbalance_left", FUInt64;
> + ];
> + s_camel_name = "BTRFSBalance" };
> +
> (* XFS info descriptor. *)
> { defaults with
> s_name = "xfsinfo";
> diff --git a/gobject/Makefile.inc b/gobject/Makefile.inc
> index e0c0a5f..3ce10f9 100644
> --- a/gobject/Makefile.inc
> +++ b/gobject/Makefile.inc
> @@ -25,6 +25,7 @@ guestfs_gobject_headers= \
> include/guestfs-gobject/tristate.h \
> include/guestfs-gobject/struct-application.h \
> include/guestfs-gobject/struct-application2.h \
> + include/guestfs-gobject/struct-btrfsbalance.h \
> include/guestfs-gobject/struct-btrfsqgroup.h \
> include/guestfs-gobject/struct-btrfssubvolume.h \
> include/guestfs-gobject/struct-dirent.h \
> @@ -108,6 +109,7 @@ guestfs_gobject_sources= \
> src/tristate.c \
> src/struct-application.c \
> src/struct-application2.c \
> + src/struct-btrfsbalance.c \
> src/struct-btrfsqgroup.c \
> src/struct-btrfssubvolume.c \
> src/struct-dirent.c \
> diff --git a/java/Makefile.inc b/java/Makefile.inc
> index 103010f..499d3de 100644
> --- a/java/Makefile.inc
> +++ b/java/Makefile.inc
> @@ -22,6 +22,7 @@
> java_built_sources = \
> com/redhat/et/libguestfs/Application.java \
> com/redhat/et/libguestfs/Application2.java \
> + com/redhat/et/libguestfs/BTRFSBalance.java \
> com/redhat/et/libguestfs/BTRFSQgroup.java \
> com/redhat/et/libguestfs/BTRFSSubvolume.java \
> com/redhat/et/libguestfs/Dirent.java \
> diff --git a/java/com/redhat/et/libguestfs/.gitignore b/java/com/redhat/et/libguestfs/.gitignore
> index 1d4accc..b2b1b22 100644
> --- a/java/com/redhat/et/libguestfs/.gitignore
> +++ b/java/com/redhat/et/libguestfs/.gitignore
> @@ -1,5 +1,6 @@
> Application.java
> Application2.java
> +BTRFSBalance.java
> BTRFSQgroup.java
> BTRFSSubvolume.java
> Dirent.java
> diff --git a/po/POTFILES b/po/POTFILES
> index 6e65377..3f66c9f 100644
> --- a/po/POTFILES
> +++ b/po/POTFILES
> @@ -230,6 +230,7 @@ gobject/src/optargs-xfs_repair.c
> gobject/src/session.c
> gobject/src/struct-application.c
> gobject/src/struct-application2.c
> +gobject/src/struct-btrfsbalance.c
> gobject/src/struct-btrfsqgroup.c
> gobject/src/struct-btrfssubvolume.c
> gobject/src/struct-dirent.c
> diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR
> index e9b7520..5379c47 100644
> --- a/src/MAX_PROC_NR
> +++ b/src/MAX_PROC_NR
> @@ -1 +1 @@
> -447
> +448
> --
> 2.1.0
>
> _______________________________________________
> Libguestfs mailing list
> Libguestfs at redhat.com
> https://www.redhat.com/mailman/listinfo/libguestfs
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-top is 'top' for virtual machines. Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top
More information about the Libguestfs
mailing list