bdrv_file_open() is now nearly a subset of bdrv_open(), except for the fact that bdrv_file_open() is for protocols and bdrv_open() for block drivers. It is possible to use bdrv_file_open() with a block driver, but in that case that block driver must be explicitly specified.
Due to these great similarities, bdrv_file_open() can be integrated and made a special case of bdrv_open(). If the flag BDRV_O_PROTOCOL is specified, bdrv_open() will now do what bdrv_file_open() used to do: Auto-detecting a protocol instead of a block driver. This series implements this and changes all calls to bdrv_file_open() to bdrv_open() calls with BDRV_O_PROTOCOL specified. Note that this flag cannot be discerned automatically since it is impossible for bdrv_open() to know by itself whether a given file should be opened with or without the format layer involved: Both are valid alternatives. Therefore, it still has to be specified by the user. v2: - patch 1: - added appropriate assertions before every bdrv_open() and bdrv_open_image() call where the BDS should be NULL (i.e., where a new BDS should be created) and it is not obvious - don't initialize BDS pointers to NULL if that is necessary for a bdrv_open(); rather, set them to NULL directly before calling bdrv_open() in order to make the expected behavior of bdrv_open() (create a new BDS) more obvious - make bdrv_open_image() behave the same way as bdrv_open() in regard to BDS creation/reuse (completed in patch 8) - keep "options == NULL" check in bdrv_open() together with the block for setting "bs->options" - patch 2: - due to options now possibly being NULL in the reference handling block of bdrv_open(), the condition for "options_non_empty" has to be adjusted - contextual changes due to patch 1 - patch 3: - adjust comment for BDRV_O_PROTOCOL - contextual changes due to the previous patches - patch 4 (previously 5): - contextual changes due to the previous patches - patch 5 (previously 6): - bdrv_close() is unnecessary if the BDS could not be opened - patch 6: - melded together from previous patches 4, 7 and 8 - patch 7 (previously 9): - make the "options" parameter of bdrv_file_open() an indirect pointer; if bdrv_file_open() takes the reference, it will be set to NULL; otherwise, the caller is responsible for freeing the QDict - patch 8 (previously 10): - make bdrv_open_image() behave the same way as bdrv_open() in regard to BDS creation/reuse - contextual changes due to the previous patches Max Reitz (8): block: Change BDS parameter of bdrv_open() to ** block: Add reference parameter to bdrv_open() block: Make bdrv_file_open() static block: Reuse reference handling from bdrv_open() block: Remove bdrv_new() from bdrv_file_open() block: Handle bs->options in bdrv_open() only block: Reuse success path from bdrv_open() block: Remove bdrv_open_image()'s force_raw option block.c | 229 +++++++++++++++++++++++++------------------------- block/blkdebug.c | 3 +- block/blkverify.c | 6 +- block/cow.c | 6 +- block/qcow.c | 6 +- block/qcow2.c | 19 +++-- block/qed.c | 5 +- block/sheepdog.c | 8 +- block/vhdx.c | 5 +- block/vmdk.c | 17 ++-- block/vvfat.c | 6 +- blockdev.c | 22 +++-- hw/block/xen_disk.c | 4 +- include/block/block.h | 13 +-- qemu-img.c | 12 ++- qemu-io.c | 8 +- qemu-nbd.c | 2 +- 17 files changed, 194 insertions(+), 177 deletions(-) -- 1.8.5.4