Revision 4480de19

b/hw/scsi-disk.c
65 65
    uint32_t removable;
66 66
    bool media_changed;
67 67
    bool media_event;
68
    bool eject_request;
68 69
    QEMUBH *bh;
69 70
    char *version;
70 71
    char *serial;
......
671 672

  
672 673
    /* Event notification descriptor */
673 674
    event_code = MEC_NO_CHANGE;
674
    if (media_status != MS_TRAY_OPEN && s->media_event) {
675
        event_code = MEC_NEW_MEDIA;
676
        s->media_event = false;
675
    if (media_status != MS_TRAY_OPEN) {
676
        if (s->media_event) {
677
            event_code = MEC_NEW_MEDIA;
678
            s->media_event = false;
679
        } else if (s->eject_request) {
680
            event_code = MEC_EJECT_REQUESTED;
681
            s->eject_request = false;
682
        }
677 683
    }
678 684

  
679 685
    outbuf[0] = event_code;
......
1470 1476
    s->tray_open = !load;
1471 1477
    s->qdev.unit_attention = SENSE_CODE(UNIT_ATTENTION_NO_MEDIUM);
1472 1478
    s->media_event = true;
1479
    s->eject_request = false;
1480
}
1481

  
1482
static void scsi_cd_eject_request_cb(void *opaque, bool force)
1483
{
1484
    SCSIDiskState *s = opaque;
1485

  
1486
    s->eject_request = true;
1487
    if (force) {
1488
        s->tray_locked = false;
1489
    }
1473 1490
}
1474 1491

  
1475 1492
static bool scsi_cd_is_tray_open(void *opaque)
......
1484 1501

  
1485 1502
static const BlockDevOps scsi_cd_block_ops = {
1486 1503
    .change_media_cb = scsi_cd_change_media_cb,
1504
    .eject_request_cb = scsi_cd_eject_request_cb,
1487 1505
    .is_tray_open = scsi_cd_is_tray_open,
1488 1506
    .is_medium_locked = scsi_cd_is_medium_locked,
1489 1507
};

Also available in: Unified diff