Lines Matching +full:- +full:- +full:disable +full:- +full:live +full:- +full:block +full:- +full:migration

2  * Block driver for the QCOW format
4 * Copyright (c) 2004-2006 Fabrice Bellard
27 #include "qemu/error-report.h"
28 #include "block/block_int.h"
29 #include "block/qdict.h"
30 #include "system/block-backend.h"
39 #include "qapi/qobject-input-visitor.h"
40 #include "qapi/qapi-visit-block-core.h"
41 #include "crypto/block.h"
42 #include "migration/blocker.h"
46 /* QEMU COW block driver with compression and encryption support */
103 be32_to_cpu(cow_header->magic) == QCOW_MAGIC && in qcow_probe()
104 be32_to_cpu(cow_header->version) == QCOW_VERSION) in qcow_probe()
113 BDRVQcowState *s = bs->opaque; in qcow_open()
132 ret = bdrv_pread(bs->file, 0, sizeof(header), &header, 0); in qcow_open()
147 ret = -EINVAL; in qcow_open()
157 ret = -ENOTSUP; in qcow_open()
163 ret = -EINVAL; in qcow_open()
168 ret = -EINVAL; in qcow_open()
174 if (header.l2_bits < 9 - 3 || header.l2_bits > 16 - 3) { in qcow_open()
176 ret = -EINVAL; in qcow_open()
180 s->crypt_method_header = header.crypt_method; in qcow_open()
181 if (s->crypt_method_header) { in qcow_open()
183 s->crypt_method_header == QCOW_CRYPT_AES) { in qcow_open()
185 "Use of AES-CBC encrypted qcow images is no longer " in qcow_open()
188 "You can use 'qemu-img convert' to convert your " in qcow_open()
192 ret = -ENOSYS; in qcow_open()
195 if (s->crypt_method_header == QCOW_CRYPT_AES) { in qcow_open()
200 ret = -EINVAL; in qcow_open()
206 ret = -EINVAL; in qcow_open()
213 s->crypto = qcrypto_block_open(crypto_opts, "encrypt.", in qcow_open()
215 if (!s->crypto) { in qcow_open()
216 ret = -EINVAL; in qcow_open()
221 ret = -EINVAL; in qcow_open()
224 bs->encrypted = true; in qcow_open()
229 ret = -EINVAL; in qcow_open()
233 s->cluster_bits = header.cluster_bits; in qcow_open()
234 s->cluster_size = 1 << s->cluster_bits; in qcow_open()
235 s->l2_bits = header.l2_bits; in qcow_open()
236 s->l2_size = 1 << s->l2_bits; in qcow_open()
237 bs->total_sectors = header.size / 512; in qcow_open()
238 s->cluster_offset_mask = (1LL << (63 - s->cluster_bits)) - 1; in qcow_open()
241 shift = s->cluster_bits + s->l2_bits; in qcow_open()
242 if (header.size > UINT64_MAX - (1LL << shift)) { in qcow_open()
244 ret = -EINVAL; in qcow_open()
247 uint64_t l1_size = (header.size + (1LL << shift) - 1) >> shift; in qcow_open()
250 ret = -EINVAL; in qcow_open()
253 s->l1_size = l1_size; in qcow_open()
256 s->l1_table_offset = header.l1_table_offset; in qcow_open()
257 s->l1_table = g_try_new(uint64_t, s->l1_size); in qcow_open()
258 if (s->l1_table == NULL) { in qcow_open()
260 ret = -ENOMEM; in qcow_open()
264 ret = bdrv_pread(bs->file, s->l1_table_offset, in qcow_open()
265 s->l1_size * sizeof(uint64_t), s->l1_table, 0); in qcow_open()
270 for(i = 0;i < s->l1_size; i++) { in qcow_open()
271 s->l1_table[i] = be64_to_cpu(s->l1_table[i]); in qcow_open()
275 s->l2_cache = in qcow_open()
276 qemu_try_blockalign(bs->file->bs, in qcow_open()
277 s->l2_size * L2_CACHE_SIZE * sizeof(uint64_t)); in qcow_open()
278 if (s->l2_cache == NULL) { in qcow_open()
280 ret = -ENOMEM; in qcow_open()
283 s->cluster_cache = g_malloc(s->cluster_size); in qcow_open()
284 s->cluster_data = g_malloc(s->cluster_size); in qcow_open()
285 s->cluster_cache_offset = -1; in qcow_open()
290 if (len > 1023 || len >= sizeof(bs->backing_file)) { in qcow_open()
292 ret = -EINVAL; in qcow_open()
295 ret = bdrv_pread(bs->file, header.backing_file_offset, len, in qcow_open()
296 bs->auto_backing_file, 0); in qcow_open()
300 bs->auto_backing_file[len] = '\0'; in qcow_open()
301 pstrcpy(bs->backing_file, sizeof(bs->backing_file), in qcow_open()
302 bs->auto_backing_file); in qcow_open()
305 /* Disable migration when qcow images are used */ in qcow_open()
306 error_setg(&s->migration_blocker, "The qcow format used by node '%s' " in qcow_open()
307 "does not support live migration", in qcow_open()
310 ret = migrate_add_blocker_normal(&s->migration_blocker, errp); in qcow_open()
317 qemu_co_mutex_init(&s->lock); in qcow_open()
324 g_free(s->l1_table); in qcow_open()
325 qemu_vfree(s->l2_cache); in qcow_open()
326 g_free(s->cluster_cache); in qcow_open()
327 g_free(s->cluster_data); in qcow_open()
328 qcrypto_block_free(s->crypto); in qcow_open()
348 * 1 to allocate a normal cluster (for sector-aligned byte offsets 'n_start'
363 BDRVQcowState *s = bs->opaque; in get_cluster_offset()
371 l1_index = offset >> (s->l2_bits + s->cluster_bits); in get_cluster_offset()
372 l2_offset = s->l1_table[l1_index]; in get_cluster_offset()
378 l2_offset = bdrv_co_getlength(bs->file->bs); in get_cluster_offset()
383 l2_offset = QEMU_ALIGN_UP(l2_offset, s->cluster_size); in get_cluster_offset()
385 s->l1_table[l1_index] = l2_offset; in get_cluster_offset()
387 BLKDBG_CO_EVENT(bs->file, BLKDBG_L1_UPDATE); in get_cluster_offset()
388 ret = bdrv_co_pwrite_sync(bs->file, in get_cluster_offset()
389 s->l1_table_offset + l1_index * sizeof(tmp), in get_cluster_offset()
397 if (l2_offset == s->l2_cache_offsets[i]) { in get_cluster_offset()
399 if (++s->l2_cache_counts[i] == 0xffffffff) { in get_cluster_offset()
401 s->l2_cache_counts[j] >>= 1; in get_cluster_offset()
404 l2_table = s->l2_cache + (i << s->l2_bits); in get_cluster_offset()
412 if (s->l2_cache_counts[i] < min_count) { in get_cluster_offset()
413 min_count = s->l2_cache_counts[i]; in get_cluster_offset()
417 l2_table = s->l2_cache + (min_index << s->l2_bits); in get_cluster_offset()
418 BLKDBG_CO_EVENT(bs->file, BLKDBG_L2_LOAD); in get_cluster_offset()
420 memset(l2_table, 0, s->l2_size * sizeof(uint64_t)); in get_cluster_offset()
421 ret = bdrv_co_pwrite_sync(bs->file, l2_offset, in get_cluster_offset()
422 s->l2_size * sizeof(uint64_t), l2_table, 0); in get_cluster_offset()
427 ret = bdrv_co_pread(bs->file, l2_offset, in get_cluster_offset()
428 s->l2_size * sizeof(uint64_t), l2_table, 0); in get_cluster_offset()
433 s->l2_cache_offsets[min_index] = l2_offset; in get_cluster_offset()
434 s->l2_cache_counts[min_index] = 1; in get_cluster_offset()
436 l2_index = (offset >> s->cluster_bits) & (s->l2_size - 1); in get_cluster_offset()
442 BLKDBG_CO_EVENT(bs->file, BLKDBG_CLUSTER_ALLOC); in get_cluster_offset()
446 (n_end - n_start) < s->cluster_size) { in get_cluster_offset()
451 return -EIO; in get_cluster_offset()
453 cluster_offset = bdrv_co_getlength(bs->file->bs); in get_cluster_offset()
457 cluster_offset = QEMU_ALIGN_UP(cluster_offset, s->cluster_size); in get_cluster_offset()
459 BLKDBG_CO_EVENT(bs->file, BLKDBG_WRITE_AIO); in get_cluster_offset()
460 ret = bdrv_co_pwrite(bs->file, cluster_offset, s->cluster_size, in get_cluster_offset()
461 s->cluster_cache, 0); in get_cluster_offset()
466 cluster_offset = bdrv_co_getlength(bs->file->bs); in get_cluster_offset()
472 cluster_offset = QEMU_ALIGN_UP(cluster_offset, s->cluster_size); in get_cluster_offset()
473 if (cluster_offset + s->cluster_size > INT64_MAX) { in get_cluster_offset()
474 return -E2BIG; in get_cluster_offset()
476 ret = bdrv_co_truncate(bs->file, in get_cluster_offset()
477 cluster_offset + s->cluster_size, in get_cluster_offset()
484 if (bs->encrypted && in get_cluster_offset()
485 (n_end - n_start) < s->cluster_size) { in get_cluster_offset()
487 assert(s->crypto); in get_cluster_offset()
488 start_offset = offset & ~(s->cluster_size - 1); in get_cluster_offset()
489 for (i = 0; i < s->cluster_size; i += BDRV_SECTOR_SIZE) { in get_cluster_offset()
491 memset(s->cluster_data, 0x00, BDRV_SECTOR_SIZE); in get_cluster_offset()
492 if (qcrypto_block_encrypt(s->crypto, in get_cluster_offset()
494 s->cluster_data, in get_cluster_offset()
497 return -EIO; in get_cluster_offset()
499 BLKDBG_CO_EVENT(bs->file, BLKDBG_WRITE_AIO); in get_cluster_offset()
500 ret = bdrv_co_pwrite(bs->file, cluster_offset + i, in get_cluster_offset()
502 s->cluster_data, 0); in get_cluster_offset()
511 (uint64_t)compressed_size << (63 - s->cluster_bits); in get_cluster_offset()
518 BLKDBG_CO_EVENT(bs->file, BLKDBG_L2_UPDATE_COMPRESSED); in get_cluster_offset()
520 BLKDBG_CO_EVENT(bs->file, BLKDBG_L2_UPDATE); in get_cluster_offset()
522 ret = bdrv_co_pwrite_sync(bs->file, l2_offset + l2_index * sizeof(tmp), in get_cluster_offset()
537 BDRVQcowState *s = bs->opaque; in qcow_co_block_status()
542 qemu_co_mutex_lock(&s->lock); in qcow_co_block_status()
544 qemu_co_mutex_unlock(&s->lock); in qcow_co_block_status()
548 index_in_cluster = offset & (s->cluster_size - 1); in qcow_co_block_status()
549 n = s->cluster_size - index_in_cluster; in qcow_co_block_status()
560 if (s->crypto) { in qcow_co_block_status()
564 *file = bs->file->bs; in qcow_co_block_status()
576 strm->next_in = (uint8_t *)buf; in decompress_buffer()
577 strm->avail_in = buf_size; in decompress_buffer()
578 strm->next_out = out_buf; in decompress_buffer()
579 strm->avail_out = out_buf_size; in decompress_buffer()
581 ret = inflateInit2(strm, -12); in decompress_buffer()
583 return -1; in decompress_buffer()
585 out_len = strm->next_out - out_buf; in decompress_buffer()
589 return -1; in decompress_buffer()
598 BDRVQcowState *s = bs->opaque; in decompress_cluster()
602 coffset = cluster_offset & s->cluster_offset_mask; in decompress_cluster()
603 if (s->cluster_cache_offset != coffset) { in decompress_cluster()
604 csize = cluster_offset >> (63 - s->cluster_bits); in decompress_cluster()
605 csize &= (s->cluster_size - 1); in decompress_cluster()
606 BLKDBG_CO_EVENT(bs->file, BLKDBG_READ_COMPRESSED); in decompress_cluster()
607 ret = bdrv_co_pread(bs->file, coffset, csize, s->cluster_data, 0); in decompress_cluster()
609 return -1; in decompress_cluster()
610 if (decompress_buffer(s->cluster_cache, s->cluster_size, in decompress_cluster()
611 s->cluster_data, csize) < 0) { in decompress_cluster()
612 return -1; in decompress_cluster()
614 s->cluster_cache_offset = coffset; in decompress_cluster()
621 /* At least encrypted images require 512-byte alignment. Apply the in qcow_refresh_limits()
623 * it's easier to let the block layer handle rounding than to in qcow_refresh_limits()
625 bs->bl.request_alignment = BDRV_SECTOR_SIZE; in qcow_refresh_limits()
632 BDRVQcowState *s = bs->opaque; in qcow_co_preadv()
639 if (qiov->niov > 1) { in qcow_co_preadv()
640 buf = orig_buf = qemu_try_blockalign(bs, qiov->size); in qcow_co_preadv()
642 return -ENOMEM; in qcow_co_preadv()
646 buf = (uint8_t *)qiov->iov->iov_base; in qcow_co_preadv()
649 qemu_co_mutex_lock(&s->lock); in qcow_co_preadv()
657 offset_in_cluster = offset & (s->cluster_size - 1); in qcow_co_preadv()
658 n = s->cluster_size - offset_in_cluster; in qcow_co_preadv()
664 if (bs->backing) { in qcow_co_preadv()
666 qemu_co_mutex_unlock(&s->lock); in qcow_co_preadv()
667 /* qcow2 emits this on bs->file instead of bs->backing */ in qcow_co_preadv()
668 BLKDBG_CO_EVENT(bs->file, BLKDBG_READ_BACKING_AIO); in qcow_co_preadv()
669 ret = bdrv_co_pread(bs->backing, offset, n, buf, 0); in qcow_co_preadv()
670 qemu_co_mutex_lock(&s->lock); in qcow_co_preadv()
681 ret = -EIO; in qcow_co_preadv()
684 memcpy(buf, s->cluster_cache + offset_in_cluster, n); in qcow_co_preadv()
687 ret = -EIO; in qcow_co_preadv()
690 qemu_co_mutex_unlock(&s->lock); in qcow_co_preadv()
691 BLKDBG_CO_EVENT(bs->file, BLKDBG_READ_AIO); in qcow_co_preadv()
692 ret = bdrv_co_pread(bs->file, cluster_offset + offset_in_cluster, in qcow_co_preadv()
694 qemu_co_mutex_lock(&s->lock); in qcow_co_preadv()
698 if (bs->encrypted) { in qcow_co_preadv()
699 assert(s->crypto); in qcow_co_preadv()
700 if (qcrypto_block_decrypt(s->crypto, in qcow_co_preadv()
702 ret = -EIO; in qcow_co_preadv()
709 bytes -= n; in qcow_co_preadv()
714 qemu_co_mutex_unlock(&s->lock); in qcow_co_preadv()
716 if (qiov->niov > 1) { in qcow_co_preadv()
717 qemu_iovec_from_buf(qiov, 0, orig_buf, qiov->size); in qcow_co_preadv()
728 BDRVQcowState *s = bs->opaque; in qcow_co_pwritev()
735 s->cluster_cache_offset = -1; /* disable compressed cache */ in qcow_co_pwritev()
739 if (bs->encrypted || qiov->niov > 1) { in qcow_co_pwritev()
740 buf = orig_buf = qemu_try_blockalign(bs, qiov->size); in qcow_co_pwritev()
742 return -ENOMEM; in qcow_co_pwritev()
744 qemu_iovec_to_buf(qiov, 0, buf, qiov->size); in qcow_co_pwritev()
747 buf = (uint8_t *)qiov->iov->iov_base; in qcow_co_pwritev()
750 qemu_co_mutex_lock(&s->lock); in qcow_co_pwritev()
753 offset_in_cluster = offset & (s->cluster_size - 1); in qcow_co_pwritev()
754 n = s->cluster_size - offset_in_cluster; in qcow_co_pwritev()
764 ret = -EIO; in qcow_co_pwritev()
767 if (bs->encrypted) { in qcow_co_pwritev()
768 assert(s->crypto); in qcow_co_pwritev()
769 if (qcrypto_block_encrypt(s->crypto, offset, buf, n, NULL) < 0) { in qcow_co_pwritev()
770 ret = -EIO; in qcow_co_pwritev()
775 qemu_co_mutex_unlock(&s->lock); in qcow_co_pwritev()
776 BLKDBG_CO_EVENT(bs->file, BLKDBG_WRITE_AIO); in qcow_co_pwritev()
777 ret = bdrv_co_pwrite(bs->file, cluster_offset + offset_in_cluster, in qcow_co_pwritev()
779 qemu_co_mutex_lock(&s->lock); in qcow_co_pwritev()
785 bytes -= n; in qcow_co_pwritev()
789 qemu_co_mutex_unlock(&s->lock); in qcow_co_pwritev()
798 BDRVQcowState *s = bs->opaque; in qcow_close()
800 qcrypto_block_free(s->crypto); in qcow_close()
801 s->crypto = NULL; in qcow_close()
802 g_free(s->l1_table); in qcow_close()
803 qemu_vfree(s->l2_cache); in qcow_close()
804 g_free(s->cluster_cache); in qcow_close()
805 g_free(s->cluster_data); in qcow_close()
807 migrate_del_blocker(&s->migration_blocker); in qcow_close()
823 assert(opts->driver == BLOCKDEV_DRIVER_QCOW); in qcow_co_create()
824 qcow_opts = &opts->u.qcow; in qcow_co_create()
827 total_size = qcow_opts->size; in qcow_co_create()
830 return -EINVAL; in qcow_co_create()
833 if (qcow_opts->encrypt && in qcow_co_create()
834 qcow_opts->encrypt->format != QCRYPTO_BLOCK_FORMAT_QCOW) in qcow_co_create()
837 return -EINVAL; in qcow_co_create()
841 bs = bdrv_co_open_blockdev_ref(qcow_opts->file, errp); in qcow_co_create()
843 return -EIO; in qcow_co_create()
849 ret = -EPERM; in qcow_co_create()
861 if (qcow_opts->backing_file) { in qcow_co_create()
862 if (strcmp(qcow_opts->backing_file, "fat:")) { in qcow_co_create()
864 backing_filename_len = strlen(qcow_opts->backing_file); in qcow_co_create()
869 qcow_opts->backing_file = NULL; in qcow_co_create()
880 l1_size = (total_size + (1LL << shift) - 1) >> shift; in qcow_co_create()
884 if (qcow_opts->encrypt) { in qcow_co_create()
887 crypto = qcrypto_block_create(qcow_opts->encrypt, "encrypt.", in qcow_co_create()
890 ret = -EINVAL; in qcow_co_create()
903 if (qcow_opts->backing_file) { in qcow_co_create()
905 qcow_opts->backing_file, 0); in qcow_co_create()
944 { BLOCK_OPT_BACKING_FILE, "backing-file" }, in qcow_co_create_opts()
956 ret = -EINVAL; in qcow_co_create_opts()
976 ret = -EINVAL; in qcow_co_create_opts()
989 ret = -EIO; in qcow_co_create_opts()
995 qdict_put_str(qdict, "file", bs->node_name); in qcow_co_create_opts()
999 ret = -EINVAL; in qcow_co_create_opts()
1006 ret = -EINVAL; in qcow_co_create_opts()
1011 assert(create_options->driver == BLOCKDEV_DRIVER_QCOW); in qcow_co_create_opts()
1012 create_options->u.qcow.size = in qcow_co_create_opts()
1013 ROUND_UP(create_options->u.qcow.size, BDRV_SECTOR_SIZE); in qcow_co_create_opts()
1032 BDRVQcowState *s = bs->opaque; in qcow_make_empty()
1033 uint32_t l1_length = s->l1_size * sizeof(uint64_t); in qcow_make_empty()
1036 memset(s->l1_table, 0, l1_length); in qcow_make_empty()
1037 if (bdrv_pwrite_sync(bs->file, s->l1_table_offset, l1_length, s->l1_table, in qcow_make_empty()
1039 return -1; in qcow_make_empty()
1040 ret = bdrv_truncate(bs->file, s->l1_table_offset + l1_length, false, in qcow_make_empty()
1045 memset(s->l2_cache, 0, s->l2_size * L2_CACHE_SIZE * sizeof(uint64_t)); in qcow_make_empty()
1046 memset(s->l2_cache_offsets, 0, L2_CACHE_SIZE * sizeof(uint64_t)); in qcow_make_empty()
1047 memset(s->l2_cache_counts, 0, L2_CACHE_SIZE * sizeof(uint32_t)); in qcow_make_empty()
1058 BDRVQcowState *s = bs->opaque; in qcow_co_pwritev_compressed()
1064 buf = qemu_blockalign(bs, s->cluster_size); in qcow_co_pwritev_compressed()
1065 if (bytes != s->cluster_size) { in qcow_co_pwritev_compressed()
1066 if (bytes > s->cluster_size || in qcow_co_pwritev_compressed()
1067 offset + bytes != bs->total_sectors << BDRV_SECTOR_BITS) in qcow_co_pwritev_compressed()
1070 return -EINVAL; in qcow_co_pwritev_compressed()
1072 /* Zero-pad last write if image size is not cluster aligned */ in qcow_co_pwritev_compressed()
1073 memset(buf + bytes, 0, s->cluster_size - bytes); in qcow_co_pwritev_compressed()
1075 qemu_iovec_to_buf(qiov, 0, buf, qiov->size); in qcow_co_pwritev_compressed()
1077 out_buf = g_malloc(s->cluster_size); in qcow_co_pwritev_compressed()
1082 Z_DEFLATED, -12, in qcow_co_pwritev_compressed()
1085 ret = -EINVAL; in qcow_co_pwritev_compressed()
1089 strm.avail_in = s->cluster_size; in qcow_co_pwritev_compressed()
1091 strm.avail_out = s->cluster_size; in qcow_co_pwritev_compressed()
1097 ret = -EINVAL; in qcow_co_pwritev_compressed()
1100 out_len = strm.next_out - out_buf; in qcow_co_pwritev_compressed()
1104 if (ret != Z_STREAM_END || out_len >= s->cluster_size) { in qcow_co_pwritev_compressed()
1112 qemu_co_mutex_lock(&s->lock); in qcow_co_pwritev_compressed()
1114 qemu_co_mutex_unlock(&s->lock); in qcow_co_pwritev_compressed()
1119 ret = -EIO; in qcow_co_pwritev_compressed()
1122 cluster_offset &= s->cluster_offset_mask; in qcow_co_pwritev_compressed()
1124 BLKDBG_CO_EVENT(bs->file, BLKDBG_WRITE_COMPRESSED); in qcow_co_pwritev_compressed()
1125 ret = bdrv_co_pwrite(bs->file, cluster_offset, out_len, out_buf, 0); in qcow_co_pwritev_compressed()
1140 BDRVQcowState *s = bs->opaque; in qcow_co_get_info()
1141 bdi->cluster_size = s->cluster_size; in qcow_co_get_info()
1146 .name = "qcow-create-opts",