Revision a1aff5bf

b/block.c
3026 3026
int bdrv_is_inserted(BlockDriverState *bs)
3027 3027
{
3028 3028
    BlockDriver *drv = bs->drv;
3029
    int ret;
3029

  
3030 3030
    if (!drv)
3031 3031
        return 0;
3032 3032
    if (!drv->bdrv_is_inserted)
3033
        return !bs->tray_open;
3034
    ret = drv->bdrv_is_inserted(bs);
3035
    return ret;
3033
        return 1;
3034
    return drv->bdrv_is_inserted(bs);
3036 3035
}
3037 3036

  
3038 3037
/**
b/hw/ide/atapi.c
73 73

  
74 74
static inline int media_present(IDEState *s)
75 75
{
76
    return (s->nb_sectors > 0);
76
    return !s->tray_open && s->nb_sectors > 0;
77 77
}
78 78

  
79 79
/* XXX: DVDs that could fit on a CD will be reported as a CD */
......
1077 1077
    [ 0x03 ] = { cmd_request_sense,                 ALLOW_UA },
1078 1078
    [ 0x12 ] = { cmd_inquiry,                       ALLOW_UA },
1079 1079
    [ 0x1a ] = { cmd_mode_sense, /* (6) */          0 },
1080
    [ 0x1b ] = { cmd_start_stop_unit,               0 },
1080
    [ 0x1b ] = { cmd_start_stop_unit,               0 }, /* [1] */
1081 1081
    [ 0x1e ] = { cmd_prevent_allow_medium_removal,  0 },
1082 1082
    [ 0x25 ] = { cmd_read_cdvd_capacity,            CHECK_READY },
1083
    [ 0x28 ] = { cmd_read, /* (10) */               0 },
1083
    [ 0x28 ] = { cmd_read, /* (10) */               CHECK_READY },
1084 1084
    [ 0x2b ] = { cmd_seek,                          CHECK_READY },
1085 1085
    [ 0x43 ] = { cmd_read_toc_pma_atip,             CHECK_READY },
1086 1086
    [ 0x46 ] = { cmd_get_configuration,             ALLOW_UA },
1087 1087
    [ 0x4a ] = { cmd_get_event_status_notification, ALLOW_UA },
1088 1088
    [ 0x5a ] = { cmd_mode_sense, /* (10) */         0 },
1089
    [ 0xa8 ] = { cmd_read, /* (12) */               0 },
1090
    [ 0xad ] = { cmd_read_dvd_structure,            0 },
1089
    [ 0xa8 ] = { cmd_read, /* (12) */               CHECK_READY },
1090
    [ 0xad ] = { cmd_read_dvd_structure,            CHECK_READY },
1091 1091
    [ 0xbb ] = { cmd_set_speed,                     0 },
1092 1092
    [ 0xbd ] = { cmd_mechanism_status,              0 },
1093
    [ 0xbe ] = { cmd_read_cd,                       0 },
1093
    [ 0xbe ] = { cmd_read_cd,                       CHECK_READY },
1094
    /* [1] handler detects and reports not ready condition itself */
1094 1095
};
1095 1096

  
1096 1097
void ide_atapi_cmd(IDEState *s)
......
1126 1127
     * GET_EVENT_STATUS_NOTIFICATION to detect such tray open/close
1127 1128
     * states rely on this behavior.
1128 1129
     */
1129
    if (bdrv_is_inserted(s->bs) && s->cdrom_changed) {
1130
    if (!s->tray_open && bdrv_is_inserted(s->bs) && s->cdrom_changed) {
1130 1131
        ide_atapi_cmd_error(s, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1131 1132

  
1132 1133
        s->cdrom_changed = 0;
b/hw/scsi-disk.c
183 183
    if (n > SCSI_DMA_BUF_SIZE / 512)
184 184
        n = SCSI_DMA_BUF_SIZE / 512;
185 185

  
186
    if (s->tray_open) {
187
        scsi_read_complete(r, -ENOMEDIUM);
188
    }
186 189
    r->iov.iov_len = n * 512;
187 190
    qemu_iovec_init_external(&r->qiov, &r->iov, 1);
188 191

  
......
281 284

  
282 285
    n = r->iov.iov_len / 512;
283 286
    if (n) {
287
        if (s->tray_open) {
288
            scsi_write_complete(r, -ENOMEDIUM);
289
        }
284 290
        qemu_iovec_init_external(&r->qiov, &r->iov, 1);
285 291

  
286 292
        bdrv_acct_start(s->bs, &r->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_WRITE);
......
837 843

  
838 844
    switch (req->cmd.buf[0]) {
839 845
    case TEST_UNIT_READY:
840
        if (!bdrv_is_inserted(s->bs))
846
        if (s->tray_open || !bdrv_is_inserted(s->bs))
841 847
            goto not_ready;
842 848
        break;
843 849
    case INQUIRY:
......
957 963
    return buflen;
958 964

  
959 965
not_ready:
960
    if (!bdrv_is_inserted(s->bs)) {
966
    if (s->tray_open || !bdrv_is_inserted(s->bs)) {
961 967
        scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
962 968
    } else {
963 969
        scsi_check_condition(r, SENSE_CODE(LUN_NOT_READY));

Also available in: Unified diff