[Libguestfs] [PATCH 2/2] New API: btfs_scrub_status.
Richard W.M. Jones
rjones at redhat.com
Mon Feb 2 13:32:01 UTC 2015
On Mon, Feb 02, 2015 at 02:11:32PM +0800, Hu Tao wrote:
> Signed-off-by: Hu Tao <hutao at cn.fujitsu.com>
> ---
> daemon/btrfs.c | 142 +++++++++++++++++++++++++++++++
> generator/actions.ml | 16 ++++
> generator/structs.ml | 22 +++++
> 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, 186 insertions(+), 1 deletion(-)
>
> diff --git a/daemon/btrfs.c b/daemon/btrfs.c
> index bb82f32..0f49fb5 100644
> --- a/daemon/btrfs.c
> +++ b/daemon/btrfs.c
> @@ -1768,3 +1768,145 @@ error:
>
> return NULL;
> }
> +
> +guestfs_int_btrfsscrub *
> +do_btrfs_scrub_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_btrfsscrub *ret;
> + char **lines;
> + char *line;
> +
> + 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, "scrub");
> + ADD_ARG (argv, i, "status");
> + ADD_ARG (argv, i, "-R");
> + 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;
> +
> + ret = malloc (sizeof *ret);
> + if (ret == NULL) {
> + reply_with_perror ("malloc");
> + return NULL;
> + }
> + memset (ret, 0, sizeof(*ret));
> +
> + /* Output of `btrfs scrub -R status' is like:
> + *
> + * strub status for 346121d1-1847-40f8-9b7b-2bf3d539c68f
> + * scrub started at Mon Feb 2 17:39:38 2015, running for 93 seconds
> + * data_extents_scrubbed: 136670
> + * tree_extents_scrubbed: 30023
> + * data_bytes_scrubbed: 4474441728
> + * tree_bytes_scrubbed: 491896832
> + * read_errors: 0
> + * csum_errors: 0
> + * verify_errors: 0
> + * no_csum: 17760
> + * csum_discards: 197622
> + * super_errors: 0
> + * malloc_errors: 0
> + * uncorrectable_errors: 0
> + * unverified_errors: 0
> + * corrected_errors: 0
> + * last_physical: 10301341696
> + *
> + * or:
> + *
> + * strub status for 346121d1-1847-40f8-9b7b-2bf3d539c68f
> + * no stats available
> + */
> + line = lines[1];
Again, I doubt that the output of btrfs scrub -R status will remain
the same forever. You need to at least check that lines[] is
sufficiently long to avoid a possible segfault, and it's probably
better to use a loop here. Compare the function xfs.c:parse_xfs_info()
Rich.
> + if (STREQ (line, "\tno stats available"))
> + return ret;
> +
> + line = lines[2];
> + if (sscanf (line, "\tdata_extents_scrubbed: %" SCNu64,
> + &ret->btrfsscrub_data_extents_scrubbed) != 1)
> + goto error;
> + line = lines[3];
> + if (sscanf (line, "\ttree_extents_scrubbed: %" SCNu64,
> + &ret->btrfsscrub_tree_extents_scrubbed) != 1)
> + goto error;
> + line = lines[4];
> + if (sscanf (line, "\tdata_bytes_scrubbed: %" SCNu64,
> + &ret->btrfsscrub_data_bytes_scrubbed) != 1)
> + goto error;
> + line = lines[5];
> + if (sscanf (line, "\ttree_bytes_scrubbed: %" SCNu64,
> + &ret->btrfsscrub_tree_bytes_scrubbed) != 1)
> + goto error;
> + line = lines[6];
> + if (sscanf (line, "\tread_errors: %" SCNu64,
> + &ret->btrfsscrub_read_errors) != 1)
> + goto error;
> + line = lines[7];
> + if (sscanf (line, "\tcsum_errors: %" SCNu64,
> + &ret->btrfsscrub_csum_errors) != 1)
> + goto error;
> + line = lines[8];
> + if (sscanf (line, "\tverify_errors: %" SCNu64,
> + &ret->btrfsscrub_verify_errors) != 1)
> + goto error;
> + line = lines[9];
> + if (sscanf (line, "\tno_csum: %" SCNu64,
> + &ret->btrfsscrub_no_csum) != 1)
> + goto error;
> + line = lines[10];
> + if (sscanf (line, "\tcsum_discards: %" SCNu64,
> + &ret->btrfsscrub_csum_discards) != 1)
> + goto error;
> + line = lines[11];
> + if (sscanf (line, "\tsuper_errors: %" SCNu64,
> + &ret->btrfsscrub_super_errors) != 1)
> + goto error;
> + line = lines[12];
> + if (sscanf (line, "\tmalloc_errors: %" SCNu64,
> + &ret->btrfsscrub_malloc_errors) != 1)
> + goto error;
> + line = lines[13];
> + if (sscanf (line, "\tuncorrectable_errors: %" SCNu64,
> + &ret->btrfsscrub_uncorrectable_errors) != 1)
> + goto error;
> + line = lines[14];
> + if (sscanf (line, "\tunverified_errors: %" SCNu64,
> + &ret->btrfsscrub_unverified_errors) != 1)
> + goto error;
> + line = lines[15];
> + if (sscanf (line, "\tcorrected_errors: %" SCNu64,
> + &ret->btrfsscrub_corrected_errors) != 1)
> + goto error;
> + line = lines[16];
> + if (sscanf (line, "\tlast_physical: %" SCNu64,
> + &ret->btrfsscrub_last_physical) != 1)
> + goto error;
> +
> + return ret;
> +
> +error:
> + reply_with_error ("%s: could not parse btrfs scrub status.", line);
> + free (ret);
> + return NULL;
> +}
> diff --git a/generator/actions.ml b/generator/actions.ml
> index f943ecb..a2d43e4 100644
> --- a/generator/actions.ml
> +++ b/generator/actions.ml
> @@ -12395,6 +12395,22 @@ Recover bad superblocks from good copies." };
> longdesc = "\
> Show the status of a running or paused balance on a btrfs filesystem." };
>
> + { defaults with
> + name = "btrfs_scrub_status";
> + style = RStruct ("status", "btrfsscrub"), [Pathname "path"], [];
> + proc_nr = Some 447;
> + optional = Some "btrfs"; camel_name = "BTRFSScrubStatus";
> + tests = [
> + InitPartition, Always, TestRun (
> + [["mkfs_btrfs"; "/dev/sda1"; ""; ""; "NOARG"; ""; "NOARG"; "NOARG"; ""; ""];
> + ["mount"; "/dev/sda1"; "/"];
> + ["btrfs_scrub_start"; "/"];
> + ["btrfs_scrub_status"; "/"]]), [];
> + ];
> + shortdesc = "show status of running or finished scrub";
> + longdesc = "\
> +Show status of running or finished scrub on a btrfs filesystem." };
> +
> ]
>
> (* Non-API meta-commands available only in guestfish.
> diff --git a/generator/structs.ml b/generator/structs.ml
> index af42529..ea110a1 100644
> --- a/generator/structs.ml
> +++ b/generator/structs.ml
> @@ -352,6 +352,28 @@ let structs = [
> ];
> s_camel_name = "BTRFSBalance" };
>
> + (* btrfs scrub status output *)
> + { defaults with
> + s_name = "btrfsscrub";
> + s_cols = [
> + "btrfsscrub_data_extents_scrubbed", FUInt64;
> + "btrfsscrub_tree_extents_scrubbed", FUInt64;
> + "btrfsscrub_data_bytes_scrubbed", FUInt64;
> + "btrfsscrub_tree_bytes_scrubbed", FUInt64;
> + "btrfsscrub_read_errors", FUInt64;
> + "btrfsscrub_csum_errors", FUInt64;
> + "btrfsscrub_verify_errors", FUInt64;
> + "btrfsscrub_no_csum", FUInt64;
> + "btrfsscrub_csum_discards", FUInt64;
> + "btrfsscrub_super_errors", FUInt64;
> + "btrfsscrub_malloc_errors", FUInt64;
> + "btrfsscrub_uncorrectable_errors", FUInt64;
> + "btrfsscrub_unverified_errors", FUInt64;
> + "btrfsscrub_corrected_errors", FUInt64;
> + "btrfsscrub_last_physical", FUInt64;
> + ];
> + s_camel_name = "BTRFSScrub" };
> +
> (* XFS info descriptor. *)
> { defaults with
> s_name = "xfsinfo";
> diff --git a/gobject/Makefile.inc b/gobject/Makefile.inc
> index 3ce10f9..6bbd72c 100644
> --- a/gobject/Makefile.inc
> +++ b/gobject/Makefile.inc
> @@ -27,6 +27,7 @@ guestfs_gobject_headers= \
> include/guestfs-gobject/struct-application2.h \
> include/guestfs-gobject/struct-btrfsbalance.h \
> include/guestfs-gobject/struct-btrfsqgroup.h \
> + include/guestfs-gobject/struct-btrfsscrub.h \
> include/guestfs-gobject/struct-btrfssubvolume.h \
> include/guestfs-gobject/struct-dirent.h \
> include/guestfs-gobject/struct-hivex_node.h \
> @@ -111,6 +112,7 @@ guestfs_gobject_sources= \
> src/struct-application2.c \
> src/struct-btrfsbalance.c \
> src/struct-btrfsqgroup.c \
> + src/struct-btrfsscrub.c \
> src/struct-btrfssubvolume.c \
> src/struct-dirent.c \
> src/struct-hivex_node.c \
> diff --git a/java/Makefile.inc b/java/Makefile.inc
> index 499d3de..477842a 100644
> --- a/java/Makefile.inc
> +++ b/java/Makefile.inc
> @@ -24,6 +24,7 @@ java_built_sources = \
> com/redhat/et/libguestfs/Application2.java \
> com/redhat/et/libguestfs/BTRFSBalance.java \
> com/redhat/et/libguestfs/BTRFSQgroup.java \
> + com/redhat/et/libguestfs/BTRFSScrub.java \
> com/redhat/et/libguestfs/BTRFSSubvolume.java \
> com/redhat/et/libguestfs/Dirent.java \
> com/redhat/et/libguestfs/HivexNode.java \
> diff --git a/java/com/redhat/et/libguestfs/.gitignore b/java/com/redhat/et/libguestfs/.gitignore
> index b2b1b22..8389269 100644
> --- a/java/com/redhat/et/libguestfs/.gitignore
> +++ b/java/com/redhat/et/libguestfs/.gitignore
> @@ -2,6 +2,7 @@ Application.java
> Application2.java
> BTRFSBalance.java
> BTRFSQgroup.java
> +BTRFSScrub.java
> BTRFSSubvolume.java
> Dirent.java
> HivexNode.java
> diff --git a/po/POTFILES b/po/POTFILES
> index 9330256..5d089ac 100644
> --- a/po/POTFILES
> +++ b/po/POTFILES
> @@ -232,6 +232,7 @@ gobject/src/struct-application.c
> gobject/src/struct-application2.c
> gobject/src/struct-btrfsbalance.c
> gobject/src/struct-btrfsqgroup.c
> +gobject/src/struct-btrfsscrub.c
> gobject/src/struct-btrfssubvolume.c
> gobject/src/struct-dirent.c
> gobject/src/struct-hivex_node.c
> diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR
> index 0187835..e9b7520 100644
> --- a/src/MAX_PROC_NR
> +++ b/src/MAX_PROC_NR
> @@ -1 +1 @@
> -446
> +447
> --
> 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