block: Fix bdrv_has_zero_init
Assuming that any image on a block device is not properly zero-initialized is actually wrong: Only raw images have this problem. Any other image format shouldn't care about it, they initialize everything properly themselves. Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
bd0858bb46
commit
336c1c1255
6
block.c
6
block.c
@ -1477,10 +1477,8 @@ int bdrv_has_zero_init(BlockDriverState *bs)
|
|||||||
{
|
{
|
||||||
assert(bs->drv);
|
assert(bs->drv);
|
||||||
|
|
||||||
if (bs->drv->no_zero_init) {
|
if (bs->drv->bdrv_has_zero_init) {
|
||||||
return 0;
|
return bs->drv->bdrv_has_zero_init(bs);
|
||||||
} else if (bs->file) {
|
|
||||||
return bdrv_has_zero_init(bs->file);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -993,6 +993,11 @@ static int hdev_create(const char *filename, QEMUOptionParameter *options)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int hdev_has_zero_init(BlockDriverState *bs)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static BlockDriver bdrv_host_device = {
|
static BlockDriver bdrv_host_device = {
|
||||||
.format_name = "host_device",
|
.format_name = "host_device",
|
||||||
.protocol_name = "host_device",
|
.protocol_name = "host_device",
|
||||||
@ -1002,7 +1007,7 @@ static BlockDriver bdrv_host_device = {
|
|||||||
.bdrv_close = raw_close,
|
.bdrv_close = raw_close,
|
||||||
.bdrv_create = hdev_create,
|
.bdrv_create = hdev_create,
|
||||||
.create_options = raw_create_options,
|
.create_options = raw_create_options,
|
||||||
.no_zero_init = 1,
|
.bdrv_has_zero_init = hdev_has_zero_init,
|
||||||
.bdrv_flush = raw_flush,
|
.bdrv_flush = raw_flush,
|
||||||
|
|
||||||
.bdrv_aio_readv = raw_aio_readv,
|
.bdrv_aio_readv = raw_aio_readv,
|
||||||
@ -1117,7 +1122,7 @@ static BlockDriver bdrv_host_floppy = {
|
|||||||
.bdrv_close = raw_close,
|
.bdrv_close = raw_close,
|
||||||
.bdrv_create = hdev_create,
|
.bdrv_create = hdev_create,
|
||||||
.create_options = raw_create_options,
|
.create_options = raw_create_options,
|
||||||
.no_zero_init = 1,
|
.bdrv_has_zero_init = hdev_has_zero_init,
|
||||||
.bdrv_flush = raw_flush,
|
.bdrv_flush = raw_flush,
|
||||||
|
|
||||||
.bdrv_aio_readv = raw_aio_readv,
|
.bdrv_aio_readv = raw_aio_readv,
|
||||||
@ -1217,7 +1222,7 @@ static BlockDriver bdrv_host_cdrom = {
|
|||||||
.bdrv_close = raw_close,
|
.bdrv_close = raw_close,
|
||||||
.bdrv_create = hdev_create,
|
.bdrv_create = hdev_create,
|
||||||
.create_options = raw_create_options,
|
.create_options = raw_create_options,
|
||||||
.no_zero_init = 1,
|
.bdrv_has_zero_init = hdev_has_zero_init,
|
||||||
.bdrv_flush = raw_flush,
|
.bdrv_flush = raw_flush,
|
||||||
|
|
||||||
.bdrv_aio_readv = raw_aio_readv,
|
.bdrv_aio_readv = raw_aio_readv,
|
||||||
@ -1340,7 +1345,7 @@ static BlockDriver bdrv_host_cdrom = {
|
|||||||
.bdrv_close = raw_close,
|
.bdrv_close = raw_close,
|
||||||
.bdrv_create = hdev_create,
|
.bdrv_create = hdev_create,
|
||||||
.create_options = raw_create_options,
|
.create_options = raw_create_options,
|
||||||
.no_zero_init = 1,
|
.bdrv_has_zero_init = hdev_has_zero_init,
|
||||||
.bdrv_flush = raw_flush,
|
.bdrv_flush = raw_flush,
|
||||||
|
|
||||||
.bdrv_aio_readv = raw_aio_readv,
|
.bdrv_aio_readv = raw_aio_readv,
|
||||||
|
@ -394,6 +394,11 @@ static int raw_set_locked(BlockDriverState *bs, int locked)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int hdev_has_zero_init(BlockDriverState *bs)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static BlockDriver bdrv_host_device = {
|
static BlockDriver bdrv_host_device = {
|
||||||
.format_name = "host_device",
|
.format_name = "host_device",
|
||||||
.protocol_name = "host_device",
|
.protocol_name = "host_device",
|
||||||
@ -402,6 +407,7 @@ static BlockDriver bdrv_host_device = {
|
|||||||
.bdrv_file_open = hdev_open,
|
.bdrv_file_open = hdev_open,
|
||||||
.bdrv_close = raw_close,
|
.bdrv_close = raw_close,
|
||||||
.bdrv_flush = raw_flush,
|
.bdrv_flush = raw_flush,
|
||||||
|
.bdrv_has_zero_init = hdev_has_zero_init,
|
||||||
|
|
||||||
.bdrv_read = raw_read,
|
.bdrv_read = raw_read,
|
||||||
.bdrv_write = raw_write,
|
.bdrv_write = raw_write,
|
||||||
|
@ -237,6 +237,11 @@ static QEMUOptionParameter raw_create_options[] = {
|
|||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int raw_has_zero_init(BlockDriverState *bs)
|
||||||
|
{
|
||||||
|
return bdrv_has_zero_init(bs->file);
|
||||||
|
}
|
||||||
|
|
||||||
static BlockDriver bdrv_raw = {
|
static BlockDriver bdrv_raw = {
|
||||||
.format_name = "raw",
|
.format_name = "raw",
|
||||||
|
|
||||||
@ -264,6 +269,7 @@ static BlockDriver bdrv_raw = {
|
|||||||
|
|
||||||
.bdrv_create = raw_create,
|
.bdrv_create = raw_create,
|
||||||
.create_options = raw_create_options,
|
.create_options = raw_create_options,
|
||||||
|
.bdrv_has_zero_init = raw_has_zero_init,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void bdrv_raw_init(void)
|
static void bdrv_raw_init(void)
|
||||||
|
@ -127,8 +127,11 @@ struct BlockDriver {
|
|||||||
|
|
||||||
void (*bdrv_debug_event)(BlockDriverState *bs, BlkDebugEvent event);
|
void (*bdrv_debug_event)(BlockDriverState *bs, BlkDebugEvent event);
|
||||||
|
|
||||||
/* Set if newly created images are not guaranteed to contain only zeros */
|
/*
|
||||||
int no_zero_init;
|
* Returns 1 if newly created images are guaranteed to contain only
|
||||||
|
* zeros, 0 otherwise.
|
||||||
|
*/
|
||||||
|
int (*bdrv_has_zero_init)(BlockDriverState *bs);
|
||||||
|
|
||||||
QLIST_ENTRY(BlockDriver) list;
|
QLIST_ENTRY(BlockDriver) list;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user