Block layer patches for 2.8.0-rc0

-----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2.0.22 (GNU/Linux)
 
 iQIcBAABAgAGBQJYJefEAAoJEH8JsnLIjy/WiqIP/icOckkeGIOhc59YMcZcqLVL
 wby2KbnBPMZx+ElgRDAn0GEQW83lEeMjGgHfgrOXjI1F1zmSYg6ieT4oWKXCNF5C
 Na/5lR+qYmSWGYZW02LGeM6R055IRO4BP/J0M6Uh8+4xgRPR30vkCiKMzLih7Vfi
 +JED8mdHdaIlqdmxB1gJV60kf7M2g9e6tPgvCPxjOtjBVoblry2yet7NhfikhBoH
 fTpaEv7BC+8nnm/DuFEwfmwT6wMIqyOnpjKHPd6p1qq4MngY5tNuq5SOlWn3l7wV
 Z83RJmI08Jn/p+ZNwb45Z+6Iimgqn3msvMN25nzmHO6d1ck+4Onp16JfyVEHzYnR
 HKlGcSpW+HX0zkkERRXTeFDScDiO19QvIigV8vfM3eeOkn2YzoxbQjgrSI/eEsm6
 p+EkBTErWIcZZm1R7Y4Z9/MnpN+35Vz6hQ6Ak0IPLwSCvrEO3aGRH1VCGEBRIFo6
 T9mJI0nYk5eBDEUU9Pxp54T2WNw95eMI7L51ZhvOsXhSsYFWDo/UaM0KyyWkJQw7
 N3D8g/FXUmvml+q2OokVecV5yDIrhrW2+VuS0M/e/fZpCfbcXFrAjUPqIYwEsZ5u
 jGchqNCfwbQ1dqI4kffJOudDq7PpUIgTNDD+H87prC6nRCcsNqeF39wQ0hdQZnyQ
 +wBEOye0V4kabQ9HxQk2
 =lpt5
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'kwolf/tags/for-upstream' into staging

Block layer patches for 2.8.0-rc0

# gpg: Signature made Fri 11 Nov 2016 03:46:12 PM 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

* kwolf/tags/for-upstream:
  raw-posix: Rename 'raw_s' to 'rs'
  iotests: Always use -machine accel=qtest
  iotests: Skip test 162 if there is no SSH support
  block: Emit modules in bdrv_iterate_format()
  block: Fix bdrv_iterate_format() sorting
  nfs: Fix memory leak in nfs_file_create()
  qcow2: Remove stale FIXME comment
  raw_bsd: don't check size alignment when only offset is set
  raw_bsd: move check to prevent overflow
  hmp: Make block_stream set an explicit job ID
  block/ssh: Code cleanup for unused parameter
  block/nbd: Fix the leaked visitor

Message-id: 1478883311-24052-1-git-send-email-kwolf@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Stefan Hajnoczi 2016-11-14 15:42:22 +00:00
commit a77beb0fcb
11 changed files with 71 additions and 45 deletions

20
block.c
View File

@ -2796,7 +2796,7 @@ const char *bdrv_get_format_name(BlockDriverState *bs)
static int qsort_strcmp(const void *a, const void *b) static int qsort_strcmp(const void *a, const void *b)
{ {
return strcmp(a, b); return strcmp(*(char *const *)a, *(char *const *)b);
} }
void bdrv_iterate_format(void (*it)(void *opaque, const char *name), void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
@ -2822,6 +2822,24 @@ void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
} }
} }
for (i = 0; i < (int)ARRAY_SIZE(block_driver_modules); i++) {
const char *format_name = block_driver_modules[i].format_name;
if (format_name) {
bool found = false;
int j = count;
while (formats && j && !found) {
found = !strcmp(formats[--j], format_name);
}
if (!found) {
formats = g_renew(const char *, formats, count + 1);
formats[count++] = format_name;
}
}
}
qsort(formats, count, sizeof(formats[0]), qsort_strcmp); qsort(formats, count, sizeof(formats[0]), qsort_strcmp);
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {

View File

@ -536,6 +536,7 @@ static void nbd_refresh_filename(BlockDriverState *bs, QDict *options)
ov = qobject_output_visitor_new(&saddr_qdict); ov = qobject_output_visitor_new(&saddr_qdict);
visit_type_SocketAddress(ov, NULL, &s->saddr, &error_abort); visit_type_SocketAddress(ov, NULL, &s->saddr, &error_abort);
visit_complete(ov, &saddr_qdict); visit_complete(ov, &saddr_qdict);
visit_free(ov);
assert(qobject_type(saddr_qdict) == QTYPE_QDICT); assert(qobject_type(saddr_qdict) == QTYPE_QDICT);
qdict_put_obj(opts, "server", saddr_qdict); qdict_put_obj(opts, "server", saddr_qdict);

View File

@ -676,6 +676,7 @@ static int nfs_file_create(const char *url, QemuOpts *opts, Error **errp)
ret = nfs_ftruncate(client->context, client->fh, total_size); ret = nfs_ftruncate(client->context, client->fh, total_size);
nfs_client_close(client); nfs_client_close(client);
out: out:
QDECREF(options);
g_free(client); g_free(client);
return ret; return ret;
} }

View File

@ -473,8 +473,6 @@ static inline uint64_t refcount_diff(uint64_t r1, uint64_t r2)
return r1 > r2 ? r1 - r2 : r2 - r1; return r1 > r2 ? r1 - r2 : r2 - r1;
} }
// FIXME Need qcow2_ prefix to global functions
/* qcow2.c functions */ /* qcow2.c functions */
int qcow2_backing_read1(BlockDriverState *bs, QEMUIOVector *qiov, int qcow2_backing_read1(BlockDriverState *bs, QEMUIOVector *qiov,
int64_t sector_num, int nb_sectors); int64_t sector_num, int nb_sectors);

View File

@ -542,7 +542,7 @@ static int raw_reopen_prepare(BDRVReopenState *state,
BlockReopenQueue *queue, Error **errp) BlockReopenQueue *queue, Error **errp)
{ {
BDRVRawState *s; BDRVRawState *s;
BDRVRawReopenState *raw_s; BDRVRawReopenState *rs;
int ret = 0; int ret = 0;
Error *local_err = NULL; Error *local_err = NULL;
@ -552,15 +552,15 @@ static int raw_reopen_prepare(BDRVReopenState *state,
s = state->bs->opaque; s = state->bs->opaque;
state->opaque = g_new0(BDRVRawReopenState, 1); state->opaque = g_new0(BDRVRawReopenState, 1);
raw_s = state->opaque; rs = state->opaque;
if (s->type == FTYPE_CD) { if (s->type == FTYPE_CD) {
raw_s->open_flags |= O_NONBLOCK; rs->open_flags |= O_NONBLOCK;
} }
raw_parse_flags(state->flags, &raw_s->open_flags); raw_parse_flags(state->flags, &rs->open_flags);
raw_s->fd = -1; rs->fd = -1;
int fcntl_flags = O_APPEND | O_NONBLOCK; int fcntl_flags = O_APPEND | O_NONBLOCK;
#ifdef O_NOATIME #ifdef O_NOATIME
@ -569,35 +569,35 @@ static int raw_reopen_prepare(BDRVReopenState *state,
#ifdef O_ASYNC #ifdef O_ASYNC
/* Not all operating systems have O_ASYNC, and those that don't /* Not all operating systems have O_ASYNC, and those that don't
* will not let us track the state into raw_s->open_flags (typically * will not let us track the state into rs->open_flags (typically
* you achieve the same effect with an ioctl, for example I_SETSIG * you achieve the same effect with an ioctl, for example I_SETSIG
* on Solaris). But we do not use O_ASYNC, so that's fine. * on Solaris). But we do not use O_ASYNC, so that's fine.
*/ */
assert((s->open_flags & O_ASYNC) == 0); assert((s->open_flags & O_ASYNC) == 0);
#endif #endif
if ((raw_s->open_flags & ~fcntl_flags) == (s->open_flags & ~fcntl_flags)) { if ((rs->open_flags & ~fcntl_flags) == (s->open_flags & ~fcntl_flags)) {
/* dup the original fd */ /* dup the original fd */
raw_s->fd = qemu_dup(s->fd); rs->fd = qemu_dup(s->fd);
if (raw_s->fd >= 0) { if (rs->fd >= 0) {
ret = fcntl_setfl(raw_s->fd, raw_s->open_flags); ret = fcntl_setfl(rs->fd, rs->open_flags);
if (ret) { if (ret) {
qemu_close(raw_s->fd); qemu_close(rs->fd);
raw_s->fd = -1; rs->fd = -1;
} }
} }
} }
/* If we cannot use fcntl, or fcntl failed, fall back to qemu_open() */ /* If we cannot use fcntl, or fcntl failed, fall back to qemu_open() */
if (raw_s->fd == -1) { if (rs->fd == -1) {
const char *normalized_filename = state->bs->filename; const char *normalized_filename = state->bs->filename;
ret = raw_normalize_devicepath(&normalized_filename); ret = raw_normalize_devicepath(&normalized_filename);
if (ret < 0) { if (ret < 0) {
error_setg_errno(errp, -ret, "Could not normalize device path"); error_setg_errno(errp, -ret, "Could not normalize device path");
} else { } else {
assert(!(raw_s->open_flags & O_CREAT)); assert(!(rs->open_flags & O_CREAT));
raw_s->fd = qemu_open(normalized_filename, raw_s->open_flags); rs->fd = qemu_open(normalized_filename, rs->open_flags);
if (raw_s->fd == -1) { if (rs->fd == -1) {
error_setg_errno(errp, errno, "Could not reopen file"); error_setg_errno(errp, errno, "Could not reopen file");
ret = -1; ret = -1;
} }
@ -606,11 +606,11 @@ static int raw_reopen_prepare(BDRVReopenState *state,
/* Fail already reopen_prepare() if we can't get a working O_DIRECT /* Fail already reopen_prepare() if we can't get a working O_DIRECT
* alignment with the new fd. */ * alignment with the new fd. */
if (raw_s->fd != -1) { if (rs->fd != -1) {
raw_probe_alignment(state->bs, raw_s->fd, &local_err); raw_probe_alignment(state->bs, rs->fd, &local_err);
if (local_err) { if (local_err) {
qemu_close(raw_s->fd); qemu_close(rs->fd);
raw_s->fd = -1; rs->fd = -1;
error_propagate(errp, local_err); error_propagate(errp, local_err);
ret = -EINVAL; ret = -EINVAL;
} }
@ -621,13 +621,13 @@ static int raw_reopen_prepare(BDRVReopenState *state,
static void raw_reopen_commit(BDRVReopenState *state) static void raw_reopen_commit(BDRVReopenState *state)
{ {
BDRVRawReopenState *raw_s = state->opaque; BDRVRawReopenState *rs = state->opaque;
BDRVRawState *s = state->bs->opaque; BDRVRawState *s = state->bs->opaque;
s->open_flags = raw_s->open_flags; s->open_flags = rs->open_flags;
qemu_close(s->fd); qemu_close(s->fd);
s->fd = raw_s->fd; s->fd = rs->fd;
g_free(state->opaque); g_free(state->opaque);
state->opaque = NULL; state->opaque = NULL;
@ -636,16 +636,16 @@ static void raw_reopen_commit(BDRVReopenState *state)
static void raw_reopen_abort(BDRVReopenState *state) static void raw_reopen_abort(BDRVReopenState *state)
{ {
BDRVRawReopenState *raw_s = state->opaque; BDRVRawReopenState *rs = state->opaque;
/* nothing to do if NULL, we didn't get far enough */ /* nothing to do if NULL, we didn't get far enough */
if (raw_s == NULL) { if (rs == NULL) {
return; return;
} }
if (raw_s->fd >= 0) { if (rs->fd >= 0) {
qemu_close(raw_s->fd); qemu_close(rs->fd);
raw_s->fd = -1; rs->fd = -1;
} }
g_free(state->opaque); g_free(state->opaque);
state->opaque = NULL; state->opaque = NULL;

View File

@ -91,6 +91,14 @@ static int raw_read_options(QDict *options, BlockDriverState *bs,
} }
s->offset = qemu_opt_get_size(opts, "offset", 0); s->offset = qemu_opt_get_size(opts, "offset", 0);
if (s->offset > real_size) {
error_setg(errp, "Offset (%" PRIu64 ") cannot be greater than "
"size of the containing file (%" PRId64 ")",
s->offset, real_size);
ret = -EINVAL;
goto end;
}
if (qemu_opt_find(opts, "size") != NULL) { if (qemu_opt_find(opts, "size") != NULL) {
s->size = qemu_opt_get_size(opts, "size", 0); s->size = qemu_opt_get_size(opts, "size", 0);
s->has_size = true; s->has_size = true;
@ -100,7 +108,7 @@ static int raw_read_options(QDict *options, BlockDriverState *bs,
} }
/* Check size and offset */ /* Check size and offset */
if (real_size < s->offset || (real_size - s->offset) < s->size) { if ((real_size - s->offset) < s->size) {
error_setg(errp, "The sum of offset (%" PRIu64 ") and size " error_setg(errp, "The sum of offset (%" PRIu64 ") and size "
"(%" PRIu64 ") has to be smaller or equal to the " "(%" PRIu64 ") has to be smaller or equal to the "
" actual size of the containing file (%" PRId64 ")", " actual size of the containing file (%" PRId64 ")",
@ -111,7 +119,7 @@ static int raw_read_options(QDict *options, BlockDriverState *bs,
/* Make sure size is multiple of BDRV_SECTOR_SIZE to prevent rounding /* Make sure size is multiple of BDRV_SECTOR_SIZE to prevent rounding
* up and leaking out of the specified area. */ * up and leaking out of the specified area. */
if (!QEMU_IS_ALIGNED(s->size, BDRV_SECTOR_SIZE)) { if (s->has_size && !QEMU_IS_ALIGNED(s->size, BDRV_SECTOR_SIZE)) {
error_setg(errp, "Specified size is not multiple of %llu", error_setg(errp, "Specified size is not multiple of %llu",
BDRV_SECTOR_SIZE); BDRV_SECTOR_SIZE);
ret = -EINVAL; ret = -EINVAL;

View File

@ -582,8 +582,7 @@ static bool ssh_process_legacy_socket_options(QDict *output_opts,
return true; return true;
} }
static InetSocketAddress *ssh_config(BDRVSSHState *s, QDict *options, static InetSocketAddress *ssh_config(QDict *options, Error **errp)
Error **errp)
{ {
InetSocketAddress *inet = NULL; InetSocketAddress *inet = NULL;
QDict *addr = NULL; QDict *addr = NULL;
@ -661,7 +660,7 @@ static int connect_to_ssh(BDRVSSHState *s, QDict *options,
} }
/* Pop the config into our state object, Exit if invalid */ /* Pop the config into our state object, Exit if invalid */
s->inet = ssh_config(s, options, errp); s->inet = ssh_config(options, errp);
if (!s->inet) { if (!s->inet) {
ret = -EINVAL; ret = -EINVAL;
goto err; goto err;

2
hmp.c
View File

@ -1570,7 +1570,7 @@ void hmp_block_stream(Monitor *mon, const QDict *qdict)
const char *base = qdict_get_try_str(qdict, "base"); const char *base = qdict_get_try_str(qdict, "base");
int64_t speed = qdict_get_try_int(qdict, "speed", 0); int64_t speed = qdict_get_try_int(qdict, "speed", 0);
qmp_block_stream(false, NULL, device, base != NULL, base, false, NULL, qmp_block_stream(true, device, device, base != NULL, base, false, NULL,
false, NULL, qdict_haskey(qdict, "speed"), speed, false, NULL, qdict_haskey(qdict, "speed"), speed,
true, BLOCKDEV_ON_ERROR_REPORT, &error); true, BLOCKDEV_ON_ERROR_REPORT, &error);

View File

@ -35,6 +35,9 @@ status=1 # failure is the default!
_supported_fmt generic _supported_fmt generic
_supported_os Linux _supported_os Linux
test_ssh=$($QEMU_IMG --help | grep '^Supported formats:.* ssh\( \|$\)')
[ "$test_ssh" = "" ] && _notrun "ssh support required"
echo echo
echo '=== NBD ===' echo '=== NBD ==='
# NBD expects all of its arguments to be strings # NBD expects all of its arguments to be strings

View File

@ -51,7 +51,7 @@ export IMGOPTS=""
export CACHEMODE="writeback" export CACHEMODE="writeback"
export QEMU_IO_OPTIONS="" export QEMU_IO_OPTIONS=""
export CACHEMODE_IS_DEFAULT=true export CACHEMODE_IS_DEFAULT=true
export QEMU_OPTIONS="-nodefaults" export QEMU_OPTIONS="-nodefaults -machine accel=qtest"
export VALGRIND_QEMU= export VALGRIND_QEMU=
export IMGKEYSECRET= export IMGKEYSECRET=
export IMGOPTSSYNTAX=false export IMGOPTSSYNTAX=false

View File

@ -155,14 +155,12 @@ function _launch_qemu()
if [ -z "$keep_stderr" ]; then if [ -z "$keep_stderr" ]; then
QEMU_NEED_PID='y'\ QEMU_NEED_PID='y'\
${QEMU} -nographic -serial none ${comm} -machine accel=qtest "${@}" \ ${QEMU} -nographic -serial none ${comm} "${@}" >"${fifo_out}" \
>"${fifo_out}" \
2>&1 \ 2>&1 \
<"${fifo_in}" & <"${fifo_in}" &
elif [ "$keep_stderr" = "y" ]; then elif [ "$keep_stderr" = "y" ]; then
QEMU_NEED_PID='y'\ QEMU_NEED_PID='y'\
${QEMU} -nographic -serial none ${comm} -machine accel=qtest "${@}" \ ${QEMU} -nographic -serial none ${comm} "${@}" >"${fifo_out}" \
>"${fifo_out}" \
<"${fifo_in}" & <"${fifo_in}" &
else else
exit 1 exit 1