diff options
Diffstat (limited to 'hw')
-rw-r--r-- | hw/block/block.c | 12 | ||||
-rw-r--r-- | hw/block/virtio-blk.c | 1 | ||||
-rw-r--r-- | hw/core/qdev-properties.c | 13 | ||||
-rw-r--r-- | hw/ide/qdev.c | 1 | ||||
-rw-r--r-- | hw/scsi/scsi-disk.c | 1 |
5 files changed, 28 insertions, 0 deletions
diff --git a/hw/block/block.c b/hw/block/block.c index 396b0d5..8dc9d84 100644 --- a/hw/block/block.c +++ b/hw/block/block.c @@ -54,6 +54,7 @@ void blkconf_blocksizes(BlockConf *conf) void blkconf_apply_backend_options(BlockConf *conf) { BlockBackend *blk = conf->blk; + BlockdevOnError rerror, werror; bool wce; switch (conf->wce) { @@ -64,7 +65,18 @@ void blkconf_apply_backend_options(BlockConf *conf) abort(); } + rerror = conf->rerror; + if (rerror == BLOCKDEV_ON_ERROR_AUTO) { + rerror = blk_get_on_error(blk, true); + } + + werror = conf->werror; + if (werror == BLOCKDEV_ON_ERROR_AUTO) { + werror = blk_get_on_error(blk, false); + } + blk_set_enable_write_cache(blk, wce); + blk_set_on_error(blk, rerror, werror); } void blkconf_geometry(BlockConf *conf, int *ptrans, diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c index ecd8ea3..357ff90 100644 --- a/hw/block/virtio-blk.c +++ b/hw/block/virtio-blk.c @@ -960,6 +960,7 @@ static void virtio_blk_instance_init(Object *obj) static Property virtio_blk_properties[] = { DEFINE_BLOCK_PROPERTIES(VirtIOBlock, conf.conf), + DEFINE_BLOCK_ERROR_PROPERTIES(VirtIOBlock, conf.conf), DEFINE_BLOCK_CHS_PROPERTIES(VirtIOBlock, conf.conf), DEFINE_PROP_STRING("serial", VirtIOBlock, conf.serial), DEFINE_PROP_BIT("config-wce", VirtIOBlock, conf.config_wce, 0, true), diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c index 3c20c8e..14e544a 100644 --- a/hw/core/qdev-properties.c +++ b/hw/core/qdev-properties.c @@ -539,6 +539,19 @@ PropertyInfo qdev_prop_losttickpolicy = { .set = set_enum, }; +/* --- Block device error handling policy --- */ + +QEMU_BUILD_BUG_ON(sizeof(BlockdevOnError) != sizeof(int)); + +PropertyInfo qdev_prop_blockdev_on_error = { + .name = "BlockdevOnError", + .description = "Error handling policy, " + "report/ignore/enospc/stop/auto", + .enum_table = BlockdevOnError_lookup, + .get = get_enum, + .set = set_enum, +}; + /* --- BIOS CHS translation */ QEMU_BUILD_BUG_ON(sizeof(BiosAtaTranslation) != sizeof(int)); diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c index 33619f4..67c76bf 100644 --- a/hw/ide/qdev.c +++ b/hw/ide/qdev.c @@ -264,6 +264,7 @@ static int ide_drive_initfn(IDEDevice *dev) #define DEFINE_IDE_DEV_PROPERTIES() \ DEFINE_BLOCK_PROPERTIES(IDEDrive, dev.conf), \ + DEFINE_BLOCK_ERROR_PROPERTIES(IDEDrive, dev.conf), \ DEFINE_PROP_STRING("ver", IDEDrive, dev.version), \ DEFINE_PROP_UINT64("wwn", IDEDrive, dev.wwn, 0), \ DEFINE_PROP_STRING("serial", IDEDrive, dev.serial),\ diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index 8c26a4e..8dbfc10 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -2849,6 +2849,7 @@ static const TypeInfo scsi_disk_base_info = { #define DEFINE_SCSI_DISK_PROPERTIES() \ DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf), \ + DEFINE_BLOCK_ERROR_PROPERTIES(SCSIDiskState, qdev.conf), \ DEFINE_PROP_STRING("ver", SCSIDiskState, version), \ DEFINE_PROP_STRING("serial", SCSIDiskState, serial), \ DEFINE_PROP_STRING("vendor", SCSIDiskState, vendor), \ |