Re: [Libguestfs] [PATCH 1/5] New API: btrfs_scrub

Pino Toscano
Wed, 07 Jan 2015 11:37:48 -0000

In data venerdì 26 dicembre 2014 16:17:45, Hu Tao ha
scritto:
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  daemon/btrfs.c       | 32 ++++++++++++++++++++++++++++++++
>  generator/actions.ml | 17 +++++++++++++++++
>  src/MAX_PROC_NR      |  2 +-
>  3 files changed, 50 insertions(+), 1 deletion(-)
>
> diff --git a/daemon/btrfs.c b/daemon/btrfs.c
> index 150c089..79de539 100644
> --- a/daemon/btrfs.c
> +++ b/daemon/btrfs.c
> @@ -1343,3 +1343,35 @@ do_btrfs_qgroup_remove (const char *src, const char
*dst, const char *path)
>
>    return 0;
>  }
> +
> +int
> +do_btrfs_scrub (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;
> +  CLEANUP_FREE char *out = NULL;
> +  int r;
> +
> +  path_buf = sysroot_path (path);
> +  if (path_buf == NULL) {
> +    reply_with_perror ("malloc");
> +    return -1;
> +  }
> +
> +  ADD_ARG (argv, i, str_btrfs);
> +  ADD_ARG (argv, i, "scrub");
> +  ADD_ARG (argv, i, "start");
> +  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 -1;
> +  }
> +
> +  return 0;
> +}

Reading the btrfs documentation, it seems like this is an asynchronous
operation by default, so I'm not sure whether it would be useful to
just start it without any way to monitor its status.

Also, what would it happen when you start a scrub operation on a
mounted filesystem, and then you either unmount it or shut down the
appliance while the scrubbing is still ongoing?

Another option could be making it synchronous (start -B), if it doesn't
take too much time.

Thanks,
--
Pino Toscano