mirror of https://github.com/xemu-project/xemu.git
block: Leave enforcing tray lock to device models
The device model knows best when to accept the guest's eject command. No need to detour through the block layer. bdrv_eject() can't fail anymore. Make it void. Signed-off-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
81b1008d50
commit
fdec4404dd
7
block.c
7
block.c
|
@ -3051,18 +3051,13 @@ int bdrv_media_changed(BlockDriverState *bs)
|
||||||
/**
|
/**
|
||||||
* If eject_flag is TRUE, eject the media. Otherwise, close the tray
|
* If eject_flag is TRUE, eject the media. Otherwise, close the tray
|
||||||
*/
|
*/
|
||||||
int bdrv_eject(BlockDriverState *bs, int eject_flag)
|
void bdrv_eject(BlockDriverState *bs, int eject_flag)
|
||||||
{
|
{
|
||||||
BlockDriver *drv = bs->drv;
|
BlockDriver *drv = bs->drv;
|
||||||
|
|
||||||
if (eject_flag && bs->locked) {
|
|
||||||
return -EBUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (drv && drv->bdrv_eject) {
|
if (drv && drv->bdrv_eject) {
|
||||||
drv->bdrv_eject(bs, eject_flag);
|
drv->bdrv_eject(bs, eject_flag);
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int bdrv_is_locked(BlockDriverState *bs)
|
int bdrv_is_locked(BlockDriverState *bs)
|
||||||
|
|
2
block.h
2
block.h
|
@ -208,7 +208,7 @@ int bdrv_is_inserted(BlockDriverState *bs);
|
||||||
int bdrv_media_changed(BlockDriverState *bs);
|
int bdrv_media_changed(BlockDriverState *bs);
|
||||||
int bdrv_is_locked(BlockDriverState *bs);
|
int bdrv_is_locked(BlockDriverState *bs);
|
||||||
void bdrv_set_locked(BlockDriverState *bs, int locked);
|
void bdrv_set_locked(BlockDriverState *bs, int locked);
|
||||||
int bdrv_eject(BlockDriverState *bs, int eject_flag);
|
void bdrv_eject(BlockDriverState *bs, int eject_flag);
|
||||||
void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size);
|
void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size);
|
||||||
BlockDriverState *bdrv_find(const char *name);
|
BlockDriverState *bdrv_find(const char *name);
|
||||||
BlockDriverState *bdrv_next(BlockDriverState *bs);
|
BlockDriverState *bdrv_next(BlockDriverState *bs);
|
||||||
|
|
|
@ -905,33 +905,22 @@ static void cmd_seek(IDEState *s, uint8_t* buf)
|
||||||
|
|
||||||
static void cmd_start_stop_unit(IDEState *s, uint8_t* buf)
|
static void cmd_start_stop_unit(IDEState *s, uint8_t* buf)
|
||||||
{
|
{
|
||||||
int sense, err = 0;
|
int sense;
|
||||||
bool start = buf[4] & 1;
|
bool start = buf[4] & 1;
|
||||||
bool loej = buf[4] & 2; /* load on start, eject on !start */
|
bool loej = buf[4] & 2; /* load on start, eject on !start */
|
||||||
|
|
||||||
if (loej) {
|
if (loej) {
|
||||||
err = bdrv_eject(s->bs, !start);
|
if (!start && s->tray_locked) {
|
||||||
}
|
sense = bdrv_is_inserted(s->bs)
|
||||||
|
? SENSE_NOT_READY : SENSE_ILLEGAL_REQUEST;
|
||||||
switch (err) {
|
ide_atapi_cmd_error(s, sense, ASC_MEDIA_REMOVAL_PREVENTED);
|
||||||
case 0:
|
return;
|
||||||
ide_atapi_cmd_ok(s);
|
|
||||||
break;
|
|
||||||
case -EBUSY:
|
|
||||||
sense = SENSE_NOT_READY;
|
|
||||||
if (bdrv_is_inserted(s->bs)) {
|
|
||||||
sense = SENSE_ILLEGAL_REQUEST;
|
|
||||||
}
|
}
|
||||||
ide_atapi_cmd_error(s, sense, ASC_MEDIA_REMOVAL_PREVENTED);
|
bdrv_eject(s->bs, !start);
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ide_atapi_cmd_error(s, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (loej && !err) {
|
|
||||||
s->tray_open = !start;
|
s->tray_open = !start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ide_atapi_cmd_ok(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cmd_mechanism_status(IDEState *s, uint8_t* buf)
|
static void cmd_mechanism_status(IDEState *s, uint8_t* buf)
|
||||||
|
|
|
@ -830,6 +830,9 @@ static void scsi_disk_emulate_start_stop(SCSIDiskReq *r)
|
||||||
bool loej = req->cmd.buf[4] & 2; /* load on start, eject on !start */
|
bool loej = req->cmd.buf[4] & 2; /* load on start, eject on !start */
|
||||||
|
|
||||||
if (s->qdev.type == TYPE_ROM && loej) {
|
if (s->qdev.type == TYPE_ROM && loej) {
|
||||||
|
if (!start && s->tray_locked) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
bdrv_eject(s->bs, !start);
|
bdrv_eject(s->bs, !start);
|
||||||
s->tray_open = !start;
|
s->tray_open = !start;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue