mirror of https://gitee.com/openkylin/qemu.git
Block layer fixes for 2.9.0-rc1
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJYxogsAAoJEH8JsnLIjy/Wg84P/AwLWgTIcw0GWLuJNKovQopv rOHoOnX1MrdeS52/E+99YpI4kdIB0BM2wtGFZgFRjXTdIhVuDterSPV1BYgx1sXy iefqMAc0G3YI07tMsmCsvb2KqSO/v+fBHJg4XlseIQsZX4M+I54FtO5htGkebGQk LmrrNvVLnpxFzMHMG+qkp/5QD+b7FFA+bpEVPGg8NufYOyfdB+anHT/9dZO4l7n8 SvHPYq3b3o+bEKMMNa5qzwy876s8vKX5xu1WdNTTqMueF0dF8jQuN6jj4pFr1hrO 55G0MuYncUTgUEp4xRUNrQzN1KWsjLb5hMhNP5TlAb96KYQsGK9TNmyWdKgiDluU 1mHWGUwhEEKW3V/q/qRG/zDYm92QyRy23CZJLIgFTxcuYn7hLZEX547P8w5HL1vP PSwUU3ovhD9K4PMVUOeKOPHSm0dKv/mPFdoI6frDJm55l5nqUl9YGTyJly0Gat9G pf4gj3LKyJTmT00XvG9quJLKNuIK1fbgLFvvJjbB6hTXpx8rZyhaYNLeNGctVacL bZv5eKjBbnqnr3ngOB4WEW+C+8qKG5ZVvo4tU46ZDeJ69ajyCBVmCsv2MTlRNPl7 +L/ulcEcqRVklYYrn00tF56zXD6wwzkSzFo0OJuT+ZWK1W45afxIVKhR+v9J0Z0X zJ+dy5sBv+0aquEbKnQo =KIOD -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging Block layer fixes for 2.9.0-rc1 # gpg: Signature made Mon 13 Mar 2017 11:53:16 GMT # gpg: using RSA key 0x7F09B272C88F2FD6 # gpg: Good signature from "Kevin Wolf <kwolf@redhat.com>" # Primary key fingerprint: DC3D EB15 9A9A F95D 3D74 56FE 7F09 B272 C88F 2FD6 * remotes/kevin/tags/for-upstream: commit: Implement .bdrv_refresh_filename mirror: Implement .bdrv_refresh_filename block: Refresh filename after changing backing file commit: Implement bdrv_commit_top.bdrv_co_get_block_status block: Request block status from *file for BDRV_BLOCK_RAW block: Remove check_new_perm from bdrv_replace_child() migration: Document handling of bdrv_is_allocated() errors vvfat: React to bdrv_is_allocated() errors backup: React to bdrv_is_allocated() errors block: Drop unmaintained 'archipelago' driver file-posix: Consider max_segments for BlockLimits.max_transfer backup: allow target without .bdrv_get_info Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
5bac3c39c8
|
@ -1674,14 +1674,6 @@ S: Supported
|
|||
F: block/ssh.c
|
||||
T: git git://github.com/codyprime/qemu-kvm-jtc.git block
|
||||
|
||||
ARCHIPELAGO
|
||||
M: Chrysostomos Nanakos <chris@include.gr>
|
||||
M: Jeff Cody <jcody@redhat.com>
|
||||
L: qemu-block@nongnu.org
|
||||
S: Maintained
|
||||
F: block/archipelago.c
|
||||
T: git git://github.com/codyprime/qemu-kvm-jtc.git block
|
||||
|
||||
CURL
|
||||
M: Jeff Cody <jcody@redhat.com>
|
||||
L: qemu-block@nongnu.org
|
||||
|
|
23
block.c
23
block.c
|
@ -1756,8 +1756,18 @@ static void bdrv_replace_child_noperm(BdrvChild *child,
|
|||
}
|
||||
}
|
||||
|
||||
static void bdrv_replace_child(BdrvChild *child, BlockDriverState *new_bs,
|
||||
bool check_new_perm)
|
||||
/*
|
||||
* Updates @child to change its reference to point to @new_bs, including
|
||||
* checking and applying the necessary permisson updates both to the old node
|
||||
* and to @new_bs.
|
||||
*
|
||||
* NULL is passed as @new_bs for removing the reference before freeing @child.
|
||||
*
|
||||
* If @new_bs is not NULL, bdrv_check_perm() must be called beforehand, as this
|
||||
* function uses bdrv_set_perm() to update the permissions according to the new
|
||||
* reference that @new_bs gets.
|
||||
*/
|
||||
static void bdrv_replace_child(BdrvChild *child, BlockDriverState *new_bs)
|
||||
{
|
||||
BlockDriverState *old_bs = child->bs;
|
||||
uint64_t perm, shared_perm;
|
||||
|
@ -1775,9 +1785,6 @@ static void bdrv_replace_child(BdrvChild *child, BlockDriverState *new_bs,
|
|||
|
||||
if (new_bs) {
|
||||
bdrv_get_cumulative_perm(new_bs, &perm, &shared_perm);
|
||||
if (check_new_perm) {
|
||||
bdrv_check_perm(new_bs, perm, shared_perm, NULL, &error_abort);
|
||||
}
|
||||
bdrv_set_perm(new_bs, perm, shared_perm);
|
||||
}
|
||||
}
|
||||
|
@ -1808,7 +1815,7 @@ BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs,
|
|||
};
|
||||
|
||||
/* This performs the matching bdrv_set_perm() for the above check. */
|
||||
bdrv_replace_child(child, child_bs, false);
|
||||
bdrv_replace_child(child, child_bs);
|
||||
|
||||
return child;
|
||||
}
|
||||
|
@ -1845,7 +1852,7 @@ static void bdrv_detach_child(BdrvChild *child)
|
|||
child->next.le_prev = NULL;
|
||||
}
|
||||
|
||||
bdrv_replace_child(child, NULL, false);
|
||||
bdrv_replace_child(child, NULL);
|
||||
|
||||
g_free(child->name);
|
||||
g_free(child);
|
||||
|
@ -1931,6 +1938,8 @@ void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd,
|
|||
bdrv_unref(backing_hd);
|
||||
}
|
||||
|
||||
bdrv_refresh_filename(bs);
|
||||
|
||||
out:
|
||||
bdrv_refresh_limits(bs, NULL);
|
||||
}
|
||||
|
|
|
@ -19,7 +19,6 @@ block-obj-$(CONFIG_LIBNFS) += nfs.o
|
|||
block-obj-$(CONFIG_CURL) += curl.o
|
||||
block-obj-$(CONFIG_RBD) += rbd.o
|
||||
block-obj-$(CONFIG_GLUSTERFS) += gluster.o
|
||||
block-obj-$(CONFIG_ARCHIPELAGO) += archipelago.o
|
||||
block-obj-$(CONFIG_LIBSSH2) += ssh.o
|
||||
block-obj-y += accounting.o dirty-bitmap.o
|
||||
block-obj-y += write-threshold.o
|
||||
|
@ -41,7 +40,6 @@ gluster.o-cflags := $(GLUSTERFS_CFLAGS)
|
|||
gluster.o-libs := $(GLUSTERFS_LIBS)
|
||||
ssh.o-cflags := $(LIBSSH2_CFLAGS)
|
||||
ssh.o-libs := $(LIBSSH2_LIBS)
|
||||
archipelago.o-libs := $(ARCHIPELAGO_LIBS)
|
||||
block-obj-$(if $(CONFIG_BZIP2),m,n) += dmg-bz2.o
|
||||
dmg-bz2.o-libs := $(BZIP2_LIBS)
|
||||
qcow.o-libs := -lz
|
||||
|
|
1079
block/archipelago.c
1079
block/archipelago.c
File diff suppressed because it is too large
Load Diff
|
@ -24,6 +24,7 @@
|
|||
#include "qemu/cutils.h"
|
||||
#include "sysemu/block-backend.h"
|
||||
#include "qemu/bitmap.h"
|
||||
#include "qemu/error-report.h"
|
||||
|
||||
#define BACKUP_CLUSTER_SIZE_DEFAULT (1 << 16)
|
||||
#define SLICE_TIME 100000000ULL /* ns */
|
||||
|
@ -467,13 +468,14 @@ static void coroutine_fn backup_run(void *opaque)
|
|||
/* Both FULL and TOP SYNC_MODE's require copying.. */
|
||||
for (; start < end; start++) {
|
||||
bool error_is_read;
|
||||
int alloced = 0;
|
||||
|
||||
if (yield_and_check(job)) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (job->sync_mode == MIRROR_SYNC_MODE_TOP) {
|
||||
int i, n;
|
||||
int alloced = 0;
|
||||
|
||||
/* Check to see if these blocks are already in the
|
||||
* backing file. */
|
||||
|
@ -491,7 +493,7 @@ static void coroutine_fn backup_run(void *opaque)
|
|||
sectors_per_cluster - i, &n);
|
||||
i += n;
|
||||
|
||||
if (alloced == 1 || n == 0) {
|
||||
if (alloced || n == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -503,8 +505,13 @@ static void coroutine_fn backup_run(void *opaque)
|
|||
}
|
||||
}
|
||||
/* FULL sync mode we copy the whole drive. */
|
||||
ret = backup_do_cow(job, start * sectors_per_cluster,
|
||||
sectors_per_cluster, &error_is_read, false);
|
||||
if (alloced < 0) {
|
||||
ret = alloced;
|
||||
} else {
|
||||
ret = backup_do_cow(job, start * sectors_per_cluster,
|
||||
sectors_per_cluster, &error_is_read,
|
||||
false);
|
||||
}
|
||||
if (ret < 0) {
|
||||
/* Depending on error action, fail now or retry cluster */
|
||||
BlockErrorAction action =
|
||||
|
@ -648,7 +655,16 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
|||
* backup cluster size is smaller than the target cluster size. Even for
|
||||
* targets with a backing file, try to avoid COW if possible. */
|
||||
ret = bdrv_get_info(target, &bdi);
|
||||
if (ret < 0 && !target->backing) {
|
||||
if (ret == -ENOTSUP && !target->backing) {
|
||||
/* Cluster size is not defined */
|
||||
error_report("WARNING: The target block device doesn't provide "
|
||||
"information about the block size and it doesn't have a "
|
||||
"backing file. The default block size of %u bytes is "
|
||||
"used. If the actual block size of the target exceeds "
|
||||
"this default, the backup may be unusable",
|
||||
BACKUP_CLUSTER_SIZE_DEFAULT);
|
||||
job->cluster_size = BACKUP_CLUSTER_SIZE_DEFAULT;
|
||||
} else if (ret < 0 && !target->backing) {
|
||||
error_setg_errno(errp, -ret,
|
||||
"Couldn't determine the cluster size of the target image, "
|
||||
"which has no backing file");
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/cutils.h"
|
||||
#include "trace.h"
|
||||
#include "block/block_int.h"
|
||||
#include "block/blockjob_int.h"
|
||||
|
@ -232,6 +233,23 @@ static int coroutine_fn bdrv_commit_top_preadv(BlockDriverState *bs,
|
|||
return bdrv_co_preadv(bs->backing, offset, bytes, qiov, flags);
|
||||
}
|
||||
|
||||
static int64_t coroutine_fn bdrv_commit_top_get_block_status(
|
||||
BlockDriverState *bs, int64_t sector_num, int nb_sectors, int *pnum,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
*pnum = nb_sectors;
|
||||
*file = bs->backing->bs;
|
||||
return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID | BDRV_BLOCK_DATA |
|
||||
(sector_num << BDRV_SECTOR_BITS);
|
||||
}
|
||||
|
||||
static void bdrv_commit_top_refresh_filename(BlockDriverState *bs, QDict *opts)
|
||||
{
|
||||
bdrv_refresh_filename(bs->backing->bs);
|
||||
pstrcpy(bs->exact_filename, sizeof(bs->exact_filename),
|
||||
bs->backing->bs->filename);
|
||||
}
|
||||
|
||||
static void bdrv_commit_top_close(BlockDriverState *bs)
|
||||
{
|
||||
}
|
||||
|
@ -248,10 +266,12 @@ static void bdrv_commit_top_child_perm(BlockDriverState *bs, BdrvChild *c,
|
|||
/* Dummy node that provides consistent read to its users without requiring it
|
||||
* from its backing file and that allows writes on the backing file chain. */
|
||||
static BlockDriver bdrv_commit_top = {
|
||||
.format_name = "commit_top",
|
||||
.bdrv_co_preadv = bdrv_commit_top_preadv,
|
||||
.bdrv_close = bdrv_commit_top_close,
|
||||
.bdrv_child_perm = bdrv_commit_top_child_perm,
|
||||
.format_name = "commit_top",
|
||||
.bdrv_co_preadv = bdrv_commit_top_preadv,
|
||||
.bdrv_co_get_block_status = bdrv_commit_top_get_block_status,
|
||||
.bdrv_refresh_filename = bdrv_commit_top_refresh_filename,
|
||||
.bdrv_close = bdrv_commit_top_close,
|
||||
.bdrv_child_perm = bdrv_commit_top_child_perm,
|
||||
};
|
||||
|
||||
void commit_start(const char *job_id, BlockDriverState *bs,
|
||||
|
|
|
@ -668,6 +668,48 @@ static int hdev_get_max_transfer_length(BlockDriverState *bs, int fd)
|
|||
#endif
|
||||
}
|
||||
|
||||
static int hdev_get_max_segments(const struct stat *st)
|
||||
{
|
||||
#ifdef CONFIG_LINUX
|
||||
char buf[32];
|
||||
const char *end;
|
||||
char *sysfspath;
|
||||
int ret;
|
||||
int fd = -1;
|
||||
long max_segments;
|
||||
|
||||
sysfspath = g_strdup_printf("/sys/dev/block/%u:%u/queue/max_segments",
|
||||
major(st->st_rdev), minor(st->st_rdev));
|
||||
fd = open(sysfspath, O_RDONLY);
|
||||
if (fd == -1) {
|
||||
ret = -errno;
|
||||
goto out;
|
||||
}
|
||||
do {
|
||||
ret = read(fd, buf, sizeof(buf));
|
||||
} while (ret == -1 && errno == EINTR);
|
||||
if (ret < 0) {
|
||||
ret = -errno;
|
||||
goto out;
|
||||
} else if (ret == 0) {
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
buf[ret] = 0;
|
||||
/* The file is ended with '\n', pass 'end' to accept that. */
|
||||
ret = qemu_strtol(buf, &end, 10, &max_segments);
|
||||
if (ret == 0 && end && *end == '\n') {
|
||||
ret = max_segments;
|
||||
}
|
||||
|
||||
out:
|
||||
g_free(sysfspath);
|
||||
return ret;
|
||||
#else
|
||||
return -ENOTSUP;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void raw_refresh_limits(BlockDriverState *bs, Error **errp)
|
||||
{
|
||||
BDRVRawState *s = bs->opaque;
|
||||
|
@ -679,6 +721,11 @@ static void raw_refresh_limits(BlockDriverState *bs, Error **errp)
|
|||
if (ret > 0 && ret <= BDRV_REQUEST_MAX_BYTES) {
|
||||
bs->bl.max_transfer = pow2floor(ret);
|
||||
}
|
||||
ret = hdev_get_max_segments(&st);
|
||||
if (ret > 0) {
|
||||
bs->bl.max_transfer = MIN(bs->bl.max_transfer,
|
||||
ret * getpagesize());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1760,7 +1760,7 @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs,
|
|||
|
||||
if (ret & BDRV_BLOCK_RAW) {
|
||||
assert(ret & BDRV_BLOCK_OFFSET_VALID);
|
||||
ret = bdrv_get_block_status(bs->file->bs, ret >> BDRV_SECTOR_BITS,
|
||||
ret = bdrv_get_block_status(*file, ret >> BDRV_SECTOR_BITS,
|
||||
*pnum, pnum, file);
|
||||
goto out;
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/cutils.h"
|
||||
#include "trace.h"
|
||||
#include "block/blockjob_int.h"
|
||||
#include "block/block_int.h"
|
||||
|
@ -1060,6 +1061,13 @@ static int coroutine_fn bdrv_mirror_top_pdiscard(BlockDriverState *bs,
|
|||
return bdrv_co_pdiscard(bs->backing->bs, offset, count);
|
||||
}
|
||||
|
||||
static void bdrv_mirror_top_refresh_filename(BlockDriverState *bs, QDict *opts)
|
||||
{
|
||||
bdrv_refresh_filename(bs->backing->bs);
|
||||
pstrcpy(bs->exact_filename, sizeof(bs->exact_filename),
|
||||
bs->backing->bs->filename);
|
||||
}
|
||||
|
||||
static void bdrv_mirror_top_close(BlockDriverState *bs)
|
||||
{
|
||||
}
|
||||
|
@ -1088,6 +1096,7 @@ static BlockDriver bdrv_mirror_top = {
|
|||
.bdrv_co_pdiscard = bdrv_mirror_top_pdiscard,
|
||||
.bdrv_co_flush = bdrv_mirror_top_flush,
|
||||
.bdrv_co_get_block_status = bdrv_mirror_top_get_block_status,
|
||||
.bdrv_refresh_filename = bdrv_mirror_top_refresh_filename,
|
||||
.bdrv_close = bdrv_mirror_top_close,
|
||||
.bdrv_child_perm = bdrv_mirror_top_child_perm,
|
||||
};
|
||||
|
|
|
@ -1394,7 +1394,13 @@ static int vvfat_read(BlockDriverState *bs, int64_t sector_num,
|
|||
return -1;
|
||||
if (s->qcow) {
|
||||
int n;
|
||||
if (bdrv_is_allocated(s->qcow->bs, sector_num, nb_sectors-i, &n)) {
|
||||
int ret;
|
||||
ret = bdrv_is_allocated(s->qcow->bs, sector_num,
|
||||
nb_sectors - i, &n);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
if (ret) {
|
||||
DLOG(fprintf(stderr, "sectors %d+%d allocated\n",
|
||||
(int)sector_num, n));
|
||||
if (bdrv_read(s->qcow, sector_num, buf + i * 0x200, n)) {
|
||||
|
@ -1668,7 +1674,8 @@ static inline uint32_t modified_fat_get(BDRVVVFATState* s,
|
|||
}
|
||||
}
|
||||
|
||||
static inline int cluster_was_modified(BDRVVVFATState* s, uint32_t cluster_num)
|
||||
static inline bool cluster_was_modified(BDRVVVFATState *s,
|
||||
uint32_t cluster_num)
|
||||
{
|
||||
int was_modified = 0;
|
||||
int i, dummy;
|
||||
|
@ -1683,7 +1690,13 @@ static inline int cluster_was_modified(BDRVVVFATState* s, uint32_t cluster_num)
|
|||
1, &dummy);
|
||||
}
|
||||
|
||||
return was_modified;
|
||||
/*
|
||||
* Note that this treats failures to learn allocation status the
|
||||
* same as if an allocation has occurred. It's as safe as
|
||||
* anything else, given that a failure to learn allocation status
|
||||
* will probably result in more failures.
|
||||
*/
|
||||
return !!was_modified;
|
||||
}
|
||||
|
||||
static const char* get_basename(const char* path)
|
||||
|
@ -1833,6 +1846,9 @@ static uint32_t get_cluster_count_for_direntry(BDRVVVFATState* s,
|
|||
int res;
|
||||
|
||||
res = bdrv_is_allocated(s->qcow->bs, offset + i, 1, &dummy);
|
||||
if (res < 0) {
|
||||
return -1;
|
||||
}
|
||||
if (!res) {
|
||||
res = vvfat_read(s->bs, offset, s->cluster_buffer, 1);
|
||||
if (res) {
|
||||
|
|
|
@ -301,7 +301,6 @@ glusterfs=""
|
|||
glusterfs_xlator_opt="no"
|
||||
glusterfs_discard="no"
|
||||
glusterfs_zerofill="no"
|
||||
archipelago="no"
|
||||
gtk=""
|
||||
gtkabi=""
|
||||
gtk_gl="no"
|
||||
|
@ -1101,10 +1100,6 @@ for opt do
|
|||
;;
|
||||
--enable-glusterfs) glusterfs="yes"
|
||||
;;
|
||||
--disable-archipelago) archipelago="no"
|
||||
;;
|
||||
--enable-archipelago) archipelago="yes"
|
||||
;;
|
||||
--disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
|
||||
echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
|
||||
;;
|
||||
|
@ -1396,7 +1391,6 @@ disabled with --disable-FEATURE, default is enabled if available:
|
|||
seccomp seccomp support
|
||||
coroutine-pool coroutine freelist (better performance)
|
||||
glusterfs GlusterFS backend
|
||||
archipelago Archipelago backend
|
||||
tpm TPM support
|
||||
libssh2 ssh block device support
|
||||
numa libnuma support
|
||||
|
@ -3466,37 +3460,6 @@ EOF
|
|||
fi
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# archipelago probe
|
||||
if test "$archipelago" != "no" ; then
|
||||
cat > $TMPC <<EOF
|
||||
#include <stdio.h>
|
||||
#include <xseg/xseg.h>
|
||||
#include <xseg/protocol.h>
|
||||
int main(void) {
|
||||
xseg_initialize();
|
||||
return 0;
|
||||
}
|
||||
EOF
|
||||
archipelago_libs=-lxseg
|
||||
if compile_prog "" "$archipelago_libs"; then
|
||||
archipelago="yes"
|
||||
libs_tools="$archipelago_libs $libs_tools"
|
||||
libs_softmmu="$archipelago_libs $libs_softmmu"
|
||||
|
||||
echo "WARNING: Please check the licenses of QEMU and libxseg carefully."
|
||||
echo "GPLv3 versions of libxseg may not be compatible with QEMU's"
|
||||
echo "license and therefore prevent redistribution."
|
||||
echo
|
||||
echo "To disable Archipelago, use --disable-archipelago"
|
||||
else
|
||||
if test "$archipelago" = "yes" ; then
|
||||
feature_not_found "Archipelago backend support" "Install libxseg devel"
|
||||
fi
|
||||
archipelago="no"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
##########################################
|
||||
# glusterfs probe
|
||||
|
@ -5099,7 +5062,6 @@ echo "coroutine backend $coroutine"
|
|||
echo "coroutine pool $coroutine_pool"
|
||||
echo "debug stack usage $debug_stack_usage"
|
||||
echo "GlusterFS support $glusterfs"
|
||||
echo "Archipelago support $archipelago"
|
||||
echo "gcov $gcov_tool"
|
||||
echo "gcov enabled $gcov"
|
||||
echo "TPM support $tpm"
|
||||
|
@ -5640,11 +5602,6 @@ if test "$glusterfs_zerofill" = "yes" ; then
|
|||
echo "CONFIG_GLUSTERFS_ZEROFILL=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$archipelago" = "yes" ; then
|
||||
echo "CONFIG_ARCHIPELAGO=m" >> $config_host_mak
|
||||
echo "ARCHIPELAGO_LIBS=$archipelago_libs" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$libssh2" = "yes" ; then
|
||||
echo "CONFIG_LIBSSH2=m" >> $config_host_mak
|
||||
echo "LIBSSH2_CFLAGS=$libssh2_cflags" >> $config_host_mak
|
||||
|
|
|
@ -276,6 +276,8 @@ static int mig_save_device_bulk(QEMUFile *f, BlkMigDevState *bmds)
|
|||
if (bmds->shared_base) {
|
||||
qemu_mutex_lock_iothread();
|
||||
aio_context_acquire(blk_get_aio_context(bb));
|
||||
/* Skip unallocated sectors; intentionally treats failure as
|
||||
* an allocated sector */
|
||||
while (cur_sector < total_sectors &&
|
||||
!bdrv_is_allocated(blk_bs(bb), cur_sector,
|
||||
MAX_IS_ALLOCATED_SEARCH, &nr_sectors)) {
|
||||
|
|
|
@ -251,6 +251,7 @@
|
|||
# 2.5: 'host_floppy' dropped
|
||||
# 2.6: 'luks' added
|
||||
# 2.8: 'replication' added, 'tftp' dropped
|
||||
# 2.9: 'archipelago' dropped
|
||||
#
|
||||
# @backing_file: #optional the name of the backing file (for copy-on-write)
|
||||
#
|
||||
|
@ -2129,7 +2130,7 @@
|
|||
# Since: 2.0
|
||||
##
|
||||
{ 'enum': 'BlockdevDriver',
|
||||
'data': [ 'archipelago', 'blkdebug', 'blkverify', 'bochs', 'cloop',
|
||||
'data': [ 'blkdebug', 'blkverify', 'bochs', 'cloop',
|
||||
'dmg', 'file', 'ftp', 'ftps', 'gluster', 'host_cdrom',
|
||||
'host_device', 'http', 'https', 'iscsi', 'luks', 'nbd', 'nfs',
|
||||
'null-aio', 'null-co', 'parallels', 'qcow', 'qcow2', 'qed',
|
||||
|
@ -2342,35 +2343,6 @@
|
|||
'*cache-clean-interval': 'int' } }
|
||||
|
||||
|
||||
##
|
||||
# @BlockdevOptionsArchipelago:
|
||||
#
|
||||
# Driver specific block device options for Archipelago.
|
||||
#
|
||||
# @volume: Name of the Archipelago volume image
|
||||
#
|
||||
# @mport: #optional The port number on which mapperd is
|
||||
# listening. This is optional
|
||||
# and if not specified, QEMU will make Archipelago
|
||||
# use the default port (1001).
|
||||
#
|
||||
# @vport: #optional The port number on which vlmcd is
|
||||
# listening. This is optional
|
||||
# and if not specified, QEMU will make Archipelago
|
||||
# use the default port (501).
|
||||
#
|
||||
# @segment: #optional The name of the shared memory segment
|
||||
# Archipelago stack is using. This is optional
|
||||
# and if not specified, QEMU will make Archipelago
|
||||
# use the default value, 'archipelago'.
|
||||
# Since: 2.2
|
||||
##
|
||||
{ 'struct': 'BlockdevOptionsArchipelago',
|
||||
'data': { 'volume': 'str',
|
||||
'*mport': 'int',
|
||||
'*vport': 'int',
|
||||
'*segment': 'str' } }
|
||||
|
||||
##
|
||||
# @BlockdevOptionsSsh:
|
||||
#
|
||||
|
@ -2884,7 +2856,6 @@
|
|||
'*detect-zeroes': 'BlockdevDetectZeroesOptions' },
|
||||
'discriminator': 'driver',
|
||||
'data': {
|
||||
'archipelago':'BlockdevOptionsArchipelago',
|
||||
'blkdebug': 'BlockdevOptionsBlkdebug',
|
||||
'blkverify': 'BlockdevOptionsBlkverify',
|
||||
'bochs': 'BlockdevOptionsGenericFormat',
|
||||
|
|
|
@ -39,7 +39,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
|||
. ./common.pattern
|
||||
|
||||
_supported_fmt raw qcow2 qed
|
||||
_supported_proto file sheepdog rbd nfs archipelago
|
||||
_supported_proto file sheepdog rbd nfs
|
||||
_supported_os Linux
|
||||
|
||||
echo "=== Creating image"
|
||||
|
|
|
@ -156,7 +156,6 @@ check options
|
|||
-nbd test nbd
|
||||
-ssh test ssh
|
||||
-nfs test nfs
|
||||
-archipelago test archipelago
|
||||
-luks test luks
|
||||
-xdiff graphical mode diff
|
||||
-nocache use O_DIRECT on backing file
|
||||
|
@ -271,11 +270,6 @@ testlist options
|
|||
xpand=false
|
||||
;;
|
||||
|
||||
-archipelago)
|
||||
IMGPROTO=archipelago
|
||||
xpand=false
|
||||
;;
|
||||
|
||||
-nocache)
|
||||
CACHEMODE="none"
|
||||
CACHEMODE_IS_DEFAULT=false
|
||||
|
|
|
@ -112,7 +112,6 @@ _filter_img_create()
|
|||
-e "s# block_size=[0-9]\\+##g" \
|
||||
-e "s# block_state_zero=\\(on\\|off\\)##g" \
|
||||
-e "s# log_size=[0-9]\\+##g" \
|
||||
-e "s/archipelago:a/TEST_DIR\//g" \
|
||||
-e "s# refcount_bits=[0-9]\\+##g" \
|
||||
-e "s# key-secret=[a-zA-Z0-9]\\+##g"
|
||||
}
|
||||
|
@ -136,8 +135,7 @@ _filter_img_info()
|
|||
-e "/lazy_refcounts: \\(on\\|off\\)/d" \
|
||||
-e "/block_size: [0-9]\\+/d" \
|
||||
-e "/block_state_zero: \\(on\\|off\\)/d" \
|
||||
-e "/log_size: [0-9]\\+/d" \
|
||||
-e "s/archipelago:a/TEST_DIR\//g"
|
||||
-e "/log_size: [0-9]\\+/d"
|
||||
}
|
||||
|
||||
# filter out offsets and file names from qemu-img map
|
||||
|
|
|
@ -70,8 +70,6 @@ if [ "$IMGOPTSSYNTAX" = "true" ]; then
|
|||
elif [ "$IMGPROTO" = "nfs" ]; then
|
||||
TEST_DIR="$DRIVER,file.driver=nfs,file.filename=nfs://127.0.0.1/$TEST_DIR"
|
||||
TEST_IMG=$TEST_DIR/t.$IMGFMT
|
||||
elif [ "$IMGPROTO" = "archipelago" ]; then
|
||||
TEST_IMG="$DRIVER,file.driver=archipelago,file.volume=:at.$IMGFMT"
|
||||
else
|
||||
TEST_IMG="$DRIVER,file.driver=$IMGPROTO,file.filename=$TEST_DIR/t.$IMGFMT"
|
||||
fi
|
||||
|
@ -87,8 +85,6 @@ else
|
|||
elif [ "$IMGPROTO" = "nfs" ]; then
|
||||
TEST_DIR="nfs://127.0.0.1/$TEST_DIR"
|
||||
TEST_IMG=$TEST_DIR/t.$IMGFMT
|
||||
elif [ "$IMGPROTO" = "archipelago" ]; then
|
||||
TEST_IMG="archipelago:at.$IMGFMT"
|
||||
else
|
||||
TEST_IMG=$IMGPROTO:$TEST_DIR/t.$IMGFMT
|
||||
fi
|
||||
|
@ -215,10 +211,6 @@ _cleanup_test_img()
|
|||
rbd --no-progress rm "$TEST_DIR/t.$IMGFMT" > /dev/null
|
||||
;;
|
||||
|
||||
archipelago)
|
||||
vlmc remove "at.$IMGFMT" > /dev/null
|
||||
;;
|
||||
|
||||
sheepdog)
|
||||
collie vdi delete "$TEST_DIR/t.$IMGFMT"
|
||||
;;
|
||||
|
|
Loading…
Reference in New Issue