[Libguestfs] [PATCH v3] New API: btrfs_replace
Pino Toscano
ptoscano at redhat.com
Mon Jun 29 15:29:35 UTC 2015
In data mercoledì 24 giugno 2015 10:08:42, Cao jin ha scritto:
> Signed-off-by: Cao jin <caoj.fnst at cn.fujitsu.com>
> ---
>
> v3: modify test script, add content check while remove replace back.
> Also fixed other defects as Pino T comment
>
> daemon/btrfs.c | 36 +++++++++++++++++++++
> generator/actions.ml | 16 ++++++++++
> tests/btrfs/Makefile.am | 3 +-
> tests/btrfs/test-btrfs-replace.sh | 66 +++++++++++++++++++++++++++++++++++++++
> 4 files changed, 120 insertions(+), 1 deletion(-)
> create mode 100755 tests/btrfs/test-btrfs-replace.sh
>
> diff --git a/daemon/btrfs.c b/daemon/btrfs.c
> index 20e5e6b..509a323 100644
> --- a/daemon/btrfs.c
> +++ b/daemon/btrfs.c
> @@ -2060,3 +2060,39 @@ do_btrfs_image (char *const *sources, const char *image,
>
> return 0;
> }
> +
> +int
> +do_btrfs_replace (const char *srcdev, const char *targetdev,
> + const char* mntpoint)
> +{
> + const size_t MAX_ARGS = 64;
> + const char *argv[MAX_ARGS];
> + size_t i = 0;
> + CLEANUP_FREE char *err = NULL;
> + CLEANUP_FREE char *path_buf = NULL;
> + int r;
> +
> + path_buf = sysroot_path (mntpoint);
> + if (path_buf == NULL) {
> + reply_with_perror ("malloc");
> + return -1;
> + }
> +
> + ADD_ARG (argv, i, str_btrfs);
> + ADD_ARG (argv, i, "replace");
> + ADD_ARG (argv, i, "start");
> + ADD_ARG (argv, i, srcdev);
> + ADD_ARG (argv, i, targetdev);
> + ADD_ARG (argv, i, path_buf);
> + ADD_ARG (argv, i, "-B");
> + ADD_ARG (argv, i, "-f");
> + ADD_ARG (argv, i, NULL);
> +
> + r = commandv (NULL, &err, argv);
> + if (r == -1) {
> + reply_with_error ("%s: %s", mntpoint, err);
> + return -1;
> + }
> +
> + return 0;
> +}
> diff --git a/generator/actions.ml b/generator/actions.ml
> index d5e5ccf..442f49c 100644
> --- a/generator/actions.ml
> +++ b/generator/actions.ml
> @@ -12593,6 +12593,22 @@ numbered C<partnum> on device C<device>.
>
> It returns C<primary>, C<logical>, or C<extended>." };
>
> + { defaults with
> + name = "btrfs_replace"; added = (1, 29, 48);
> + style = RErr, [Device "srcdev"; Device "targetdev"; Pathname "mntpoint"], [];
> + proc_nr = Some 455;
> + optional = Some "btrfs"; camel_name = "BTRFSReplace";
> + test_excuse = "put the test in 'tests/btrfs' directory";
> + shortdesc = "replace a btrfs managed device with another device";
> + longdesc = "\
> +Replace device of a btrfs filesystem. On a live filesystem, duplicate the data
> +to the target device which is currently stored on the source device.
> +After completion of the operation, the source device is wiped out and
> +removed from the filesystem.
> +
> +The C<targetdev> needs to be same size or larger than the C<srcdev>. Devices
> +which are currently mounted are never allowed to be used as the C<targetdev>." };
> +
> ]
>
> (* Non-API meta-commands available only in guestfish.
> diff --git a/tests/btrfs/Makefile.am b/tests/btrfs/Makefile.am
> index bf4d7ae..b6ef794 100644
> --- a/tests/btrfs/Makefile.am
> +++ b/tests/btrfs/Makefile.am
> @@ -20,7 +20,8 @@ include $(top_srcdir)/subdir-rules.mk
> TESTS = \
> test-btrfs-misc.pl \
> test-btrfs-devices.sh \
> - test-btrfs-subvolume-default.pl
> + test-btrfs-subvolume-default.pl \
> + test-btrfs-replace.sh
>
> TESTS_ENVIRONMENT = $(top_builddir)/run --test
>
> diff --git a/tests/btrfs/test-btrfs-replace.sh b/tests/btrfs/test-btrfs-replace.sh
> new file mode 100755
> index 0000000..2bf6d6d
> --- /dev/null
> +++ b/tests/btrfs/test-btrfs-replace.sh
> @@ -0,0 +1,66 @@
> +#!/bin/bash -
> +# libguestfs
> +# Copyright (C) 2015 Fujitsu Inc.
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 2 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write to the Free Software
> +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> +
> +# Test btrfs replace devices.
> +
> +set -e
> +
> +# Allow the test to be skipped since btrfs is often broken.
> +if [ -n "$SKIP_TEST_BTRFS_REPLACE_SH" ]; then
> + echo "$0: skipping test because environment variable is set."
> + exit 77
> +fi
> +
> +# If btrfs is not available, bail.
> +if ! guestfish -a /dev/null run : available btrfs; then
> + echo "$0: skipping test because btrfs is not available"
> + exit 77
> +fi
> +
> +rm -f test-btrfs-devices-{1,2}.img replace.output
> +
> +guestfish <<EOF > replace.output
> +# Add 2 empty disks
> +sparse test-btrfs-devices-1.img 1G
> +sparse test-btrfs-devices-2.img 1G
> +run
> +
> +mkfs-btrfs /dev/sda
> +mount /dev/sda /
> +
> +mkdir /data
> +copy-in $srcdir/../data/filesanddirs-10M.tar.xz /data
> +
> +# now, sda is btrfs while sdb is blank.
> +btrfs-replace /dev/sda /dev/sdb /
> +
> +# after replace: sda is wiped out, while sdb has btrfs with data
> +list-filesystems
> +ls /data/
> +
> +EOF
> +
> +if [ "$(cat replace.output)" != "/dev/sda: unknown
> +/dev/sdb: btrfs
> +filesanddirs-10M.tar.xz" ]; then
> + echo "btrfs-repalce fail!"
> + cat replace.output
> + exit 1
> +fi
> +
> +rm test-btrfs-devices-{1,2}.img replace.output
>
LGTM, pushed. Sorry for the delay.
Thanks,
--
Pino Toscano
More information about the Libguestfs
mailing list