diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2011-11-07 17:50:13 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2011-11-11 14:02:57 +0100 |
commit | 025ccaa7f9d2f54a79567599d3eb402100bed7a4 (patch) | |
tree | 0b58b5d0dc77702af6dbb4a85e035a9159ebc216 /blockdev.c | |
parent | 7704df98b09f886a9cf1d42aa6aa9a776ad1be3c (diff) | |
download | qemu-025ccaa7f9d2f54a79567599d3eb402100bed7a4.tar.gz qemu-025ccaa7f9d2f54a79567599d3eb402100bed7a4.tar.bz2 qemu-025ccaa7f9d2f54a79567599d3eb402100bed7a4.zip |
block: add eject request callback
Recent versions of udev always keep the tray locked so that the kernel
can observe "eject request" events (aka tray button presses) even on
discs that aren't mounted. Add support for these events in the ATAPI
and SCSI cd drive device models.
To let management cope with the behavior of udev, an event should also
be added for "tray opened/closed". This way, after issuing an "eject"
command, management can poll until the guests actually reacts to the
command. They can then issue the "change" command after the tray has been
opened, or try with "eject -f" after a (configurable?) timeout. However,
with this patch and the corresponding support in the device models,
at least it is possible to do a manual two-step eject+change sequence.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'blockdev.c')
-rw-r--r-- | blockdev.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/blockdev.c b/blockdev.c index 0827bf7743..222818690d 100644 --- a/blockdev.c +++ b/blockdev.c @@ -635,10 +635,12 @@ 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_dev_is_tray_open(bs) - && bdrv_dev_is_medium_locked(bs)) { - qerror_report(QERR_DEVICE_LOCKED, bdrv_get_device_name(bs)); - return -1; + if (bdrv_dev_is_medium_locked(bs) && !bdrv_dev_is_tray_open(bs)) { + bdrv_dev_eject_request(bs, force); + if (!force) { + qerror_report(QERR_DEVICE_LOCKED, bdrv_get_device_name(bs)); + return -1; + } } bdrv_close(bs); return 0; |