qcow2-threads.c (14866B)
1/* 2 * Threaded data processing for Qcow2: compression, encryption 3 * 4 * Copyright (c) 2004-2006 Fabrice Bellard 5 * Copyright (c) 2018 Virtuozzo International GmbH. All rights reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a copy 8 * of this software and associated documentation files (the "Software"), to deal 9 * in the Software without restriction, including without limitation the rights 10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 * copies of the Software, and to permit persons to whom the Software is 12 * furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included in 15 * all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 * THE SOFTWARE. 24 */ 25 26#include "qemu/osdep.h" 27 28#define ZLIB_CONST 29#include <zlib.h> 30 31#ifdef CONFIG_ZSTD 32#include <zstd.h> 33#include <zstd_errors.h> 34#endif 35 36#include "qcow2.h" 37#include "block/thread-pool.h" 38#include "crypto.h" 39 40static int coroutine_fn 41qcow2_co_process(BlockDriverState *bs, ThreadPoolFunc *func, void *arg) 42{ 43 int ret; 44 BDRVQcow2State *s = bs->opaque; 45 ThreadPool *pool = aio_get_thread_pool(bdrv_get_aio_context(bs)); 46 47 qemu_co_mutex_lock(&s->lock); 48 while (s->nb_threads >= QCOW2_MAX_THREADS) { 49 qemu_co_queue_wait(&s->thread_task_queue, &s->lock); 50 } 51 s->nb_threads++; 52 qemu_co_mutex_unlock(&s->lock); 53 54 ret = thread_pool_submit_co(pool, func, arg); 55 56 qemu_co_mutex_lock(&s->lock); 57 s->nb_threads--; 58 qemu_co_queue_next(&s->thread_task_queue); 59 qemu_co_mutex_unlock(&s->lock); 60 61 return ret; 62} 63 64 65/* 66 * Compression 67 */ 68 69typedef ssize_t (*Qcow2CompressFunc)(void *dest, size_t dest_size, 70 const void *src, size_t src_size); 71typedef struct Qcow2CompressData { 72 void *dest; 73 size_t dest_size; 74 const void *src; 75 size_t src_size; 76 ssize_t ret; 77 78 Qcow2CompressFunc func; 79} Qcow2CompressData; 80 81/* 82 * qcow2_zlib_compress() 83 * 84 * Compress @src_size bytes of data using zlib compression method 85 * 86 * @dest - destination buffer, @dest_size bytes 87 * @src - source buffer, @src_size bytes 88 * 89 * Returns: compressed size on success 90 * -ENOMEM destination buffer is not enough to store compressed data 91 * -EIO on any other error 92 */ 93static ssize_t qcow2_zlib_compress(void *dest, size_t dest_size, 94 const void *src, size_t src_size) 95{ 96 ssize_t ret; 97 z_stream strm; 98 99 /* best compression, small window, no zlib header */ 100 memset(&strm, 0, sizeof(strm)); 101 ret = deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 102 -12, 9, Z_DEFAULT_STRATEGY); 103 if (ret != Z_OK) { 104 return -EIO; 105 } 106 107 /* 108 * strm.next_in is not const in old zlib versions, such as those used on 109 * OpenBSD/NetBSD, so cast the const away 110 */ 111 strm.avail_in = src_size; 112 strm.next_in = (void *) src; 113 strm.avail_out = dest_size; 114 strm.next_out = dest; 115 116 ret = deflate(&strm, Z_FINISH); 117 if (ret == Z_STREAM_END) { 118 ret = dest_size - strm.avail_out; 119 } else { 120 ret = (ret == Z_OK ? -ENOMEM : -EIO); 121 } 122 123 deflateEnd(&strm); 124 125 return ret; 126} 127 128/* 129 * qcow2_zlib_decompress() 130 * 131 * Decompress some data (not more than @src_size bytes) to produce exactly 132 * @dest_size bytes using zlib compression method 133 * 134 * @dest - destination buffer, @dest_size bytes 135 * @src - source buffer, @src_size bytes 136 * 137 * Returns: 0 on success 138 * -EIO on fail 139 */ 140static ssize_t qcow2_zlib_decompress(void *dest, size_t dest_size, 141 const void *src, size_t src_size) 142{ 143 int ret; 144 z_stream strm; 145 146 memset(&strm, 0, sizeof(strm)); 147 strm.avail_in = src_size; 148 strm.next_in = (void *) src; 149 strm.avail_out = dest_size; 150 strm.next_out = dest; 151 152 ret = inflateInit2(&strm, -12); 153 if (ret != Z_OK) { 154 return -EIO; 155 } 156 157 ret = inflate(&strm, Z_FINISH); 158 if ((ret == Z_STREAM_END || ret == Z_BUF_ERROR) && strm.avail_out == 0) { 159 /* 160 * We approve Z_BUF_ERROR because we need @dest buffer to be filled, but 161 * @src buffer may be processed partly (because in qcow2 we know size of 162 * compressed data with precision of one sector) 163 */ 164 ret = 0; 165 } else { 166 ret = -EIO; 167 } 168 169 inflateEnd(&strm); 170 171 return ret; 172} 173 174#ifdef CONFIG_ZSTD 175 176/* 177 * qcow2_zstd_compress() 178 * 179 * Compress @src_size bytes of data using zstd compression method 180 * 181 * @dest - destination buffer, @dest_size bytes 182 * @src - source buffer, @src_size bytes 183 * 184 * Returns: compressed size on success 185 * -ENOMEM destination buffer is not enough to store compressed data 186 * -EIO on any other error 187 */ 188static ssize_t qcow2_zstd_compress(void *dest, size_t dest_size, 189 const void *src, size_t src_size) 190{ 191 ssize_t ret; 192 size_t zstd_ret; 193 ZSTD_outBuffer output = { 194 .dst = dest, 195 .size = dest_size, 196 .pos = 0 197 }; 198 ZSTD_inBuffer input = { 199 .src = src, 200 .size = src_size, 201 .pos = 0 202 }; 203 ZSTD_CCtx *cctx = ZSTD_createCCtx(); 204 205 if (!cctx) { 206 return -EIO; 207 } 208 /* 209 * Use the zstd streamed interface for symmetry with decompression, 210 * where streaming is essential since we don't record the exact 211 * compressed size. 212 * 213 * ZSTD_compressStream2() tries to compress everything it could 214 * with a single call. Although, ZSTD docs says that: 215 * "You must continue calling ZSTD_compressStream2() with ZSTD_e_end 216 * until it returns 0, at which point you are free to start a new frame", 217 * in out tests we saw the only case when it returned with >0 - 218 * when the output buffer was too small. In that case, 219 * ZSTD_compressStream2() expects a bigger buffer on the next call. 220 * We can't provide a bigger buffer because we are limited with dest_size 221 * which we pass to the ZSTD_compressStream2() at once. 222 * So, we don't need any loops and just abort the compression when we 223 * don't get 0 result on the first call. 224 */ 225 zstd_ret = ZSTD_compressStream2(cctx, &output, &input, ZSTD_e_end); 226 227 if (zstd_ret) { 228 if (zstd_ret > output.size - output.pos) { 229 ret = -ENOMEM; 230 } else { 231 ret = -EIO; 232 } 233 goto out; 234 } 235 236 /* make sure that zstd didn't overflow the dest buffer */ 237 assert(output.pos <= dest_size); 238 ret = output.pos; 239out: 240 ZSTD_freeCCtx(cctx); 241 return ret; 242} 243 244/* 245 * qcow2_zstd_decompress() 246 * 247 * Decompress some data (not more than @src_size bytes) to produce exactly 248 * @dest_size bytes using zstd compression method 249 * 250 * @dest - destination buffer, @dest_size bytes 251 * @src - source buffer, @src_size bytes 252 * 253 * Returns: 0 on success 254 * -EIO on any error 255 */ 256static ssize_t qcow2_zstd_decompress(void *dest, size_t dest_size, 257 const void *src, size_t src_size) 258{ 259 size_t zstd_ret = 0; 260 ssize_t ret = 0; 261 ZSTD_outBuffer output = { 262 .dst = dest, 263 .size = dest_size, 264 .pos = 0 265 }; 266 ZSTD_inBuffer input = { 267 .src = src, 268 .size = src_size, 269 .pos = 0 270 }; 271 ZSTD_DCtx *dctx = ZSTD_createDCtx(); 272 273 if (!dctx) { 274 return -EIO; 275 } 276 277 /* 278 * The compressed stream from the input buffer may consist of more 279 * than one zstd frame. So we iterate until we get a fully 280 * uncompressed cluster. 281 * From zstd docs related to ZSTD_decompressStream: 282 * "return : 0 when a frame is completely decoded and fully flushed" 283 * We suppose that this means: each time ZSTD_decompressStream reads 284 * only ONE full frame and returns 0 if and only if that frame 285 * is completely decoded and flushed. Only after returning 0, 286 * ZSTD_decompressStream reads another ONE full frame. 287 */ 288 while (output.pos < output.size) { 289 size_t last_in_pos = input.pos; 290 size_t last_out_pos = output.pos; 291 zstd_ret = ZSTD_decompressStream(dctx, &output, &input); 292 293 if (ZSTD_isError(zstd_ret)) { 294 ret = -EIO; 295 break; 296 } 297 298 /* 299 * The ZSTD manual is vague about what to do if it reads 300 * the buffer partially, and we don't want to get stuck 301 * in an infinite loop where ZSTD_decompressStream 302 * returns > 0 waiting for another input chunk. So, we add 303 * a check which ensures that the loop makes some progress 304 * on each step. 305 */ 306 if (last_in_pos >= input.pos && 307 last_out_pos >= output.pos) { 308 ret = -EIO; 309 break; 310 } 311 } 312 /* 313 * Make sure that we have the frame fully flushed here 314 * if not, we somehow managed to get uncompressed cluster 315 * greater then the cluster size, possibly because of its 316 * damage. 317 */ 318 if (zstd_ret > 0) { 319 ret = -EIO; 320 } 321 322 ZSTD_freeDCtx(dctx); 323 assert(ret == 0 || ret == -EIO); 324 return ret; 325} 326#endif 327 328static int qcow2_compress_pool_func(void *opaque) 329{ 330 Qcow2CompressData *data = opaque; 331 332 data->ret = data->func(data->dest, data->dest_size, 333 data->src, data->src_size); 334 335 return 0; 336} 337 338static ssize_t coroutine_fn 339qcow2_co_do_compress(BlockDriverState *bs, void *dest, size_t dest_size, 340 const void *src, size_t src_size, Qcow2CompressFunc func) 341{ 342 Qcow2CompressData arg = { 343 .dest = dest, 344 .dest_size = dest_size, 345 .src = src, 346 .src_size = src_size, 347 .func = func, 348 }; 349 350 qcow2_co_process(bs, qcow2_compress_pool_func, &arg); 351 352 return arg.ret; 353} 354 355/* 356 * qcow2_co_compress() 357 * 358 * Compress @src_size bytes of data using the compression 359 * method defined by the image compression type 360 * 361 * @dest - destination buffer, @dest_size bytes 362 * @src - source buffer, @src_size bytes 363 * 364 * Returns: compressed size on success 365 * a negative error code on failure 366 */ 367ssize_t coroutine_fn 368qcow2_co_compress(BlockDriverState *bs, void *dest, size_t dest_size, 369 const void *src, size_t src_size) 370{ 371 BDRVQcow2State *s = bs->opaque; 372 Qcow2CompressFunc fn; 373 374 switch (s->compression_type) { 375 case QCOW2_COMPRESSION_TYPE_ZLIB: 376 fn = qcow2_zlib_compress; 377 break; 378 379#ifdef CONFIG_ZSTD 380 case QCOW2_COMPRESSION_TYPE_ZSTD: 381 fn = qcow2_zstd_compress; 382 break; 383#endif 384 default: 385 abort(); 386 } 387 388 return qcow2_co_do_compress(bs, dest, dest_size, src, src_size, fn); 389} 390 391/* 392 * qcow2_co_decompress() 393 * 394 * Decompress some data (not more than @src_size bytes) to produce exactly 395 * @dest_size bytes using the compression method defined by the image 396 * compression type 397 * 398 * @dest - destination buffer, @dest_size bytes 399 * @src - source buffer, @src_size bytes 400 * 401 * Returns: 0 on success 402 * a negative error code on failure 403 */ 404ssize_t coroutine_fn 405qcow2_co_decompress(BlockDriverState *bs, void *dest, size_t dest_size, 406 const void *src, size_t src_size) 407{ 408 BDRVQcow2State *s = bs->opaque; 409 Qcow2CompressFunc fn; 410 411 switch (s->compression_type) { 412 case QCOW2_COMPRESSION_TYPE_ZLIB: 413 fn = qcow2_zlib_decompress; 414 break; 415 416#ifdef CONFIG_ZSTD 417 case QCOW2_COMPRESSION_TYPE_ZSTD: 418 fn = qcow2_zstd_decompress; 419 break; 420#endif 421 default: 422 abort(); 423 } 424 425 return qcow2_co_do_compress(bs, dest, dest_size, src, src_size, fn); 426} 427 428 429/* 430 * Cryptography 431 */ 432 433/* 434 * Qcow2EncDecFunc: common prototype of qcrypto_block_encrypt() and 435 * qcrypto_block_decrypt() functions. 436 */ 437typedef int (*Qcow2EncDecFunc)(QCryptoBlock *block, uint64_t offset, 438 uint8_t *buf, size_t len, Error **errp); 439 440typedef struct Qcow2EncDecData { 441 QCryptoBlock *block; 442 uint64_t offset; 443 uint8_t *buf; 444 size_t len; 445 446 Qcow2EncDecFunc func; 447} Qcow2EncDecData; 448 449static int qcow2_encdec_pool_func(void *opaque) 450{ 451 Qcow2EncDecData *data = opaque; 452 453 return data->func(data->block, data->offset, data->buf, data->len, NULL); 454} 455 456static int coroutine_fn 457qcow2_co_encdec(BlockDriverState *bs, uint64_t host_offset, 458 uint64_t guest_offset, void *buf, size_t len, 459 Qcow2EncDecFunc func) 460{ 461 BDRVQcow2State *s = bs->opaque; 462 Qcow2EncDecData arg = { 463 .block = s->crypto, 464 .offset = s->crypt_physical_offset ? host_offset : guest_offset, 465 .buf = buf, 466 .len = len, 467 .func = func, 468 }; 469 uint64_t sector_size; 470 471 assert(s->crypto); 472 473 sector_size = qcrypto_block_get_sector_size(s->crypto); 474 assert(QEMU_IS_ALIGNED(guest_offset, sector_size)); 475 assert(QEMU_IS_ALIGNED(host_offset, sector_size)); 476 assert(QEMU_IS_ALIGNED(len, sector_size)); 477 478 return len == 0 ? 0 : qcow2_co_process(bs, qcow2_encdec_pool_func, &arg); 479} 480 481/* 482 * qcow2_co_encrypt() 483 * 484 * Encrypts one or more contiguous aligned sectors 485 * 486 * @host_offset - underlying storage offset of the first sector of the 487 * data to be encrypted 488 * 489 * @guest_offset - guest (virtual) offset of the first sector of the 490 * data to be encrypted 491 * 492 * @buf - buffer with the data to encrypt, that after encryption 493 * will be written to the underlying storage device at 494 * @host_offset 495 * 496 * @len - length of the buffer (must be a multiple of the encryption 497 * sector size) 498 * 499 * Depending on the encryption method, @host_offset and/or @guest_offset 500 * may be used for generating the initialization vector for 501 * encryption. 502 * 503 * Note that while the whole range must be aligned on sectors, it 504 * does not have to be aligned on clusters and can also cross cluster 505 * boundaries 506 */ 507int coroutine_fn 508qcow2_co_encrypt(BlockDriverState *bs, uint64_t host_offset, 509 uint64_t guest_offset, void *buf, size_t len) 510{ 511 return qcow2_co_encdec(bs, host_offset, guest_offset, buf, len, 512 qcrypto_block_encrypt); 513} 514 515/* 516 * qcow2_co_decrypt() 517 * 518 * Decrypts one or more contiguous aligned sectors 519 * Similar to qcow2_co_encrypt 520 */ 521int coroutine_fn 522qcow2_co_decrypt(BlockDriverState *bs, uint64_t host_offset, 523 uint64_t guest_offset, void *buf, size_t len) 524{ 525 return qcow2_co_encdec(bs, host_offset, guest_offset, buf, len, 526 qcrypto_block_decrypt); 527}