There are some block drivers which are essential to QEMU and may not be removed: These are raw, file and qcow2 (as the default non-raw format). Make their BlockDriver objects public so they can be directly referenced throughout the block layer without needing to call bdrv_find_format() and having to deal with an error at runtime, while the real problem occured during linking (where raw, file or qcow2 were not linked into qemu).
Cc: qemu-sta...@nongnu.org Signed-off-by: Max Reitz <mre...@redhat.com> --- block/qcow2.c | 4 ++-- block/raw-posix.c | 4 ++-- block/raw-win32.c | 4 ++-- block/raw_bsd.c | 4 ++-- include/block/block_int.h | 8 ++++++++ 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index 8b9ffc4..0eeba36 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2847,7 +2847,7 @@ static QemuOptsList qcow2_create_opts = { } }; -static BlockDriver bdrv_qcow2 = { +BlockDriver *bdrv_qcow2 = &(BlockDriver){ .format_name = "qcow2", .instance_size = sizeof(BDRVQcowState), .bdrv_probe = qcow2_probe, @@ -2893,7 +2893,7 @@ static BlockDriver bdrv_qcow2 = { static void bdrv_qcow2_init(void) { - bdrv_register(&bdrv_qcow2); + bdrv_register(bdrv_qcow2); } block_init(bdrv_qcow2_init); diff --git a/block/raw-posix.c b/block/raw-posix.c index b1af77e..6766cec 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -1684,7 +1684,7 @@ static QemuOptsList raw_create_opts = { } }; -static BlockDriver bdrv_file = { +BlockDriver *bdrv_file = &(BlockDriver){ .format_name = "file", .protocol_name = "file", .instance_size = sizeof(BDRVRawState), @@ -2550,7 +2550,7 @@ static void bdrv_file_init(void) * Register all the drivers. Note that order is important, the driver * registered last will get probed first. */ - bdrv_register(&bdrv_file); + bdrv_register(bdrv_file); bdrv_register(&bdrv_host_device); #ifdef __linux__ bdrv_register(&bdrv_host_floppy); diff --git a/block/raw-win32.c b/block/raw-win32.c index 7b58881..96f097e 100644 --- a/block/raw-win32.c +++ b/block/raw-win32.c @@ -540,7 +540,7 @@ static QemuOptsList raw_create_opts = { } }; -static BlockDriver bdrv_file = { +BlockDriver *bdrv_file = &(BlockDriver){ .format_name = "file", .protocol_name = "file", .instance_size = sizeof(BDRVRawState), @@ -721,7 +721,7 @@ static BlockDriver bdrv_host_device = { static void bdrv_file_init(void) { - bdrv_register(&bdrv_file); + bdrv_register(bdrv_file); bdrv_register(&bdrv_host_device); } diff --git a/block/raw_bsd.c b/block/raw_bsd.c index 401b967..cdb019e 100644 --- a/block/raw_bsd.c +++ b/block/raw_bsd.c @@ -173,7 +173,7 @@ static int raw_probe(const uint8_t *buf, int buf_size, const char *filename) return 1; } -static BlockDriver bdrv_raw = { +BlockDriver *bdrv_raw = &(BlockDriver){ .format_name = "raw", .bdrv_probe = &raw_probe, .bdrv_reopen_prepare = &raw_reopen_prepare, @@ -202,7 +202,7 @@ static BlockDriver bdrv_raw = { static void bdrv_raw_init(void) { - bdrv_register(&bdrv_raw); + bdrv_register(bdrv_raw); } block_init(bdrv_raw_init); diff --git a/include/block/block_int.h b/include/block/block_int.h index a1c17b9..2ff3fc4 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -411,6 +411,14 @@ struct BlockDriverState { Error *backing_blocker; }; + +/* Essential block drivers which must always be statically linked into qemu, and + * which therefore can be accessed without using bdrv_find_format() */ +extern BlockDriver *bdrv_file; +extern BlockDriver *bdrv_raw; +extern BlockDriver *bdrv_qcow2; + + int get_tmp_filename(char *filename, int size); void bdrv_set_io_limits(BlockDriverState *bs, -- 1.9.3