Commit 5efa9d5a8b18841c9c62208a494d7f519238979a
1 parent
0bfe3ca5
Convert block infrastructure to use new module init functionality
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
16 changed files
with
141 additions
and
60 deletions
block-bochs.c
| ... | ... | @@ -24,6 +24,7 @@ |
| 24 | 24 | */ |
| 25 | 25 | #include "qemu-common.h" |
| 26 | 26 | #include "block_int.h" |
| 27 | +#include "module.h" | |
| 27 | 28 | |
| 28 | 29 | /**************************************************************/ |
| 29 | 30 | |
| ... | ... | @@ -241,7 +242,7 @@ static void bochs_close(BlockDriverState *bs) |
| 241 | 242 | close(s->fd); |
| 242 | 243 | } |
| 243 | 244 | |
| 244 | -BlockDriver bdrv_bochs = { | |
| 245 | +static BlockDriver bdrv_bochs = { | |
| 245 | 246 | .format_name = "bochs", |
| 246 | 247 | .instance_size = sizeof(BDRVBochsState), |
| 247 | 248 | .bdrv_probe = bochs_probe, |
| ... | ... | @@ -249,3 +250,10 @@ BlockDriver bdrv_bochs = { |
| 249 | 250 | .bdrv_read = bochs_read, |
| 250 | 251 | .bdrv_close = bochs_close, |
| 251 | 252 | }; |
| 253 | + | |
| 254 | +static void bdrv_bochs_init(void) | |
| 255 | +{ | |
| 256 | + bdrv_register(&bdrv_bochs); | |
| 257 | +} | |
| 258 | + | |
| 259 | +block_init(bdrv_bochs_init); | ... | ... |
block-cloop.c
| ... | ... | @@ -23,6 +23,7 @@ |
| 23 | 23 | */ |
| 24 | 24 | #include "qemu-common.h" |
| 25 | 25 | #include "block_int.h" |
| 26 | +#include "module.h" | |
| 26 | 27 | #include <zlib.h> |
| 27 | 28 | |
| 28 | 29 | typedef struct BDRVCloopState { |
| ... | ... | @@ -153,7 +154,7 @@ static void cloop_close(BlockDriverState *bs) |
| 153 | 154 | inflateEnd(&s->zstream); |
| 154 | 155 | } |
| 155 | 156 | |
| 156 | -BlockDriver bdrv_cloop = { | |
| 157 | +static BlockDriver bdrv_cloop = { | |
| 157 | 158 | .format_name = "cloop", |
| 158 | 159 | .instance_size = sizeof(BDRVCloopState), |
| 159 | 160 | .bdrv_probe = cloop_probe, |
| ... | ... | @@ -161,3 +162,10 @@ BlockDriver bdrv_cloop = { |
| 161 | 162 | .bdrv_read = cloop_read, |
| 162 | 163 | .bdrv_close = cloop_close, |
| 163 | 164 | }; |
| 165 | + | |
| 166 | +static void bdrv_cloop_init(void) | |
| 167 | +{ | |
| 168 | + bdrv_register(&bdrv_cloop); | |
| 169 | +} | |
| 170 | + | |
| 171 | +block_init(bdrv_cloop_init); | ... | ... |
block-cow.c
| ... | ... | @@ -24,6 +24,7 @@ |
| 24 | 24 | #ifndef _WIN32 |
| 25 | 25 | #include "qemu-common.h" |
| 26 | 26 | #include "block_int.h" |
| 27 | +#include "module.h" | |
| 27 | 28 | #include <sys/mman.h> |
| 28 | 29 | |
| 29 | 30 | /**************************************************************/ |
| ... | ... | @@ -252,7 +253,7 @@ static void cow_flush(BlockDriverState *bs) |
| 252 | 253 | fsync(s->fd); |
| 253 | 254 | } |
| 254 | 255 | |
| 255 | -BlockDriver bdrv_cow = { | |
| 256 | +static BlockDriver bdrv_cow = { | |
| 256 | 257 | .format_name = "cow", |
| 257 | 258 | .instance_size = sizeof(BDRVCowState), |
| 258 | 259 | .bdrv_probe = cow_probe, |
| ... | ... | @@ -264,4 +265,11 @@ BlockDriver bdrv_cow = { |
| 264 | 265 | .bdrv_flush = cow_flush, |
| 265 | 266 | .bdrv_is_allocated = cow_is_allocated, |
| 266 | 267 | }; |
| 268 | + | |
| 269 | +static void bdrv_cow_init(void) | |
| 270 | +{ | |
| 271 | + bdrv_register(&bdrv_cow); | |
| 272 | +} | |
| 273 | + | |
| 274 | +block_init(bdrv_cow_init); | |
| 267 | 275 | #endif | ... | ... |
block-dmg.c
| ... | ... | @@ -24,6 +24,7 @@ |
| 24 | 24 | #include "qemu-common.h" |
| 25 | 25 | #include "block_int.h" |
| 26 | 26 | #include "bswap.h" |
| 27 | +#include "module.h" | |
| 27 | 28 | #include <zlib.h> |
| 28 | 29 | |
| 29 | 30 | typedef struct BDRVDMGState { |
| ... | ... | @@ -92,7 +93,7 @@ static int dmg_open(BlockDriverState *bs, const char *filename, int flags) |
| 92 | 93 | dmg_close: |
| 93 | 94 | close(s->fd); |
| 94 | 95 | /* open raw instead */ |
| 95 | - bs->drv=&bdrv_raw; | |
| 96 | + bs->drv=bdrv_find_format("raw"); | |
| 96 | 97 | return bs->drv->bdrv_open(bs, filename, flags); |
| 97 | 98 | } |
| 98 | 99 | info_begin=read_off(s->fd); |
| ... | ... | @@ -283,7 +284,7 @@ static void dmg_close(BlockDriverState *bs) |
| 283 | 284 | inflateEnd(&s->zstream); |
| 284 | 285 | } |
| 285 | 286 | |
| 286 | -BlockDriver bdrv_dmg = { | |
| 287 | +static BlockDriver bdrv_dmg = { | |
| 287 | 288 | .format_name = "dmg", |
| 288 | 289 | .instance_size = sizeof(BDRVDMGState), |
| 289 | 290 | .bdrv_probe = dmg_probe, |
| ... | ... | @@ -291,3 +292,10 @@ BlockDriver bdrv_dmg = { |
| 291 | 292 | .bdrv_read = dmg_read, |
| 292 | 293 | .bdrv_close = dmg_close, |
| 293 | 294 | }; |
| 295 | + | |
| 296 | +static void bdrv_dmg_init(void) | |
| 297 | +{ | |
| 298 | + bdrv_register(&bdrv_dmg); | |
| 299 | +} | |
| 300 | + | |
| 301 | +block_init(bdrv_dmg_init); | ... | ... |
block-nbd.c
| ... | ... | @@ -28,6 +28,7 @@ |
| 28 | 28 | |
| 29 | 29 | #include "qemu-common.h" |
| 30 | 30 | #include "nbd.h" |
| 31 | +#include "module.h" | |
| 31 | 32 | |
| 32 | 33 | #include <sys/types.h> |
| 33 | 34 | #include <unistd.h> |
| ... | ... | @@ -176,7 +177,7 @@ static int64_t nbd_getlength(BlockDriverState *bs) |
| 176 | 177 | return s->size; |
| 177 | 178 | } |
| 178 | 179 | |
| 179 | -BlockDriver bdrv_nbd = { | |
| 180 | +static BlockDriver bdrv_nbd = { | |
| 180 | 181 | .format_name = "nbd", |
| 181 | 182 | .instance_size = sizeof(BDRVNBDState), |
| 182 | 183 | .bdrv_open = nbd_open, |
| ... | ... | @@ -186,3 +187,10 @@ BlockDriver bdrv_nbd = { |
| 186 | 187 | .bdrv_getlength = nbd_getlength, |
| 187 | 188 | .protocol_name = "nbd", |
| 188 | 189 | }; |
| 190 | + | |
| 191 | +static void bdrv_nbd_init(void) | |
| 192 | +{ | |
| 193 | + bdrv_register(&bdrv_nbd); | |
| 194 | +} | |
| 195 | + | |
| 196 | +block_init(bdrv_nbd_init); | ... | ... |
block-parallels.c
| ... | ... | @@ -25,6 +25,7 @@ |
| 25 | 25 | */ |
| 26 | 26 | #include "qemu-common.h" |
| 27 | 27 | #include "block_int.h" |
| 28 | +#include "module.h" | |
| 28 | 29 | |
| 29 | 30 | /**************************************************************/ |
| 30 | 31 | |
| ... | ... | @@ -163,7 +164,7 @@ static void parallels_close(BlockDriverState *bs) |
| 163 | 164 | close(s->fd); |
| 164 | 165 | } |
| 165 | 166 | |
| 166 | -BlockDriver bdrv_parallels = { | |
| 167 | +static BlockDriver bdrv_parallels = { | |
| 167 | 168 | .format_name = "parallels", |
| 168 | 169 | .instance_size = sizeof(BDRVParallelsState), |
| 169 | 170 | .bdrv_probe = parallels_probe, |
| ... | ... | @@ -171,3 +172,10 @@ BlockDriver bdrv_parallels = { |
| 171 | 172 | .bdrv_read = parallels_read, |
| 172 | 173 | .bdrv_close = parallels_close, |
| 173 | 174 | }; |
| 175 | + | |
| 176 | +static void bdrv_parallels_init(void) | |
| 177 | +{ | |
| 178 | + bdrv_register(&bdrv_parallels); | |
| 179 | +} | |
| 180 | + | |
| 181 | +block_init(bdrv_parallels_init); | ... | ... |
block-qcow.c
| ... | ... | @@ -23,6 +23,7 @@ |
| 23 | 23 | */ |
| 24 | 24 | #include "qemu-common.h" |
| 25 | 25 | #include "block_int.h" |
| 26 | +#include "module.h" | |
| 26 | 27 | #include <zlib.h> |
| 27 | 28 | #include "aes.h" |
| 28 | 29 | |
| ... | ... | @@ -917,7 +918,7 @@ static int qcow_get_info(BlockDriverState *bs, BlockDriverInfo *bdi) |
| 917 | 918 | return 0; |
| 918 | 919 | } |
| 919 | 920 | |
| 920 | -BlockDriver bdrv_qcow = { | |
| 921 | +static BlockDriver bdrv_qcow = { | |
| 921 | 922 | .format_name = "qcow", |
| 922 | 923 | .instance_size = sizeof(BDRVQcowState), |
| 923 | 924 | .bdrv_probe = qcow_probe, |
| ... | ... | @@ -935,3 +936,10 @@ BlockDriver bdrv_qcow = { |
| 935 | 936 | .bdrv_write_compressed = qcow_write_compressed, |
| 936 | 937 | .bdrv_get_info = qcow_get_info, |
| 937 | 938 | }; |
| 939 | + | |
| 940 | +static void bdrv_qcow_init(void) | |
| 941 | +{ | |
| 942 | + bdrv_register(&bdrv_qcow); | |
| 943 | +} | |
| 944 | + | |
| 945 | +block_init(bdrv_qcow_init); | ... | ... |
block-qcow2.c
| ... | ... | @@ -23,6 +23,7 @@ |
| 23 | 23 | */ |
| 24 | 24 | #include "qemu-common.h" |
| 25 | 25 | #include "block_int.h" |
| 26 | +#include "module.h" | |
| 26 | 27 | #include <zlib.h> |
| 27 | 28 | #include "aes.h" |
| 28 | 29 | |
| ... | ... | @@ -2891,7 +2892,7 @@ static int qcow_get_buffer(BlockDriverState *bs, uint8_t *buf, |
| 2891 | 2892 | return ret; |
| 2892 | 2893 | } |
| 2893 | 2894 | |
| 2894 | -BlockDriver bdrv_qcow2 = { | |
| 2895 | +static BlockDriver bdrv_qcow2 = { | |
| 2895 | 2896 | .format_name = "qcow2", |
| 2896 | 2897 | .instance_size = sizeof(BDRVQcowState), |
| 2897 | 2898 | .bdrv_probe = qcow_probe, |
| ... | ... | @@ -2921,3 +2922,10 @@ BlockDriver bdrv_qcow2 = { |
| 2921 | 2922 | .bdrv_create2 = qcow_create2, |
| 2922 | 2923 | .bdrv_check = qcow_check, |
| 2923 | 2924 | }; |
| 2925 | + | |
| 2926 | +static void bdrv_qcow2_init(void) | |
| 2927 | +{ | |
| 2928 | + bdrv_register(&bdrv_qcow2); | |
| 2929 | +} | |
| 2930 | + | |
| 2931 | +block_init(bdrv_qcow2_init); | ... | ... |
block-raw-posix.c
| ... | ... | @@ -25,6 +25,7 @@ |
| 25 | 25 | #include "qemu-timer.h" |
| 26 | 26 | #include "qemu-char.h" |
| 27 | 27 | #include "block_int.h" |
| 28 | +#include "module.h" | |
| 28 | 29 | #ifdef CONFIG_AIO |
| 29 | 30 | #include "posix-aio-compat.h" |
| 30 | 31 | #endif |
| ... | ... | @@ -845,7 +846,7 @@ static void raw_flush(BlockDriverState *bs) |
| 845 | 846 | fsync(s->fd); |
| 846 | 847 | } |
| 847 | 848 | |
| 848 | -BlockDriver bdrv_raw = { | |
| 849 | +static BlockDriver bdrv_raw = { | |
| 849 | 850 | .format_name = "raw", |
| 850 | 851 | .instance_size = sizeof(BDRVRawState), |
| 851 | 852 | .bdrv_probe = NULL, /* no probe for protocols */ |
| ... | ... | @@ -1397,7 +1398,7 @@ static int hdev_create(const char *filename, int64_t total_size, |
| 1397 | 1398 | } |
| 1398 | 1399 | #endif |
| 1399 | 1400 | |
| 1400 | -BlockDriver bdrv_host_device = { | |
| 1401 | +static BlockDriver bdrv_host_device = { | |
| 1401 | 1402 | .format_name = "host_device", |
| 1402 | 1403 | .instance_size = sizeof(BDRVRawState), |
| 1403 | 1404 | .bdrv_open = hdev_open, |
| ... | ... | @@ -1427,3 +1428,11 @@ BlockDriver bdrv_host_device = { |
| 1427 | 1428 | .bdrv_aio_ioctl = raw_aio_ioctl, |
| 1428 | 1429 | #endif |
| 1429 | 1430 | }; |
| 1431 | + | |
| 1432 | +static void bdrv_raw_init(void) | |
| 1433 | +{ | |
| 1434 | + bdrv_register(&bdrv_raw); | |
| 1435 | + bdrv_register(&bdrv_host_device); | |
| 1436 | +} | |
| 1437 | + | |
| 1438 | +block_init(bdrv_raw_init); | ... | ... |
block-raw-win32.c
| ... | ... | @@ -24,6 +24,7 @@ |
| 24 | 24 | #include "qemu-common.h" |
| 25 | 25 | #include "qemu-timer.h" |
| 26 | 26 | #include "block_int.h" |
| 27 | +#include "module.h" | |
| 27 | 28 | #include <windows.h> |
| 28 | 29 | #include <winioctl.h> |
| 29 | 30 | |
| ... | ... | @@ -227,7 +228,7 @@ static int raw_create(const char *filename, int64_t total_size, |
| 227 | 228 | return 0; |
| 228 | 229 | } |
| 229 | 230 | |
| 230 | -BlockDriver bdrv_raw = { | |
| 231 | +static BlockDriver bdrv_raw = { | |
| 231 | 232 | .format_name = "raw", |
| 232 | 233 | .instance_size = sizeof(BDRVRawState), |
| 233 | 234 | .bdrv_open = raw_open, |
| ... | ... | @@ -371,7 +372,7 @@ static int raw_set_locked(BlockDriverState *bs, int locked) |
| 371 | 372 | } |
| 372 | 373 | #endif |
| 373 | 374 | |
| 374 | -BlockDriver bdrv_host_device = { | |
| 375 | +static BlockDriver bdrv_host_device = { | |
| 375 | 376 | .format_name = "host_device", |
| 376 | 377 | .instance_size = sizeof(BDRVRawState), |
| 377 | 378 | .bdrv_open = hdev_open, |
| ... | ... | @@ -382,3 +383,11 @@ BlockDriver bdrv_host_device = { |
| 382 | 383 | .bdrv_write = raw_write, |
| 383 | 384 | .bdrv_getlength = raw_getlength, |
| 384 | 385 | }; |
| 386 | + | |
| 387 | +static void bdrv_raw_init(void) | |
| 388 | +{ | |
| 389 | + bdrv_register(&bdrv_raw); | |
| 390 | + bdrv_register(&bdrv_host_device); | |
| 391 | +} | |
| 392 | + | |
| 393 | +block_init(bdrv_raw_init); | ... | ... |
block-vmdk.c
| ... | ... | @@ -25,6 +25,7 @@ |
| 25 | 25 | |
| 26 | 26 | #include "qemu-common.h" |
| 27 | 27 | #include "block_int.h" |
| 28 | +#include "module.h" | |
| 28 | 29 | |
| 29 | 30 | #define VMDK3_MAGIC (('C' << 24) | ('O' << 16) | ('W' << 8) | 'D') |
| 30 | 31 | #define VMDK4_MAGIC (('K' << 24) | ('D' << 16) | ('M' << 8) | 'V') |
| ... | ... | @@ -811,7 +812,7 @@ static void vmdk_flush(BlockDriverState *bs) |
| 811 | 812 | bdrv_flush(s->hd); |
| 812 | 813 | } |
| 813 | 814 | |
| 814 | -BlockDriver bdrv_vmdk = { | |
| 815 | +static BlockDriver bdrv_vmdk = { | |
| 815 | 816 | .format_name = "vmdk", |
| 816 | 817 | .instance_size = sizeof(BDRVVmdkState), |
| 817 | 818 | .bdrv_probe = vmdk_probe, |
| ... | ... | @@ -823,3 +824,10 @@ BlockDriver bdrv_vmdk = { |
| 823 | 824 | .bdrv_flush = vmdk_flush, |
| 824 | 825 | .bdrv_is_allocated = vmdk_is_allocated, |
| 825 | 826 | }; |
| 827 | + | |
| 828 | +static void bdrv_vmdk_init(void) | |
| 829 | +{ | |
| 830 | + bdrv_register(&bdrv_vmdk); | |
| 831 | +} | |
| 832 | + | |
| 833 | +block_init(bdrv_vmdk_init); | ... | ... |
block-vpc.c
| ... | ... | @@ -24,6 +24,7 @@ |
| 24 | 24 | */ |
| 25 | 25 | #include "qemu-common.h" |
| 26 | 26 | #include "block_int.h" |
| 27 | +#include "module.h" | |
| 27 | 28 | |
| 28 | 29 | /**************************************************************/ |
| 29 | 30 | |
| ... | ... | @@ -586,7 +587,7 @@ static void vpc_close(BlockDriverState *bs) |
| 586 | 587 | bdrv_delete(s->hd); |
| 587 | 588 | } |
| 588 | 589 | |
| 589 | -BlockDriver bdrv_vpc = { | |
| 590 | +static BlockDriver bdrv_vpc = { | |
| 590 | 591 | .format_name = "vpc", |
| 591 | 592 | .instance_size = sizeof(BDRVVPCState), |
| 592 | 593 | .bdrv_probe = vpc_probe, |
| ... | ... | @@ -596,3 +597,10 @@ BlockDriver bdrv_vpc = { |
| 596 | 597 | .bdrv_close = vpc_close, |
| 597 | 598 | .bdrv_create = vpc_create, |
| 598 | 599 | }; |
| 600 | + | |
| 601 | +static void bdrv_vpc_init(void) | |
| 602 | +{ | |
| 603 | + bdrv_register(&bdrv_vpc); | |
| 604 | +} | |
| 605 | + | |
| 606 | +block_init(bdrv_vpc_init); | ... | ... |
block-vvfat.c
| ... | ... | @@ -26,6 +26,7 @@ |
| 26 | 26 | #include <dirent.h> |
| 27 | 27 | #include "qemu-common.h" |
| 28 | 28 | #include "block_int.h" |
| 29 | +#include "module.h" | |
| 29 | 30 | |
| 30 | 31 | #ifndef S_IWGRP |
| 31 | 32 | #define S_IWGRP 0 |
| ... | ... | @@ -2776,7 +2777,7 @@ static int enable_write_target(BDRVVVFATState *s) |
| 2776 | 2777 | |
| 2777 | 2778 | s->qcow_filename = qemu_malloc(1024); |
| 2778 | 2779 | get_tmp_filename(s->qcow_filename, 1024); |
| 2779 | - if (bdrv_create(&bdrv_qcow, | |
| 2780 | + if (bdrv_create(bdrv_find_format("qcow"), | |
| 2780 | 2781 | s->qcow_filename, s->sector_count, "fat:", 0) < 0) |
| 2781 | 2782 | return -1; |
| 2782 | 2783 | s->qcow = bdrv_new(""); |
| ... | ... | @@ -2806,7 +2807,7 @@ static void vvfat_close(BlockDriverState *bs) |
| 2806 | 2807 | free(s->cluster_buffer); |
| 2807 | 2808 | } |
| 2808 | 2809 | |
| 2809 | -BlockDriver bdrv_vvfat = { | |
| 2810 | +static BlockDriver bdrv_vvfat = { | |
| 2810 | 2811 | .format_name = "vvfat", |
| 2811 | 2812 | .instance_size = sizeof(BDRVVVFATState), |
| 2812 | 2813 | .bdrv_open = vvfat_open, |
| ... | ... | @@ -2817,6 +2818,13 @@ BlockDriver bdrv_vvfat = { |
| 2817 | 2818 | .protocol_name = "fat", |
| 2818 | 2819 | }; |
| 2819 | 2820 | |
| 2821 | +static void bdrv_vvfat_init(void) | |
| 2822 | +{ | |
| 2823 | + bdrv_register(&bdrv_vvfat); | |
| 2824 | +} | |
| 2825 | + | |
| 2826 | +block_init(bdrv_vvfat_init); | |
| 2827 | + | |
| 2820 | 2828 | #ifdef DEBUG |
| 2821 | 2829 | static void checkpoint(void) { |
| 2822 | 2830 | assert(((mapping_t*)array_get(&(vvv->mapping), 0))->end == 2); | ... | ... |
block.c
| ... | ... | @@ -30,6 +30,7 @@ |
| 30 | 30 | #include "qemu-common.h" |
| 31 | 31 | #include "monitor.h" |
| 32 | 32 | #include "block_int.h" |
| 33 | +#include "module.h" | |
| 33 | 34 | |
| 34 | 35 | #ifdef HOST_BSD |
| 35 | 36 | #include <sys/types.h> |
| ... | ... | @@ -138,7 +139,7 @@ void path_combine(char *dest, int dest_size, |
| 138 | 139 | } |
| 139 | 140 | |
| 140 | 141 | |
| 141 | -static void bdrv_register(BlockDriver *bdrv) | |
| 142 | +void bdrv_register(BlockDriver *bdrv) | |
| 142 | 143 | { |
| 143 | 144 | if (!bdrv->bdrv_aio_readv) { |
| 144 | 145 | /* add AIO emulation layer */ |
| ... | ... | @@ -259,11 +260,11 @@ static BlockDriver *find_protocol(const char *filename) |
| 259 | 260 | #ifdef _WIN32 |
| 260 | 261 | if (is_windows_drive(filename) || |
| 261 | 262 | is_windows_drive_prefix(filename)) |
| 262 | - return &bdrv_raw; | |
| 263 | + return bdrv_find_format("raw"); | |
| 263 | 264 | #endif |
| 264 | 265 | p = strchr(filename, ':'); |
| 265 | 266 | if (!p) |
| 266 | - return &bdrv_raw; | |
| 267 | + return bdrv_find_format("raw"); | |
| 267 | 268 | len = p - filename; |
| 268 | 269 | if (len > sizeof(protocol) - 1) |
| 269 | 270 | len = sizeof(protocol) - 1; |
| ... | ... | @@ -289,23 +290,23 @@ static BlockDriver *find_image_format(const char *filename) |
| 289 | 290 | /* detect host devices. By convention, /dev/cdrom[N] is always |
| 290 | 291 | recognized as a host CDROM */ |
| 291 | 292 | if (strstart(filename, "/dev/cdrom", NULL)) |
| 292 | - return &bdrv_host_device; | |
| 293 | + return bdrv_find_format("host_device"); | |
| 293 | 294 | #ifdef _WIN32 |
| 294 | 295 | if (is_windows_drive(filename)) |
| 295 | - return &bdrv_host_device; | |
| 296 | + return bdrv_find_format("host_device"); | |
| 296 | 297 | #else |
| 297 | 298 | { |
| 298 | 299 | struct stat st; |
| 299 | 300 | if (stat(filename, &st) >= 0 && |
| 300 | 301 | (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode))) { |
| 301 | - return &bdrv_host_device; | |
| 302 | + return bdrv_find_format("host_device"); | |
| 302 | 303 | } |
| 303 | 304 | } |
| 304 | 305 | #endif |
| 305 | 306 | |
| 306 | 307 | drv = find_protocol(filename); |
| 307 | 308 | /* no need to test disk image formats for vvfat */ |
| 308 | - if (drv == &bdrv_vvfat) | |
| 309 | + if (strcmp(drv->format_name, "vvfat") == 0) | |
| 309 | 310 | return drv; |
| 310 | 311 | |
| 311 | 312 | ret = bdrv_file_open(&bs, filename, BDRV_O_RDONLY); |
| ... | ... | @@ -396,14 +397,14 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, |
| 396 | 397 | else |
| 397 | 398 | realpath(filename, backing_filename); |
| 398 | 399 | |
| 399 | - ret = bdrv_create2(&bdrv_qcow2, tmp_filename, | |
| 400 | + ret = bdrv_create2(bdrv_find_format("qcow2"), tmp_filename, | |
| 400 | 401 | total_size, backing_filename, |
| 401 | 402 | (drv ? drv->format_name : NULL), 0); |
| 402 | 403 | if (ret < 0) { |
| 403 | 404 | return ret; |
| 404 | 405 | } |
| 405 | 406 | filename = tmp_filename; |
| 406 | - drv = &bdrv_qcow2; | |
| 407 | + drv = bdrv_find_format("qcow2"); | |
| 407 | 408 | bs->is_temporary = 1; |
| 408 | 409 | } |
| 409 | 410 | |
| ... | ... | @@ -1494,21 +1495,7 @@ static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num, |
| 1494 | 1495 | |
| 1495 | 1496 | void bdrv_init(void) |
| 1496 | 1497 | { |
| 1497 | - bdrv_register(&bdrv_raw); | |
| 1498 | - bdrv_register(&bdrv_host_device); | |
| 1499 | -#ifndef _WIN32 | |
| 1500 | - bdrv_register(&bdrv_cow); | |
| 1501 | -#endif | |
| 1502 | - bdrv_register(&bdrv_qcow); | |
| 1503 | - bdrv_register(&bdrv_vmdk); | |
| 1504 | - bdrv_register(&bdrv_cloop); | |
| 1505 | - bdrv_register(&bdrv_dmg); | |
| 1506 | - bdrv_register(&bdrv_bochs); | |
| 1507 | - bdrv_register(&bdrv_vpc); | |
| 1508 | - bdrv_register(&bdrv_vvfat); | |
| 1509 | - bdrv_register(&bdrv_qcow2); | |
| 1510 | - bdrv_register(&bdrv_parallels); | |
| 1511 | - bdrv_register(&bdrv_nbd); | |
| 1498 | + module_call_init(MODULE_INIT_BLOCK); | |
| 1512 | 1499 | } |
| 1513 | 1500 | |
| 1514 | 1501 | void aio_pool_init(AIOPool *pool, int aiocb_size, | ... | ... |
block.h
| ... | ... | @@ -7,20 +7,6 @@ |
| 7 | 7 | /* block.c */ |
| 8 | 8 | typedef struct BlockDriver BlockDriver; |
| 9 | 9 | |
| 10 | -extern BlockDriver bdrv_raw; | |
| 11 | -extern BlockDriver bdrv_host_device; | |
| 12 | -extern BlockDriver bdrv_cow; | |
| 13 | -extern BlockDriver bdrv_qcow; | |
| 14 | -extern BlockDriver bdrv_vmdk; | |
| 15 | -extern BlockDriver bdrv_cloop; | |
| 16 | -extern BlockDriver bdrv_dmg; | |
| 17 | -extern BlockDriver bdrv_bochs; | |
| 18 | -extern BlockDriver bdrv_vpc; | |
| 19 | -extern BlockDriver bdrv_vvfat; | |
| 20 | -extern BlockDriver bdrv_qcow2; | |
| 21 | -extern BlockDriver bdrv_parallels; | |
| 22 | -extern BlockDriver bdrv_nbd; | |
| 23 | - | |
| 24 | 10 | typedef struct BlockDriverInfo { |
| 25 | 11 | /* in bytes, 0 if irrelevant */ |
| 26 | 12 | int cluster_size; |
| ... | ... | @@ -87,6 +73,8 @@ int64_t bdrv_getlength(BlockDriverState *bs); |
| 87 | 73 | void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr); |
| 88 | 74 | void bdrv_guess_geometry(BlockDriverState *bs, int *pcyls, int *pheads, int *psecs); |
| 89 | 75 | int bdrv_commit(BlockDriverState *bs); |
| 76 | +void bdrv_register(BlockDriver *bdrv); | |
| 77 | + | |
| 90 | 78 | /* async block I/O */ |
| 91 | 79 | typedef struct BlockDriverAIOCB BlockDriverAIOCB; |
| 92 | 80 | typedef void BlockDriverCompletionFunc(void *opaque, int ret); | ... | ... |
qemu-img.c
| ... | ... | @@ -542,11 +542,11 @@ static int img_convert(int argc, char **argv) |
| 542 | 542 | drv = bdrv_find_format(out_fmt); |
| 543 | 543 | if (!drv) |
| 544 | 544 | error("Unknown file format '%s'", out_fmt); |
| 545 | - if (flags & BLOCK_FLAG_COMPRESS && drv != &bdrv_qcow && drv != &bdrv_qcow2) | |
| 545 | + if (flags & BLOCK_FLAG_COMPRESS && strcmp(drv->format_name, "qcow") && strcmp(drv->format_name, "qcow2")) | |
| 546 | 546 | error("Compression not supported for this file format"); |
| 547 | - if (flags & BLOCK_FLAG_ENCRYPT && drv != &bdrv_qcow && drv != &bdrv_qcow2) | |
| 547 | + if (flags & BLOCK_FLAG_ENCRYPT && strcmp(drv->format_name, "qcow") && strcmp(drv->format_name, "qcow2")) | |
| 548 | 548 | error("Encryption not supported for this file format"); |
| 549 | - if (flags & BLOCK_FLAG_COMPAT6 && drv != &bdrv_vmdk) | |
| 549 | + if (flags & BLOCK_FLAG_COMPAT6 && strcmp(drv->format_name, "vmdk")) | |
| 550 | 550 | error("Alternative compatibility level not supported for this file format"); |
| 551 | 551 | if (flags & BLOCK_FLAG_ENCRYPT && flags & BLOCK_FLAG_COMPRESS) |
| 552 | 552 | error("Compression and encryption not supported at the same time"); |
| ... | ... | @@ -655,7 +655,7 @@ static int img_convert(int argc, char **argv) |
| 655 | 655 | if (n > bs_offset + bs_sectors - sector_num) |
| 656 | 656 | n = bs_offset + bs_sectors - sector_num; |
| 657 | 657 | |
| 658 | - if (drv != &bdrv_host_device) { | |
| 658 | + if (strcmp(drv->format_name, "host_device")) { | |
| 659 | 659 | if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset, |
| 660 | 660 | n, &n1)) { |
| 661 | 661 | sector_num += n1; |
| ... | ... | @@ -682,7 +682,7 @@ static int img_convert(int argc, char **argv) |
| 682 | 682 | If the output is to a host device, we also write out |
| 683 | 683 | sectors that are entirely 0, since whatever data was |
| 684 | 684 | already there is garbage, not 0s. */ |
| 685 | - if (drv == &bdrv_host_device || out_baseimg || | |
| 685 | + if (strcmp(drv->format_name, "host_device") == 0 || out_baseimg || | |
| 686 | 686 | is_allocated_sectors(buf1, n, &n1)) { |
| 687 | 687 | if (bdrv_write(out_bs, sector_num, buf1, n1) < 0) |
| 688 | 688 | error("error while writing"); | ... | ... |