Block patches:

- Fix for block jobs when used with I/O threads
 - Fix for a corruption when using qcow2's LUKS encryption mode
 - cURL fix
 - check-block.sh cleanups (for make check)
 - Refactoring
 -----BEGIN PGP SIGNATURE-----
 
 iQFGBAABCAAwFiEEkb62CjDbPohX0Rgp9AfbAGHVz0AFAl1/kPsSHG1yZWl0ekBy
 ZWRoYXQuY29tAAoJEPQH2wBh1c9Aeg8H/RTwqlrCmKmOHECAvnHduKusGJtEcTac
 DRSl0g7uDNaNFSOVEPwip7U2y82emwI0SPW6ErHIO90qUjOOzyu3zFTqfweuwBjN
 6Am+AChHOabrEc8upNj+HGMBBge9FARjhI7AlhCqNz1aQUMeOqKwahWESPEJ/Rfg
 kMXcHhAp5E1vtHIOpYdxrgbwhJxpXPPZjhorUpmd4pZr+GZ8XxrW03C1T+EWCJL4
 5g/JVsqgF90nJ4YGWy/YJiN5UBlSr5NjQhEso89X35ATAogSTVn6qfEXseqTeZJN
 qVcDCpUPh28FTM5lhvxKFTHjBF0oqWy3nGOHZ2JBKohVOYT/uJ9Kne4=
 =/poc
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/maxreitz/tags/pull-block-2019-09-16' into staging

Block patches:
- Fix for block jobs when used with I/O threads
- Fix for a corruption when using qcow2's LUKS encryption mode
- cURL fix
- check-block.sh cleanups (for make check)
- Refactoring

# gpg: Signature made Mon 16 Sep 2019 14:41:15 BST
# gpg:                using RSA key 91BEB60A30DB3E8857D11829F407DB0061D5CF40
# gpg:                issuer "mreitz@redhat.com"
# gpg: Good signature from "Max Reitz <mreitz@redhat.com>" [full]
# Primary key fingerprint: 91BE B60A 30DB 3E88 57D1  1829 F407 DB00 61D5 CF40

* remotes/maxreitz/tags/pull-block-2019-09-16:
  qemu-iotests: Add test for bz #1745922
  block/qcow2: refactor encryption code
  block/qcow2: Fix corruption introduced by commit 8ac0f15f33
  blockjob: update nodes head while removing all bdrv
  curl: Check curl_multi_add_handle()'s return code
  curl: Handle success in multi_check_completion
  curl: Report only ready sockets
  curl: Pass CURLSocket to curl_multi_do()
  curl: Check completion in curl_multi_do()
  curl: Keep *socket until the end of curl_sock_cb()
  curl: Keep pointer to the CURLState in CURLSocket
  tests/qemu-iotests: Fix qemu-io related output in 026.out.nocache
  tests/Makefile: Do not print the name of the check-block.sh shell script
  tests/qemu-iotests/check: Replace "tests" with "iotests" in final status text
  block: Remove unused masks
  block: Use QEMU_IS_ALIGNED

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2019-09-16 15:25:55 +01:00
commit 521db80318
20 changed files with 381 additions and 235 deletions

View File

@ -248,8 +248,8 @@ bochs_co_preadv(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
QEMUIOVector local_qiov; QEMUIOVector local_qiov;
int ret; int ret;
assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0); assert(QEMU_IS_ALIGNED(offset, BDRV_SECTOR_SIZE));
assert((bytes & (BDRV_SECTOR_SIZE - 1)) == 0); assert(QEMU_IS_ALIGNED(bytes, BDRV_SECTOR_SIZE));
qemu_iovec_init(&local_qiov, qiov->niov); qemu_iovec_init(&local_qiov, qiov->niov);
qemu_co_mutex_lock(&s->lock); qemu_co_mutex_lock(&s->lock);

View File

@ -253,8 +253,8 @@ cloop_co_preadv(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
int nb_sectors = bytes >> BDRV_SECTOR_BITS; int nb_sectors = bytes >> BDRV_SECTOR_BITS;
int ret, i; int ret, i;
assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0); assert(QEMU_IS_ALIGNED(offset, BDRV_SECTOR_SIZE));
assert((bytes & (BDRV_SECTOR_SIZE - 1)) == 0); assert(QEMU_IS_ALIGNED(bytes, BDRV_SECTOR_SIZE));
qemu_co_mutex_lock(&s->lock); qemu_co_mutex_lock(&s->lock);

View File

@ -80,6 +80,7 @@ static CURLMcode __curl_multi_socket_action(CURLM *multi_handle,
#define CURL_BLOCK_OPT_TIMEOUT_DEFAULT 5 #define CURL_BLOCK_OPT_TIMEOUT_DEFAULT 5
struct BDRVCURLState; struct BDRVCURLState;
struct CURLState;
static bool libcurl_initialized; static bool libcurl_initialized;
@ -97,6 +98,7 @@ typedef struct CURLAIOCB {
typedef struct CURLSocket { typedef struct CURLSocket {
int fd; int fd;
struct CURLState *state;
QLIST_ENTRY(CURLSocket) next; QLIST_ENTRY(CURLSocket) next;
} CURLSocket; } CURLSocket;
@ -137,7 +139,6 @@ typedef struct BDRVCURLState {
static void curl_clean_state(CURLState *s); static void curl_clean_state(CURLState *s);
static void curl_multi_do(void *arg); static void curl_multi_do(void *arg);
static void curl_multi_read(void *arg);
#ifdef NEED_CURL_TIMER_CALLBACK #ifdef NEED_CURL_TIMER_CALLBACK
/* Called from curl_multi_do_locked, with s->mutex held. */ /* Called from curl_multi_do_locked, with s->mutex held. */
@ -170,33 +171,29 @@ static int curl_sock_cb(CURL *curl, curl_socket_t fd, int action,
QLIST_FOREACH(socket, &state->sockets, next) { QLIST_FOREACH(socket, &state->sockets, next) {
if (socket->fd == fd) { if (socket->fd == fd) {
if (action == CURL_POLL_REMOVE) {
QLIST_REMOVE(socket, next);
g_free(socket);
}
break; break;
} }
} }
if (!socket) { if (!socket) {
socket = g_new0(CURLSocket, 1); socket = g_new0(CURLSocket, 1);
socket->fd = fd; socket->fd = fd;
socket->state = state;
QLIST_INSERT_HEAD(&state->sockets, socket, next); QLIST_INSERT_HEAD(&state->sockets, socket, next);
} }
socket = NULL;
trace_curl_sock_cb(action, (int)fd); trace_curl_sock_cb(action, (int)fd);
switch (action) { switch (action) {
case CURL_POLL_IN: case CURL_POLL_IN:
aio_set_fd_handler(s->aio_context, fd, false, aio_set_fd_handler(s->aio_context, fd, false,
curl_multi_read, NULL, NULL, state); curl_multi_do, NULL, NULL, socket);
break; break;
case CURL_POLL_OUT: case CURL_POLL_OUT:
aio_set_fd_handler(s->aio_context, fd, false, aio_set_fd_handler(s->aio_context, fd, false,
NULL, curl_multi_do, NULL, state); NULL, curl_multi_do, NULL, socket);
break; break;
case CURL_POLL_INOUT: case CURL_POLL_INOUT:
aio_set_fd_handler(s->aio_context, fd, false, aio_set_fd_handler(s->aio_context, fd, false,
curl_multi_read, curl_multi_do, NULL, state); curl_multi_do, curl_multi_do, NULL, socket);
break; break;
case CURL_POLL_REMOVE: case CURL_POLL_REMOVE:
aio_set_fd_handler(s->aio_context, fd, false, aio_set_fd_handler(s->aio_context, fd, false,
@ -204,6 +201,11 @@ static int curl_sock_cb(CURL *curl, curl_socket_t fd, int action,
break; break;
} }
if (action == CURL_POLL_REMOVE) {
QLIST_REMOVE(socket, next);
g_free(socket);
}
return 0; return 0;
} }
@ -227,7 +229,6 @@ static size_t curl_read_cb(void *ptr, size_t size, size_t nmemb, void *opaque)
{ {
CURLState *s = ((CURLState*)opaque); CURLState *s = ((CURLState*)opaque);
size_t realsize = size * nmemb; size_t realsize = size * nmemb;
int i;
trace_curl_read_cb(realsize); trace_curl_read_cb(realsize);
@ -243,32 +244,6 @@ static size_t curl_read_cb(void *ptr, size_t size, size_t nmemb, void *opaque)
memcpy(s->orig_buf + s->buf_off, ptr, realsize); memcpy(s->orig_buf + s->buf_off, ptr, realsize);
s->buf_off += realsize; s->buf_off += realsize;
for(i=0; i<CURL_NUM_ACB; i++) {
CURLAIOCB *acb = s->acb[i];
if (!acb)
continue;
if ((s->buf_off >= acb->end)) {
size_t request_length = acb->bytes;
qemu_iovec_from_buf(acb->qiov, 0, s->orig_buf + acb->start,
acb->end - acb->start);
if (acb->end - acb->start < request_length) {
size_t offset = acb->end - acb->start;
qemu_iovec_memset(acb->qiov, offset, 0,
request_length - offset);
}
acb->ret = 0;
s->acb[i] = NULL;
qemu_mutex_unlock(&s->s->mutex);
aio_co_wake(acb->co);
qemu_mutex_lock(&s->s->mutex);
}
}
read_end: read_end:
/* curl will error out if we do not return this value */ /* curl will error out if we do not return this value */
return size * nmemb; return size * nmemb;
@ -349,13 +324,14 @@ static void curl_multi_check_completion(BDRVCURLState *s)
break; break;
if (msg->msg == CURLMSG_DONE) { if (msg->msg == CURLMSG_DONE) {
int i;
CURLState *state = NULL; CURLState *state = NULL;
bool error = msg->data.result != CURLE_OK;
curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE,
(char **)&state); (char **)&state);
/* ACBs for successful messages get completed in curl_read_cb */ if (error) {
if (msg->data.result != CURLE_OK) {
int i;
static int errcount = 100; static int errcount = 100;
/* Don't lose the original error message from curl, since /* Don't lose the original error message from curl, since
@ -367,6 +343,7 @@ static void curl_multi_check_completion(BDRVCURLState *s)
error_report("curl: further errors suppressed"); error_report("curl: further errors suppressed");
} }
} }
}
for (i = 0; i < CURL_NUM_ACB; i++) { for (i = 0; i < CURL_NUM_ACB; i++) {
CURLAIOCB *acb = state->acb[i]; CURLAIOCB *acb = state->acb[i];
@ -375,13 +352,27 @@ static void curl_multi_check_completion(BDRVCURLState *s)
continue; continue;
} }
acb->ret = -EIO; if (!error) {
/* Assert that we have read all data */
assert(state->buf_off >= acb->end);
qemu_iovec_from_buf(acb->qiov, 0,
state->orig_buf + acb->start,
acb->end - acb->start);
if (acb->end - acb->start < acb->bytes) {
size_t offset = acb->end - acb->start;
qemu_iovec_memset(acb->qiov, offset, 0,
acb->bytes - offset);
}
}
acb->ret = error ? -EIO : 0;
state->acb[i] = NULL; state->acb[i] = NULL;
qemu_mutex_unlock(&s->mutex); qemu_mutex_unlock(&s->mutex);
aio_co_wake(acb->co); aio_co_wake(acb->co);
qemu_mutex_lock(&s->mutex); qemu_mutex_lock(&s->mutex);
} }
}
curl_clean_state(state); curl_clean_state(state);
break; break;
@ -390,42 +381,30 @@ static void curl_multi_check_completion(BDRVCURLState *s)
} }
/* Called with s->mutex held. */ /* Called with s->mutex held. */
static void curl_multi_do_locked(CURLState *s) static void curl_multi_do_locked(CURLSocket *socket)
{ {
CURLSocket *socket, *next_socket; BDRVCURLState *s = socket->state->s;
int running; int running;
int r; int r;
if (!s->s->multi) { if (!s->multi) {
return; return;
} }
/* Need to use _SAFE because curl_multi_socket_action() may trigger
* curl_sock_cb() which might modify this list */
QLIST_FOREACH_SAFE(socket, &s->sockets, next, next_socket) {
do { do {
r = curl_multi_socket_action(s->s->multi, socket->fd, 0, &running); r = curl_multi_socket_action(s->multi, socket->fd, 0, &running);
} while (r == CURLM_CALL_MULTI_PERFORM); } while (r == CURLM_CALL_MULTI_PERFORM);
}
} }
static void curl_multi_do(void *arg) static void curl_multi_do(void *arg)
{ {
CURLState *s = (CURLState *)arg; CURLSocket *socket = arg;
BDRVCURLState *s = socket->state->s;
qemu_mutex_lock(&s->s->mutex); qemu_mutex_lock(&s->mutex);
curl_multi_do_locked(s); curl_multi_do_locked(socket);
qemu_mutex_unlock(&s->s->mutex); curl_multi_check_completion(s);
} qemu_mutex_unlock(&s->mutex);
static void curl_multi_read(void *arg)
{
CURLState *s = (CURLState *)arg;
qemu_mutex_lock(&s->s->mutex);
curl_multi_do_locked(s);
curl_multi_check_completion(s->s);
qemu_mutex_unlock(&s->s->mutex);
} }
static void curl_multi_timeout_do(void *arg) static void curl_multi_timeout_do(void *arg)
@ -903,7 +882,13 @@ static void curl_setup_preadv(BlockDriverState *bs, CURLAIOCB *acb)
trace_curl_setup_preadv(acb->bytes, start, state->range); trace_curl_setup_preadv(acb->bytes, start, state->range);
curl_easy_setopt(state->curl, CURLOPT_RANGE, state->range); curl_easy_setopt(state->curl, CURLOPT_RANGE, state->range);
curl_multi_add_handle(s->multi, state->curl); if (curl_multi_add_handle(s->multi, state->curl) != CURLM_OK) {
state->acb[0] = NULL;
acb->ret = -EIO;
curl_clean_state(state);
goto out;
}
/* Tell curl it needs to kick things off */ /* Tell curl it needs to kick things off */
curl_multi_socket_action(s->multi, CURL_SOCKET_TIMEOUT, 0, &running); curl_multi_socket_action(s->multi, CURL_SOCKET_TIMEOUT, 0, &running);

View File

@ -697,8 +697,8 @@ dmg_co_preadv(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
int nb_sectors = bytes >> BDRV_SECTOR_BITS; int nb_sectors = bytes >> BDRV_SECTOR_BITS;
int ret, i; int ret, i;
assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0); assert(QEMU_IS_ALIGNED(offset, BDRV_SECTOR_SIZE));
assert((bytes & (BDRV_SECTOR_SIZE - 1)) == 0); assert(QEMU_IS_ALIGNED(bytes, BDRV_SECTOR_SIZE));
qemu_co_mutex_lock(&s->lock); qemu_co_mutex_lock(&s->lock);

View File

@ -1097,8 +1097,8 @@ static int coroutine_fn bdrv_driver_preadv(BlockDriverState *bs,
sector_num = offset >> BDRV_SECTOR_BITS; sector_num = offset >> BDRV_SECTOR_BITS;
nb_sectors = bytes >> BDRV_SECTOR_BITS; nb_sectors = bytes >> BDRV_SECTOR_BITS;
assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0); assert(QEMU_IS_ALIGNED(offset, BDRV_SECTOR_SIZE));
assert((bytes & (BDRV_SECTOR_SIZE - 1)) == 0); assert(QEMU_IS_ALIGNED(bytes, BDRV_SECTOR_SIZE));
assert(bytes <= BDRV_REQUEST_MAX_BYTES); assert(bytes <= BDRV_REQUEST_MAX_BYTES);
assert(drv->bdrv_co_readv); assert(drv->bdrv_co_readv);
@ -1171,8 +1171,8 @@ static int coroutine_fn bdrv_driver_pwritev(BlockDriverState *bs,
sector_num = offset >> BDRV_SECTOR_BITS; sector_num = offset >> BDRV_SECTOR_BITS;
nb_sectors = bytes >> BDRV_SECTOR_BITS; nb_sectors = bytes >> BDRV_SECTOR_BITS;
assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0); assert(QEMU_IS_ALIGNED(offset, BDRV_SECTOR_SIZE));
assert((bytes & (BDRV_SECTOR_SIZE - 1)) == 0); assert(QEMU_IS_ALIGNED(bytes, BDRV_SECTOR_SIZE));
assert(bytes <= BDRV_REQUEST_MAX_BYTES); assert(bytes <= BDRV_REQUEST_MAX_BYTES);
assert(drv->bdrv_co_writev); assert(drv->bdrv_co_writev);

View File

@ -462,27 +462,6 @@ static int coroutine_fn do_perform_cow_read(BlockDriverState *bs,
return 0; return 0;
} }
static bool coroutine_fn do_perform_cow_encrypt(BlockDriverState *bs,
uint64_t src_cluster_offset,
uint64_t cluster_offset,
unsigned offset_in_cluster,
uint8_t *buffer,
unsigned bytes)
{
if (bytes && bs->encrypted) {
BDRVQcow2State *s = bs->opaque;
assert((offset_in_cluster & ~BDRV_SECTOR_MASK) == 0);
assert((bytes & ~BDRV_SECTOR_MASK) == 0);
assert(s->crypto);
if (qcow2_co_encrypt(bs, cluster_offset,
src_cluster_offset + offset_in_cluster,
buffer, bytes) < 0) {
return false;
}
}
return true;
}
static int coroutine_fn do_perform_cow_write(BlockDriverState *bs, static int coroutine_fn do_perform_cow_write(BlockDriverState *bs,
uint64_t cluster_offset, uint64_t cluster_offset,
unsigned offset_in_cluster, unsigned offset_in_cluster,
@ -890,12 +869,19 @@ static int perform_cow(BlockDriverState *bs, QCowL2Meta *m)
/* Encrypt the data if necessary before writing it */ /* Encrypt the data if necessary before writing it */
if (bs->encrypted) { if (bs->encrypted) {
if (!do_perform_cow_encrypt(bs, m->offset, m->alloc_offset, ret = qcow2_co_encrypt(bs,
start->offset, start_buffer, m->alloc_offset + start->offset,
start->nb_bytes) || m->offset + start->offset,
!do_perform_cow_encrypt(bs, m->offset, m->alloc_offset, start_buffer, start->nb_bytes);
end->offset, end_buffer, end->nb_bytes)) { if (ret < 0) {
ret = -EIO; goto fail;
}
ret = qcow2_co_encrypt(bs,
m->alloc_offset + end->offset,
m->offset + end->offset,
end_buffer, end->nb_bytes);
if (ret < 0) {
goto fail; goto fail;
} }
} }

View File

@ -234,35 +234,70 @@ static int qcow2_encdec_pool_func(void *opaque)
} }
static int coroutine_fn static int coroutine_fn
qcow2_co_encdec(BlockDriverState *bs, uint64_t file_cluster_offset, qcow2_co_encdec(BlockDriverState *bs, uint64_t host_offset,
uint64_t offset, void *buf, size_t len, Qcow2EncDecFunc func) uint64_t guest_offset, void *buf, size_t len,
Qcow2EncDecFunc func)
{ {
BDRVQcow2State *s = bs->opaque; BDRVQcow2State *s = bs->opaque;
Qcow2EncDecData arg = { Qcow2EncDecData arg = {
.block = s->crypto, .block = s->crypto,
.offset = s->crypt_physical_offset ? .offset = s->crypt_physical_offset ? host_offset : guest_offset,
file_cluster_offset + offset_into_cluster(s, offset) :
offset,
.buf = buf, .buf = buf,
.len = len, .len = len,
.func = func, .func = func,
}; };
return qcow2_co_process(bs, qcow2_encdec_pool_func, &arg); assert(QEMU_IS_ALIGNED(guest_offset, BDRV_SECTOR_SIZE));
assert(QEMU_IS_ALIGNED(host_offset, BDRV_SECTOR_SIZE));
assert(QEMU_IS_ALIGNED(len, BDRV_SECTOR_SIZE));
assert(s->crypto);
return len == 0 ? 0 : qcow2_co_process(bs, qcow2_encdec_pool_func, &arg);
} }
/*
* qcow2_co_encrypt()
*
* Encrypts one or more contiguous aligned sectors
*
* @host_offset - underlying storage offset of the first sector of the
* data to be encrypted
*
* @guest_offset - guest (virtual) offset of the first sector of the
* data to be encrypted
*
* @buf - buffer with the data to encrypt, that after encryption
* will be written to the underlying storage device at
* @host_offset
*
* @len - length of the buffer (must be a BDRV_SECTOR_SIZE multiple)
*
* Depending on the encryption method, @host_offset and/or @guest_offset
* may be used for generating the initialization vector for
* encryption.
*
* Note that while the whole range must be aligned on sectors, it
* does not have to be aligned on clusters and can also cross cluster
* boundaries
*/
int coroutine_fn int coroutine_fn
qcow2_co_encrypt(BlockDriverState *bs, uint64_t file_cluster_offset, qcow2_co_encrypt(BlockDriverState *bs, uint64_t host_offset,
uint64_t offset, void *buf, size_t len) uint64_t guest_offset, void *buf, size_t len)
{ {
return qcow2_co_encdec(bs, file_cluster_offset, offset, buf, len, return qcow2_co_encdec(bs, host_offset, guest_offset, buf, len,
qcrypto_block_encrypt); qcrypto_block_encrypt);
} }
/*
* qcow2_co_decrypt()
*
* Decrypts one or more contiguous aligned sectors
* Similar to qcow2_co_encrypt
*/
int coroutine_fn int coroutine_fn
qcow2_co_decrypt(BlockDriverState *bs, uint64_t file_cluster_offset, qcow2_co_decrypt(BlockDriverState *bs, uint64_t host_offset,
uint64_t offset, void *buf, size_t len) uint64_t guest_offset, void *buf, size_t len)
{ {
return qcow2_co_encdec(bs, file_cluster_offset, offset, buf, len, return qcow2_co_encdec(bs, host_offset, guest_offset, buf, len,
qcrypto_block_decrypt); qcrypto_block_decrypt);
} }

View File

@ -2067,9 +2067,10 @@ static coroutine_fn int qcow2_co_preadv_part(BlockDriverState *bs,
goto fail; goto fail;
} }
assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0); assert(QEMU_IS_ALIGNED(offset, BDRV_SECTOR_SIZE));
assert((cur_bytes & (BDRV_SECTOR_SIZE - 1)) == 0); assert(QEMU_IS_ALIGNED(cur_bytes, BDRV_SECTOR_SIZE));
if (qcow2_co_decrypt(bs, cluster_offset, offset, if (qcow2_co_decrypt(bs, cluster_offset + offset_in_cluster,
offset,
cluster_data, cur_bytes) < 0) { cluster_data, cur_bytes) < 0) {
ret = -EIO; ret = -EIO;
goto fail; goto fail;
@ -2288,7 +2289,7 @@ static coroutine_fn int qcow2_co_pwritev_part(
qemu_iovec_to_buf(qiov, qiov_offset + bytes_done, qemu_iovec_to_buf(qiov, qiov_offset + bytes_done,
cluster_data, cur_bytes); cluster_data, cur_bytes);
if (qcow2_co_encrypt(bs, cluster_offset, offset, if (qcow2_co_encrypt(bs, cluster_offset + offset_in_cluster, offset,
cluster_data, cur_bytes) < 0) { cluster_data, cur_bytes) < 0) {
ret = -EIO; ret = -EIO;
goto out_unlocked; goto out_unlocked;

View File

@ -758,10 +758,10 @@ ssize_t coroutine_fn
qcow2_co_decompress(BlockDriverState *bs, void *dest, size_t dest_size, qcow2_co_decompress(BlockDriverState *bs, void *dest, size_t dest_size,
const void *src, size_t src_size); const void *src, size_t src_size);
int coroutine_fn int coroutine_fn
qcow2_co_encrypt(BlockDriverState *bs, uint64_t file_cluster_offset, qcow2_co_encrypt(BlockDriverState *bs, uint64_t host_offset,
uint64_t offset, void *buf, size_t len); uint64_t guest_offset, void *buf, size_t len);
int coroutine_fn int coroutine_fn
qcow2_co_decrypt(BlockDriverState *bs, uint64_t file_cluster_offset, qcow2_co_decrypt(BlockDriverState *bs, uint64_t host_offset,
uint64_t offset, void *buf, size_t len); uint64_t guest_offset, void *buf, size_t len);
#endif #endif

View File

@ -1547,8 +1547,8 @@ vvfat_co_preadv(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
int nb_sectors = bytes >> BDRV_SECTOR_BITS; int nb_sectors = bytes >> BDRV_SECTOR_BITS;
void *buf; void *buf;
assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0); assert(QEMU_IS_ALIGNED(offset, BDRV_SECTOR_SIZE));
assert((bytes & (BDRV_SECTOR_SIZE - 1)) == 0); assert(QEMU_IS_ALIGNED(bytes, BDRV_SECTOR_SIZE));
buf = g_try_malloc(bytes); buf = g_try_malloc(bytes);
if (bytes && buf == NULL) { if (bytes && buf == NULL) {
@ -3082,8 +3082,8 @@ vvfat_co_pwritev(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
int nb_sectors = bytes >> BDRV_SECTOR_BITS; int nb_sectors = bytes >> BDRV_SECTOR_BITS;
void *buf; void *buf;
assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0); assert(QEMU_IS_ALIGNED(offset, BDRV_SECTOR_SIZE));
assert((bytes & (BDRV_SECTOR_SIZE - 1)) == 0); assert(QEMU_IS_ALIGNED(bytes, BDRV_SECTOR_SIZE));
buf = g_try_malloc(bytes); buf = g_try_malloc(bytes);
if (bytes && buf == NULL) { if (bytes && buf == NULL) {

View File

@ -175,14 +175,23 @@ static const BdrvChildRole child_job = {
void block_job_remove_all_bdrv(BlockJob *job) void block_job_remove_all_bdrv(BlockJob *job)
{ {
GSList *l; /*
for (l = job->nodes; l; l = l->next) { * bdrv_root_unref_child() may reach child_job_[can_]set_aio_ctx(),
* which will also traverse job->nodes, so consume the list one by
* one to make sure that such a concurrent access does not attempt
* to process an already freed BdrvChild.
*/
while (job->nodes) {
GSList *l = job->nodes;
BdrvChild *c = l->data; BdrvChild *c = l->data;
job->nodes = l->next;
bdrv_op_unblock_all(c->bs, job->blocker); bdrv_op_unblock_all(c->bs, job->blocker);
bdrv_root_unref_child(c); bdrv_root_unref_child(c);
g_slist_free_1(l);
} }
g_slist_free(job->nodes);
job->nodes = NULL;
} }
bool block_job_has_bdrv(BlockJob *job, BlockDriverState *bs) bool block_job_has_bdrv(BlockJob *job, BlockDriverState *bs)

View File

@ -143,7 +143,6 @@ typedef struct HDGeometry {
#define BDRV_SECTOR_BITS 9 #define BDRV_SECTOR_BITS 9
#define BDRV_SECTOR_SIZE (1ULL << BDRV_SECTOR_BITS) #define BDRV_SECTOR_SIZE (1ULL << BDRV_SECTOR_BITS)
#define BDRV_SECTOR_MASK ~(BDRV_SECTOR_SIZE - 1)
#define BDRV_REQUEST_MAX_SECTORS MIN(SIZE_MAX >> BDRV_SECTOR_BITS, \ #define BDRV_REQUEST_MAX_SECTORS MIN(SIZE_MAX >> BDRV_SECTOR_BITS, \
INT_MAX >> BDRV_SECTOR_BITS) INT_MAX >> BDRV_SECTOR_BITS)
@ -195,7 +194,6 @@ typedef struct HDGeometry {
#define BDRV_BLOCK_ALLOCATED 0x10 #define BDRV_BLOCK_ALLOCATED 0x10
#define BDRV_BLOCK_EOF 0x20 #define BDRV_BLOCK_EOF 0x20
#define BDRV_BLOCK_RECURSE 0x40 #define BDRV_BLOCK_RECURSE 0x40
#define BDRV_BLOCK_OFFSET_MASK BDRV_SECTOR_MASK
typedef QSIMPLEQ_HEAD(BlockReopenQueue, BlockReopenQueueEntry) BlockReopenQueue; typedef QSIMPLEQ_HEAD(BlockReopenQueue, BlockReopenQueueEntry) BlockReopenQueue;

View File

@ -906,7 +906,7 @@ static int block_load(QEMUFile *f, void *opaque, int version_id)
do { do {
addr = qemu_get_be64(f); addr = qemu_get_be64(f);
flags = addr & ~BDRV_SECTOR_MASK; flags = addr & (BDRV_SECTOR_SIZE - 1);
addr >>= BDRV_SECTOR_BITS; addr >>= BDRV_SECTOR_BITS;
if (flags & BLK_MIG_FLAG_DEVICE_BLOCK) { if (flags & BLK_MIG_FLAG_DEVICE_BLOCK) {

View File

@ -2141,7 +2141,7 @@ static int img_convert(int argc, char **argv)
int64_t sval; int64_t sval;
sval = cvtnum(optarg); sval = cvtnum(optarg);
if (sval < 0 || sval & (BDRV_SECTOR_SIZE - 1) || if (sval < 0 || !QEMU_IS_ALIGNED(sval, BDRV_SECTOR_SIZE) ||
sval / BDRV_SECTOR_SIZE > MAX_BUF_SECTORS) { sval / BDRV_SECTOR_SIZE > MAX_BUF_SECTORS) {
error_report("Invalid buffer size for sparse output specified. " error_report("Invalid buffer size for sparse output specified. "
"Valid sizes are multiples of %llu up to %llu. Select " "Valid sizes are multiples of %llu up to %llu. Select "

View File

@ -1100,7 +1100,7 @@ QEMU_IOTESTS_HELPERS-$(call land,$(CONFIG_SOFTMMU),$(CONFIG_LINUX)) = tests/qemu
check-tests/check-block.sh: tests/check-block.sh qemu-img$(EXESUF) \ check-tests/check-block.sh: tests/check-block.sh qemu-img$(EXESUF) \
qemu-io$(EXESUF) qemu-nbd$(EXESUF) $(QEMU_IOTESTS_HELPERS-y) \ qemu-io$(EXESUF) qemu-nbd$(EXESUF) $(QEMU_IOTESTS_HELPERS-y) \
$(patsubst %,%/all,$(filter %-softmmu,$(TARGET_DIRS))) $(patsubst %,%/all,$(filter %-softmmu,$(TARGET_DIRS)))
$< @$<
.PHONY: $(patsubst %, check-%, $(check-qapi-schema-y)) .PHONY: $(patsubst %, check-%, $(check-qapi-schema-y))
$(patsubst %, check-%, $(check-qapi-schema-y)): check-%.json: $(SRC_PATH)/%.json $(patsubst %, check-%, $(check-qapi-schema-y)): check-%.json: $(SRC_PATH)/%.json

View File

@ -14,8 +14,8 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: l1_update; errno: 5; imm: off; once: off; write Event: l1_update; errno: 5; imm: off; once: off; write
Failed to flush the L2 table cache: Input/output error qemu-io: Failed to flush the L2 table cache: Input/output error
Failed to flush the refcount block cache: Input/output error qemu-io: Failed to flush the refcount block cache: Input/output error
write failed: Input/output error write failed: Input/output error
1 leaked clusters were found on the image. 1 leaked clusters were found on the image.
@ -23,8 +23,8 @@ This means waste of disk space, but no harm to data.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: l1_update; errno: 5; imm: off; once: off; write -b Event: l1_update; errno: 5; imm: off; once: off; write -b
Failed to flush the L2 table cache: Input/output error qemu-io: Failed to flush the L2 table cache: Input/output error
Failed to flush the refcount block cache: Input/output error qemu-io: Failed to flush the refcount block cache: Input/output error
write failed: Input/output error write failed: Input/output error
1 leaked clusters were found on the image. 1 leaked clusters were found on the image.
@ -42,8 +42,8 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: l1_update; errno: 28; imm: off; once: off; write Event: l1_update; errno: 28; imm: off; once: off; write
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
1 leaked clusters were found on the image. 1 leaked clusters were found on the image.
@ -51,8 +51,8 @@ This means waste of disk space, but no harm to data.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: l1_update; errno: 28; imm: off; once: off; write -b Event: l1_update; errno: 28; imm: off; once: off; write -b
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
1 leaked clusters were found on the image. 1 leaked clusters were found on the image.
@ -136,8 +136,8 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: l2_update; errno: 5; imm: off; once: off; write Event: l2_update; errno: 5; imm: off; once: off; write
Failed to flush the L2 table cache: Input/output error qemu-io: Failed to flush the L2 table cache: Input/output error
Failed to flush the refcount block cache: Input/output error qemu-io: Failed to flush the refcount block cache: Input/output error
wrote 131072/131072 bytes at offset 0 wrote 131072/131072 bytes at offset 0
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
@ -146,8 +146,8 @@ This means waste of disk space, but no harm to data.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: l2_update; errno: 5; imm: off; once: off; write -b Event: l2_update; errno: 5; imm: off; once: off; write -b
Failed to flush the L2 table cache: Input/output error qemu-io: Failed to flush the L2 table cache: Input/output error
Failed to flush the refcount block cache: Input/output error qemu-io: Failed to flush the refcount block cache: Input/output error
wrote 131072/131072 bytes at offset 0 wrote 131072/131072 bytes at offset 0
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
@ -168,8 +168,8 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: l2_update; errno: 28; imm: off; once: off; write Event: l2_update; errno: 28; imm: off; once: off; write
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
wrote 131072/131072 bytes at offset 0 wrote 131072/131072 bytes at offset 0
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
@ -178,8 +178,8 @@ This means waste of disk space, but no harm to data.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: l2_update; errno: 28; imm: off; once: off; write -b Event: l2_update; errno: 28; imm: off; once: off; write -b
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
wrote 131072/131072 bytes at offset 0 wrote 131072/131072 bytes at offset 0
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
@ -198,15 +198,15 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: l2_alloc_write; errno: 5; imm: off; once: off; write Event: l2_alloc_write; errno: 5; imm: off; once: off; write
Failed to flush the L2 table cache: Input/output error qemu-io: Failed to flush the L2 table cache: Input/output error
Failed to flush the refcount block cache: Input/output error qemu-io: Failed to flush the refcount block cache: Input/output error
write failed: Input/output error write failed: Input/output error
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: l2_alloc_write; errno: 5; imm: off; once: off; write -b Event: l2_alloc_write; errno: 5; imm: off; once: off; write -b
Failed to flush the L2 table cache: Input/output error qemu-io: Failed to flush the L2 table cache: Input/output error
Failed to flush the refcount block cache: Input/output error qemu-io: Failed to flush the refcount block cache: Input/output error
write failed: Input/output error write failed: Input/output error
1 leaked clusters were found on the image. 1 leaked clusters were found on the image.
@ -224,15 +224,15 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: l2_alloc_write; errno: 28; imm: off; once: off; write Event: l2_alloc_write; errno: 28; imm: off; once: off; write
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: l2_alloc_write; errno: 28; imm: off; once: off; write -b Event: l2_alloc_write; errno: 28; imm: off; once: off; write -b
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
1 leaked clusters were found on the image. 1 leaked clusters were found on the image.
@ -250,15 +250,15 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: write_aio; errno: 5; imm: off; once: off; write Event: write_aio; errno: 5; imm: off; once: off; write
Failed to flush the L2 table cache: Input/output error qemu-io: Failed to flush the L2 table cache: Input/output error
Failed to flush the refcount block cache: Input/output error qemu-io: Failed to flush the refcount block cache: Input/output error
write failed: Input/output error write failed: Input/output error
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: write_aio; errno: 5; imm: off; once: off; write -b Event: write_aio; errno: 5; imm: off; once: off; write -b
Failed to flush the L2 table cache: Input/output error qemu-io: Failed to flush the L2 table cache: Input/output error
Failed to flush the refcount block cache: Input/output error qemu-io: Failed to flush the refcount block cache: Input/output error
write failed: Input/output error write failed: Input/output error
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
@ -274,15 +274,15 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: write_aio; errno: 28; imm: off; once: off; write Event: write_aio; errno: 28; imm: off; once: off; write
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: write_aio; errno: 28; imm: off; once: off; write -b Event: write_aio; errno: 28; imm: off; once: off; write -b
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
@ -298,15 +298,15 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_load; errno: 5; imm: off; once: off; write Event: refblock_load; errno: 5; imm: off; once: off; write
Failed to flush the L2 table cache: Input/output error qemu-io: Failed to flush the L2 table cache: Input/output error
Failed to flush the refcount block cache: Input/output error qemu-io: Failed to flush the refcount block cache: Input/output error
write failed: Input/output error write failed: Input/output error
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_load; errno: 5; imm: off; once: off; write -b Event: refblock_load; errno: 5; imm: off; once: off; write -b
Failed to flush the L2 table cache: Input/output error qemu-io: Failed to flush the L2 table cache: Input/output error
Failed to flush the refcount block cache: Input/output error qemu-io: Failed to flush the refcount block cache: Input/output error
write failed: Input/output error write failed: Input/output error
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
@ -322,15 +322,15 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_load; errno: 28; imm: off; once: off; write Event: refblock_load; errno: 28; imm: off; once: off; write
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_load; errno: 28; imm: off; once: off; write -b Event: refblock_load; errno: 28; imm: off; once: off; write -b
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
@ -346,15 +346,15 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_update_part; errno: 5; imm: off; once: off; write Event: refblock_update_part; errno: 5; imm: off; once: off; write
Failed to flush the L2 table cache: Input/output error qemu-io: Failed to flush the L2 table cache: Input/output error
Failed to flush the refcount block cache: Input/output error qemu-io: Failed to flush the refcount block cache: Input/output error
write failed: Input/output error write failed: Input/output error
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_update_part; errno: 5; imm: off; once: off; write -b Event: refblock_update_part; errno: 5; imm: off; once: off; write -b
Failed to flush the L2 table cache: Input/output error qemu-io: Failed to flush the L2 table cache: Input/output error
Failed to flush the refcount block cache: Input/output error qemu-io: Failed to flush the refcount block cache: Input/output error
write failed: Input/output error write failed: Input/output error
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
@ -370,15 +370,15 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_update_part; errno: 28; imm: off; once: off; write Event: refblock_update_part; errno: 28; imm: off; once: off; write
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_update_part; errno: 28; imm: off; once: off; write -b Event: refblock_update_part; errno: 28; imm: off; once: off; write -b
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
@ -394,15 +394,15 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_alloc; errno: 5; imm: off; once: off; write Event: refblock_alloc; errno: 5; imm: off; once: off; write
Failed to flush the L2 table cache: Input/output error qemu-io: Failed to flush the L2 table cache: Input/output error
Failed to flush the refcount block cache: Input/output error qemu-io: Failed to flush the refcount block cache: Input/output error
write failed: Input/output error write failed: Input/output error
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_alloc; errno: 5; imm: off; once: off; write -b Event: refblock_alloc; errno: 5; imm: off; once: off; write -b
Failed to flush the L2 table cache: Input/output error qemu-io: Failed to flush the L2 table cache: Input/output error
Failed to flush the refcount block cache: Input/output error qemu-io: Failed to flush the refcount block cache: Input/output error
write failed: Input/output error write failed: Input/output error
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
@ -418,15 +418,15 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_alloc; errno: 28; imm: off; once: off; write Event: refblock_alloc; errno: 28; imm: off; once: off; write
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_alloc; errno: 28; imm: off; once: off; write -b Event: refblock_alloc; errno: 28; imm: off; once: off; write -b
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
@ -485,8 +485,8 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_alloc_hookup; errno: 28; imm: off; once: off; write Event: refblock_alloc_hookup; errno: 28; imm: off; once: off; write
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
55 leaked clusters were found on the image. 55 leaked clusters were found on the image.
@ -494,8 +494,8 @@ This means waste of disk space, but no harm to data.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_alloc_hookup; errno: 28; imm: off; once: off; write -b Event: refblock_alloc_hookup; errno: 28; imm: off; once: off; write -b
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
251 leaked clusters were found on the image. 251 leaked clusters were found on the image.
@ -513,15 +513,15 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_alloc_write; errno: 28; imm: off; once: off; write Event: refblock_alloc_write; errno: 28; imm: off; once: off; write
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_alloc_write; errno: 28; imm: off; once: off; write -b Event: refblock_alloc_write; errno: 28; imm: off; once: off; write -b
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
@ -537,8 +537,8 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_alloc_write_blocks; errno: 28; imm: off; once: off; write Event: refblock_alloc_write_blocks; errno: 28; imm: off; once: off; write
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
10 leaked clusters were found on the image. 10 leaked clusters were found on the image.
@ -546,8 +546,8 @@ This means waste of disk space, but no harm to data.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_alloc_write_blocks; errno: 28; imm: off; once: off; write -b Event: refblock_alloc_write_blocks; errno: 28; imm: off; once: off; write -b
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
23 leaked clusters were found on the image. 23 leaked clusters were found on the image.
@ -565,8 +565,8 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_alloc_write_table; errno: 28; imm: off; once: off; write Event: refblock_alloc_write_table; errno: 28; imm: off; once: off; write
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
10 leaked clusters were found on the image. 10 leaked clusters were found on the image.
@ -574,8 +574,8 @@ This means waste of disk space, but no harm to data.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_alloc_write_table; errno: 28; imm: off; once: off; write -b Event: refblock_alloc_write_table; errno: 28; imm: off; once: off; write -b
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
23 leaked clusters were found on the image. 23 leaked clusters were found on the image.
@ -593,8 +593,8 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_alloc_switch_table; errno: 28; imm: off; once: off; write Event: refblock_alloc_switch_table; errno: 28; imm: off; once: off; write
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
10 leaked clusters were found on the image. 10 leaked clusters were found on the image.
@ -602,8 +602,8 @@ This means waste of disk space, but no harm to data.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: refblock_alloc_switch_table; errno: 28; imm: off; once: off; write -b Event: refblock_alloc_switch_table; errno: 28; imm: off; once: off; write -b
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
23 leaked clusters were found on the image. 23 leaked clusters were found on the image.
@ -639,8 +639,8 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: l1_grow_write_table; errno: 5; imm: off; once: off Event: l1_grow_write_table; errno: 5; imm: off; once: off
Failed to flush the L2 table cache: Input/output error qemu-io: Failed to flush the L2 table cache: Input/output error
Failed to flush the refcount block cache: Input/output error qemu-io: Failed to flush the refcount block cache: Input/output error
write failed: Input/output error write failed: Input/output error
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
@ -651,8 +651,8 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: l1_grow_write_table; errno: 28; imm: off; once: off Event: l1_grow_write_table; errno: 28; imm: off; once: off
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
No errors were found on the image. No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
@ -663,8 +663,8 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: l1_grow_activate_table; errno: 5; imm: off; once: off Event: l1_grow_activate_table; errno: 5; imm: off; once: off
Failed to flush the L2 table cache: Input/output error qemu-io: Failed to flush the L2 table cache: Input/output error
Failed to flush the refcount block cache: Input/output error qemu-io: Failed to flush the refcount block cache: Input/output error
write failed: Input/output error write failed: Input/output error
96 leaked clusters were found on the image. 96 leaked clusters were found on the image.
@ -677,8 +677,8 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
Event: l1_grow_activate_table; errno: 28; imm: off; once: off Event: l1_grow_activate_table; errno: 28; imm: off; once: off
Failed to flush the L2 table cache: No space left on device qemu-io: Failed to flush the L2 table cache: No space left on device
Failed to flush the refcount block cache: No space left on device qemu-io: Failed to flush the refcount block cache: No space left on device
write failed: No space left on device write failed: No space left on device
96 leaked clusters were found on the image. 96 leaked clusters were found on the image.

91
tests/qemu-iotests/263 Executable file
View File

@ -0,0 +1,91 @@
#!/usr/bin/env bash
#
# Test encrypted write that crosses cluster boundary of two unallocated clusters
# Based on 188
#
# Copyright (C) 2019 Red Hat, 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, see <http://www.gnu.org/licenses/>.
#
# creator
owner=mlevitsk@redhat.com
seq=`basename $0`
echo "QA output created by $seq"
status=1 # failure is the default!
_cleanup()
{
_cleanup_test_img
}
trap "_cleanup; exit \$status" 0 1 2 3 15
# get standard environment, filters and checks
. ./common.rc
. ./common.filter
_supported_fmt qcow2
_supported_proto generic
_supported_os Linux
size=1M
SECRET="secret,id=sec0,data=astrochicken"
QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT
_run_test()
{
echo "== reading the whole image =="
$QEMU_IO --object $SECRET -c "read -P 0 0 $size" --image-opts "$1" | _filter_qemu_io | _filter_testdir
echo
echo "== write two 512 byte sectors on a cluster boundary =="
$QEMU_IO --object $SECRET -c "write -P 0xAA 0xFE00 0x400" --image-opts "$1" | _filter_qemu_io | _filter_testdir
echo
echo "== verify that the rest of the image is not changed =="
$QEMU_IO --object $SECRET -c "read -P 0x00 0x00000 0xFE00" --image-opts "$1" | _filter_qemu_io | _filter_testdir
$QEMU_IO --object $SECRET -c "read -P 0xAA 0x0FE00 0x400" --image-opts "$1" | _filter_qemu_io | _filter_testdir
$QEMU_IO --object $SECRET -c "read -P 0x00 0x10200 0xEFE00" --image-opts "$1" | _filter_qemu_io | _filter_testdir
}
echo
echo "testing LUKS qcow2 encryption"
echo
_make_test_img --object $SECRET -o "encrypt.format=luks,encrypt.key-secret=sec0,encrypt.iter-time=10,cluster_size=64K" $size
_run_test "driver=$IMGFMT,encrypt.key-secret=sec0,file.filename=$TEST_IMG"
_cleanup_test_img
echo
echo "testing legacy AES qcow2 encryption"
echo
_make_test_img --object $SECRET -o "encrypt.format=aes,encrypt.key-secret=sec0,cluster_size=64K" $size
_run_test "driver=$IMGFMT,encrypt.key-secret=sec0,file.filename=$TEST_IMG"
_cleanup_test_img
# success, all done
echo "*** done"
rm -f $seq.full
status=0

View File

@ -0,0 +1,40 @@
QA output created by 263
testing LUKS qcow2 encryption
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 encrypt.format=luks encrypt.key-secret=sec0 encrypt.iter-time=10
== reading the whole image ==
read 1048576/1048576 bytes at offset 0
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== write two 512 byte sectors on a cluster boundary ==
wrote 1024/1024 bytes at offset 65024
1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== verify that the rest of the image is not changed ==
read 65024/65024 bytes at offset 0
63.500 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read 1024/1024 bytes at offset 65024
1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read 982528/982528 bytes at offset 66048
959.500 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
testing legacy AES qcow2 encryption
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 encrypt.format=aes encrypt.key-secret=sec0
== reading the whole image ==
read 1048576/1048576 bytes at offset 0
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== write two 512 byte sectors on a cluster boundary ==
wrote 1024/1024 bytes at offset 65024
1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== verify that the rest of the image is not changed ==
read 65024/65024 bytes at offset 0
63.500 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read 1024/1024 bytes at offset 65024
1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read 982528/982528 bytes at offset 66048
959.500 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
*** done

View File

@ -694,12 +694,12 @@ END { if (NR > 0) {
if [ ! -z "$n_bad" -a $n_bad != 0 ] if [ ! -z "$n_bad" -a $n_bad != 0 ]
then then
echo "Failures:$bad" echo "Failures:$bad"
echo "Failed $n_bad of $try tests" echo "Failed $n_bad of $try iotests"
echo "Failures:$bad" | fmt >>check.log echo "Failures:$bad" | fmt >>check.log
echo "Failed $n_bad of $try tests" >>check.log echo "Failed $n_bad of $try iotests" >>check.log
else else
echo "Passed all $try tests" echo "Passed all $try iotests"
echo "Passed all $try tests" >>check.log echo "Passed all $try iotests" >>check.log
fi fi
needwrap=false needwrap=false
fi fi

View File

@ -274,5 +274,6 @@
257 rw 257 rw
258 rw quick 258 rw quick
262 rw quick migration 262 rw quick migration
263 rw quick
265 rw auto quick 265 rw auto quick
266 rw quick 266 rw quick