From 9bb10e850585fa24bb0763e4aaed98008e0c134e Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Tue, 4 Oct 2011 16:24:42 +0200 Subject: [PATCH 67/76] block: Drop medium lock tracking, ask device models instead RH-Author: Markus Armbruster Message-id: <1317745491-18401-60-git-send-email-armbru@redhat.com> Patchwork-id: 33641 O-Subject: [PATCH RHEL-6.2 qemu-kvm 59/68] block: Drop medium lock tracking, ask device models instead Bugzilla: 742458 RH-Acked-by: Paolo Bonzini RH-Acked-by: Amit Shah RH-Acked-by: Juan Quintela Requires new BlockDevOps member is_medium_locked(). Implement for IDE and SCSI CD-ROMs. Signed-off-by: Markus Armbruster Signed-off-by: Kevin Wolf (cherry picked from commit f107639a6ff0c8d02f6a2dfdfce3a9d9f1e2eb27) --- block.c | 16 +++++++++------- block.h | 7 ++++++- block_int.h | 1 - blockdev.c | 2 +- hw/ide/core.c | 6 ++++++ hw/scsi-disk.c | 10 ++++++++++ 6 files changed, 32 insertions(+), 10 deletions(-) Signed-off-by: Michal Novotny --- block.c | 16 +++++++++------- block.h | 7 ++++++- block_int.h | 1 - blockdev.c | 2 +- hw/ide/core.c | 6 ++++++ hw/scsi-disk.c | 10 ++++++++++ 6 files changed, 32 insertions(+), 10 deletions(-) diff --git a/block.c b/block.c index 9de3600..0be001e 100644 --- a/block.c +++ b/block.c @@ -754,6 +754,14 @@ static void bdrv_dev_resize_cb(BlockDriverState *bs) } } +bool bdrv_dev_is_medium_locked(BlockDriverState *bs) +{ + if (bs->dev_ops && bs->dev_ops->is_medium_locked) { + return bs->dev_ops->is_medium_locked(bs->dev_opaque); + } + return false; +} + /* * Run consistency checks on an image * @@ -1667,7 +1675,7 @@ void bdrv_info(Monitor *mon, QObject **ret_data) bs_obj = qobject_from_jsonf("{ 'device': %s, 'type': 'unknown', " "'removable': %i, 'locked': %i }", bs->device_name, bs->removable, - bs->locked); + bdrv_dev_is_medium_locked(bs)); if (bs->drv) { QObject *obj; @@ -2641,11 +2649,6 @@ void bdrv_eject(BlockDriverState *bs, int eject_flag) } } -int bdrv_is_locked(BlockDriverState *bs) -{ - return bs->locked; -} - /** * Lock or unlock the media (if it is locked, the user won't be able * to eject it manually). @@ -2656,7 +2659,6 @@ void bdrv_set_locked(BlockDriverState *bs, int locked) trace_bdrv_set_locked(bs, locked); - bs->locked = locked; if (drv && drv->bdrv_set_locked) { drv->bdrv_set_locked(bs, locked); } diff --git a/block.h b/block.h index cfce2d3..8427421 100644 --- a/block.h +++ b/block.h @@ -34,6 +34,11 @@ typedef struct BlockDevOps { */ void (*change_media_cb)(void *opaque); /* + * Is the virtual medium locked into the device? + * Device models implement this only when device has such a lock. + */ + bool (*is_medium_locked)(void *opaque); + /* * Runs when the size changed (e.g. monitor command block_resize) */ void (*resize_cb)(void *opaque); @@ -97,6 +102,7 @@ void bdrv_detach_dev(BlockDriverState *bs, void *dev); void *bdrv_get_attached_dev(BlockDriverState *bs); void bdrv_set_dev_ops(BlockDriverState *bs, const BlockDevOps *ops, void *opaque); +bool bdrv_dev_is_medium_locked(BlockDriverState *bs); int bdrv_read(BlockDriverState *bs, int64_t sector_num, uint8_t *buf, int nb_sectors); int bdrv_write(BlockDriverState *bs, int64_t sector_num, @@ -205,7 +211,6 @@ int bdrv_is_sg(BlockDriverState *bs); int bdrv_enable_write_cache(BlockDriverState *bs); int bdrv_is_inserted(BlockDriverState *bs); int bdrv_media_changed(BlockDriverState *bs); -int bdrv_is_locked(BlockDriverState *bs); void bdrv_set_locked(BlockDriverState *bs, int locked); void bdrv_eject(BlockDriverState *bs, int eject_flag); void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size); diff --git a/block_int.h b/block_int.h index 880d6fa..2b43fb9 100644 --- a/block_int.h +++ b/block_int.h @@ -148,7 +148,6 @@ struct BlockDriverState { int keep_read_only; /* if true, the media was requested to stay read only */ int open_flags; /* flags used to open the file, re-used for re-open */ int removable; /* if true, the media can be removed */ - int locked; /* if true, the media cannot temporarily be ejected */ int encrypted; /* if true, the media is encrypted */ int valid_key; /* if true, a valid encryption key has been set */ int sg; /* if true, the device is a /dev/sg* */ diff --git a/blockdev.c b/blockdev.c index 4c0e24e..cb2b0b6 100644 --- a/blockdev.c +++ b/blockdev.c @@ -915,7 +915,7 @@ static int eject_device(Monitor *mon, BlockDriverState *bs, int force) qerror_report(QERR_DEVICE_NOT_REMOVABLE, bdrv_get_device_name(bs)); return -1; } - if (!force && bdrv_is_locked(bs)) { + if (!force && bdrv_dev_is_medium_locked(bs)) { qerror_report(QERR_DEVICE_LOCKED, bdrv_get_device_name(bs)); return -1; } diff --git a/hw/ide/core.c b/hw/ide/core.c index c880cd9..6c6c677 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -1806,8 +1806,14 @@ void ide_bus_reset(IDEBus *bus) ide_clear_hob(bus); } +static bool ide_cd_is_medium_locked(void *opaque) +{ + return ((IDEState *)opaque)->tray_locked; +} + static const BlockDevOps ide_cd_block_ops = { .change_media_cb = ide_cd_change_cb, + .is_medium_locked = ide_cd_is_medium_locked, }; int ide_init_drive(IDEState *s, BlockDriverState *bs, const char *version) diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c index 59f62dc..3aa0e4c 100644 --- a/hw/scsi-disk.c +++ b/hw/scsi-disk.c @@ -1188,6 +1188,15 @@ static void scsi_destroy(SCSIDevice *dev) blockdev_mark_auto_del(s->qdev.conf.bs); } +static bool scsi_cd_is_medium_locked(void *opaque) +{ + return ((SCSIDiskState *)opaque)->tray_locked; +} + +static const BlockDevOps scsi_cd_block_ops = { + .is_medium_locked = scsi_cd_is_medium_locked, +}; + static int scsi_initfn(SCSIDevice *dev, uint8_t scsi_type) { SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev); @@ -1227,6 +1236,7 @@ static int scsi_initfn(SCSIDevice *dev, uint8_t scsi_type) } if (scsi_type == TYPE_ROM) { + bdrv_set_dev_ops(s->bs, &scsi_cd_block_ops, s); s->qdev.blocksize = 2048; } else if (scsi_type == TYPE_DISK) { s->qdev.blocksize = s->qdev.conf.logical_block_size; -- 1.7.4.4