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); |