qcow2.c (067179868ec8cd467d9810143339e882cb60e388) qcow2.c (e2dd273754eb9a47c33660b4e14074e8e96ada4d)
1/*
2 * Block driver for the QCOW version 2 format
3 *
4 * Copyright (c) 2004-2006 Fabrice Bellard
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights

--- 3141 unchanged lines hidden (view full) ---

3150 }
3151
3152 ret = 0;
3153fail:
3154 qemu_vfree(header);
3155 return ret;
3156}
3157
1/*
2 * Block driver for the QCOW version 2 format
3 *
4 * Copyright (c) 2004-2006 Fabrice Bellard
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights

--- 3141 unchanged lines hidden (view full) ---

3150 }
3151
3152 ret = 0;
3153fail:
3154 qemu_vfree(header);
3155 return ret;
3156}
3157
3158static int qcow2_change_backing_file(BlockDriverState *bs,
3159 const char *backing_file, const char *backing_fmt)
3158static int coroutine_fn GRAPH_RDLOCK
3159qcow2_co_change_backing_file(BlockDriverState *bs, const char *backing_file,
3160 const char *backing_fmt)
3160{
3161 BDRVQcow2State *s = bs->opaque;
3162
3163 /* Adding a backing file means that the external data file alone won't be
3164 * enough to make sense of the content */
3165 if (backing_file && data_file_is_raw(bs)) {
3166 return -EINVAL;
3167 }

--- 643 unchanged lines hidden (view full) ---

3811 /* Want a backing file? There you go. */
3812 if (qcow2_opts->backing_file) {
3813 const char *backing_format = NULL;
3814
3815 if (qcow2_opts->has_backing_fmt) {
3816 backing_format = BlockdevDriver_str(qcow2_opts->backing_fmt);
3817 }
3818
3161{
3162 BDRVQcow2State *s = bs->opaque;
3163
3164 /* Adding a backing file means that the external data file alone won't be
3165 * enough to make sense of the content */
3166 if (backing_file && data_file_is_raw(bs)) {
3167 return -EINVAL;
3168 }

--- 643 unchanged lines hidden (view full) ---

3812 /* Want a backing file? There you go. */
3813 if (qcow2_opts->backing_file) {
3814 const char *backing_format = NULL;
3815
3816 if (qcow2_opts->has_backing_fmt) {
3817 backing_format = BlockdevDriver_str(qcow2_opts->backing_fmt);
3818 }
3819
3819 ret = bdrv_change_backing_file(blk_bs(blk), qcow2_opts->backing_file,
3820 backing_format, false);
3820 bdrv_graph_co_rdlock();
3821 ret = bdrv_co_change_backing_file(blk_bs(blk), qcow2_opts->backing_file,
3822 backing_format, false);
3823 bdrv_graph_co_rdunlock();
3824
3821 if (ret < 0) {
3822 error_setg_errno(errp, -ret, "Could not assign backing file '%s' "
3823 "with format '%s'", qcow2_opts->backing_file,
3824 backing_format);
3825 goto out;
3826 }
3827 }
3828

--- 2281 unchanged lines hidden (view full) ---

6110
6111static const char *const qcow2_strong_runtime_opts[] = {
6112 "encrypt." BLOCK_CRYPTO_OPT_QCOW_KEY_SECRET,
6113
6114 NULL
6115};
6116
6117BlockDriver bdrv_qcow2 = {
3825 if (ret < 0) {
3826 error_setg_errno(errp, -ret, "Could not assign backing file '%s' "
3827 "with format '%s'", qcow2_opts->backing_file,
3828 backing_format);
3829 goto out;
3830 }
3831 }
3832

--- 2281 unchanged lines hidden (view full) ---

6114
6115static const char *const qcow2_strong_runtime_opts[] = {
6116 "encrypt." BLOCK_CRYPTO_OPT_QCOW_KEY_SECRET,
6117
6118 NULL
6119};
6120
6121BlockDriver bdrv_qcow2 = {
6118 .format_name = "qcow2",
6119 .instance_size = sizeof(BDRVQcow2State),
6120 .bdrv_probe = qcow2_probe,
6121 .bdrv_open = qcow2_open,
6122 .bdrv_close = qcow2_close,
6123 .bdrv_reopen_prepare = qcow2_reopen_prepare,
6124 .bdrv_reopen_commit = qcow2_reopen_commit,
6125 .bdrv_reopen_commit_post = qcow2_reopen_commit_post,
6126 .bdrv_reopen_abort = qcow2_reopen_abort,
6127 .bdrv_join_options = qcow2_join_options,
6128 .bdrv_child_perm = bdrv_default_perms,
6129 .bdrv_co_create_opts = qcow2_co_create_opts,
6130 .bdrv_co_create = qcow2_co_create,
6131 .bdrv_has_zero_init = qcow2_has_zero_init,
6132 .bdrv_co_block_status = qcow2_co_block_status,
6122 .format_name = "qcow2",
6123 .instance_size = sizeof(BDRVQcow2State),
6124 .bdrv_probe = qcow2_probe,
6125 .bdrv_open = qcow2_open,
6126 .bdrv_close = qcow2_close,
6127 .bdrv_reopen_prepare = qcow2_reopen_prepare,
6128 .bdrv_reopen_commit = qcow2_reopen_commit,
6129 .bdrv_reopen_commit_post = qcow2_reopen_commit_post,
6130 .bdrv_reopen_abort = qcow2_reopen_abort,
6131 .bdrv_join_options = qcow2_join_options,
6132 .bdrv_child_perm = bdrv_default_perms,
6133 .bdrv_co_create_opts = qcow2_co_create_opts,
6134 .bdrv_co_create = qcow2_co_create,
6135 .bdrv_has_zero_init = qcow2_has_zero_init,
6136 .bdrv_co_block_status = qcow2_co_block_status,
6133
6137
6134 .bdrv_co_preadv_part = qcow2_co_preadv_part,
6135 .bdrv_co_pwritev_part = qcow2_co_pwritev_part,
6136 .bdrv_co_flush_to_os = qcow2_co_flush_to_os,
6138 .bdrv_co_preadv_part = qcow2_co_preadv_part,
6139 .bdrv_co_pwritev_part = qcow2_co_pwritev_part,
6140 .bdrv_co_flush_to_os = qcow2_co_flush_to_os,
6137
6141
6138 .bdrv_co_pwrite_zeroes = qcow2_co_pwrite_zeroes,
6139 .bdrv_co_pdiscard = qcow2_co_pdiscard,
6140 .bdrv_co_copy_range_from = qcow2_co_copy_range_from,
6141 .bdrv_co_copy_range_to = qcow2_co_copy_range_to,
6142 .bdrv_co_truncate = qcow2_co_truncate,
6143 .bdrv_co_pwritev_compressed_part = qcow2_co_pwritev_compressed_part,
6144 .bdrv_make_empty = qcow2_make_empty,
6142 .bdrv_co_pwrite_zeroes = qcow2_co_pwrite_zeroes,
6143 .bdrv_co_pdiscard = qcow2_co_pdiscard,
6144 .bdrv_co_copy_range_from = qcow2_co_copy_range_from,
6145 .bdrv_co_copy_range_to = qcow2_co_copy_range_to,
6146 .bdrv_co_truncate = qcow2_co_truncate,
6147 .bdrv_co_pwritev_compressed_part = qcow2_co_pwritev_compressed_part,
6148 .bdrv_make_empty = qcow2_make_empty,
6145
6149
6146 .bdrv_snapshot_create = qcow2_snapshot_create,
6147 .bdrv_snapshot_goto = qcow2_snapshot_goto,
6148 .bdrv_snapshot_delete = qcow2_snapshot_delete,
6149 .bdrv_snapshot_list = qcow2_snapshot_list,
6150 .bdrv_snapshot_load_tmp = qcow2_snapshot_load_tmp,
6151 .bdrv_measure = qcow2_measure,
6152 .bdrv_co_get_info = qcow2_co_get_info,
6153 .bdrv_get_specific_info = qcow2_get_specific_info,
6150 .bdrv_snapshot_create = qcow2_snapshot_create,
6151 .bdrv_snapshot_goto = qcow2_snapshot_goto,
6152 .bdrv_snapshot_delete = qcow2_snapshot_delete,
6153 .bdrv_snapshot_list = qcow2_snapshot_list,
6154 .bdrv_snapshot_load_tmp = qcow2_snapshot_load_tmp,
6155 .bdrv_measure = qcow2_measure,
6156 .bdrv_co_get_info = qcow2_co_get_info,
6157 .bdrv_get_specific_info = qcow2_get_specific_info,
6154
6158
6155 .bdrv_co_save_vmstate = qcow2_co_save_vmstate,
6156 .bdrv_co_load_vmstate = qcow2_co_load_vmstate,
6159 .bdrv_co_save_vmstate = qcow2_co_save_vmstate,
6160 .bdrv_co_load_vmstate = qcow2_co_load_vmstate,
6157
6161
6158 .is_format = true,
6159 .supports_backing = true,
6160 .bdrv_change_backing_file = qcow2_change_backing_file,
6162 .is_format = true,
6163 .supports_backing = true,
6164 .bdrv_co_change_backing_file = qcow2_co_change_backing_file,
6161
6165
6162 .bdrv_refresh_limits = qcow2_refresh_limits,
6163 .bdrv_co_invalidate_cache = qcow2_co_invalidate_cache,
6164 .bdrv_inactivate = qcow2_inactivate,
6166 .bdrv_refresh_limits = qcow2_refresh_limits,
6167 .bdrv_co_invalidate_cache = qcow2_co_invalidate_cache,
6168 .bdrv_inactivate = qcow2_inactivate,
6165
6169
6166 .create_opts = &qcow2_create_opts,
6167 .amend_opts = &qcow2_amend_opts,
6168 .strong_runtime_opts = qcow2_strong_runtime_opts,
6169 .mutable_opts = mutable_opts,
6170 .bdrv_co_check = qcow2_co_check,
6171 .bdrv_amend_options = qcow2_amend_options,
6172 .bdrv_co_amend = qcow2_co_amend,
6170 .create_opts = &qcow2_create_opts,
6171 .amend_opts = &qcow2_amend_opts,
6172 .strong_runtime_opts = qcow2_strong_runtime_opts,
6173 .mutable_opts = mutable_opts,
6174 .bdrv_co_check = qcow2_co_check,
6175 .bdrv_amend_options = qcow2_amend_options,
6176 .bdrv_co_amend = qcow2_co_amend,
6173
6177
6174 .bdrv_detach_aio_context = qcow2_detach_aio_context,
6175 .bdrv_attach_aio_context = qcow2_attach_aio_context,
6178 .bdrv_detach_aio_context = qcow2_detach_aio_context,
6179 .bdrv_attach_aio_context = qcow2_attach_aio_context,
6176
6177 .bdrv_supports_persistent_dirty_bitmap =
6178 qcow2_supports_persistent_dirty_bitmap,
6179 .bdrv_co_can_store_new_dirty_bitmap = qcow2_co_can_store_new_dirty_bitmap,
6180 .bdrv_co_remove_persistent_dirty_bitmap =
6181 qcow2_co_remove_persistent_dirty_bitmap,
6182};
6183
6184static void bdrv_qcow2_init(void)
6185{
6186 bdrv_register(&bdrv_qcow2);
6187}
6188
6189block_init(bdrv_qcow2_init);
6180
6181 .bdrv_supports_persistent_dirty_bitmap =
6182 qcow2_supports_persistent_dirty_bitmap,
6183 .bdrv_co_can_store_new_dirty_bitmap = qcow2_co_can_store_new_dirty_bitmap,
6184 .bdrv_co_remove_persistent_dirty_bitmap =
6185 qcow2_co_remove_persistent_dirty_bitmap,
6186};
6187
6188static void bdrv_qcow2_init(void)
6189{
6190 bdrv_register(&bdrv_qcow2);
6191}
6192
6193block_init(bdrv_qcow2_init);