Revision ad2d30f7 hw/scsi-disk.c

b/hw/scsi-disk.c
98 98
    return r;
99 99
}
100 100

  
101
static void scsi_remove_request(SCSIDiskReq *r)
101
static void scsi_free_request(SCSIRequest *req)
102 102
{
103
    SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
104

  
103 105
    qemu_vfree(r->iov.iov_base);
104
    scsi_req_free(&r->req);
105 106
}
106 107

  
107 108
static SCSIDiskReq *scsi_find_request(SCSIDiskState *s, uint32_t tag)
......
134 135
            r->req.tag, status, sense);
135 136
    scsi_req_set_status(r, status, sense);
136 137
    scsi_req_complete(&r->req);
137
    scsi_remove_request(r);
138 138
}
139 139

  
140 140
/* Cancel a pending data transfer.  */
......
148 148
        if (r->req.aiocb)
149 149
            bdrv_aio_cancel(r->req.aiocb);
150 150
        r->req.aiocb = NULL;
151
        scsi_remove_request(r);
151
        scsi_req_dequeue(&r->req);
152 152
    }
153 153
}
154 154

  
......
1033 1033
                                 uint8_t *buf, int lun)
1034 1034
{
1035 1035
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
1036
    uint32_t len;
1036
    int32_t len;
1037 1037
    int is_write;
1038 1038
    uint8_t command;
1039 1039
    uint8_t *outbuf;
......
1095 1095
    case REZERO_UNIT:
1096 1096
        rc = scsi_disk_emulate_command(r, outbuf);
1097 1097
        if (rc < 0) {
1098
            scsi_req_unref(&r->req);
1098 1099
            return 0;
1099 1100
        }
1100 1101

  
......
1181 1182
        DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]);
1182 1183
    fail:
1183 1184
        scsi_command_complete(r, CHECK_CONDITION, ILLEGAL_REQUEST);
1185
        scsi_req_unref(&r->req);
1184 1186
        return 0;
1185 1187
    illegal_lba:
1186 1188
        scsi_command_complete(r, CHECK_CONDITION, HARDWARE_ERROR);
1189
        scsi_req_unref(&r->req);
1187 1190
        return 0;
1188 1191
    }
1189 1192
    if (r->sector_count == 0 && r->iov.iov_len == 0) {
......
1191 1194
    }
1192 1195
    len = r->sector_count * 512 + r->iov.iov_len;
1193 1196
    if (is_write) {
1194
        return -len;
1197
        len = -len;
1195 1198
    } else {
1196 1199
        if (!r->sector_count)
1197 1200
            r->sector_count = -1;
1198
        return len;
1199 1201
    }
1202
    scsi_req_unref(&r->req);
1203
    return len;
1200 1204
}
1201 1205

  
1202 1206
static void scsi_disk_purge_requests(SCSIDiskState *s)
......
1208 1212
        if (r->req.aiocb) {
1209 1213
            bdrv_aio_cancel(r->req.aiocb);
1210 1214
        }
1211
        scsi_remove_request(r);
1215
        scsi_req_dequeue(&r->req);
1212 1216
    }
1213 1217
}
1214 1218

  
......
1321 1325
        .qdev.reset   = scsi_disk_reset,
1322 1326
        .init         = scsi_hd_initfn,
1323 1327
        .destroy      = scsi_destroy,
1328
        .free_req     = scsi_free_request,
1324 1329
        .send_command = scsi_send_command,
1325 1330
        .read_data    = scsi_read_data,
1326 1331
        .write_data   = scsi_write_data,
......
1339 1344
        .qdev.reset   = scsi_disk_reset,
1340 1345
        .init         = scsi_cd_initfn,
1341 1346
        .destroy      = scsi_destroy,
1347
        .free_req     = scsi_free_request,
1342 1348
        .send_command = scsi_send_command,
1343 1349
        .read_data    = scsi_read_data,
1344 1350
        .write_data   = scsi_write_data,
......
1356 1362
        .qdev.reset   = scsi_disk_reset,
1357 1363
        .init         = scsi_disk_initfn,
1358 1364
        .destroy      = scsi_destroy,
1365
        .free_req     = scsi_free_request,
1359 1366
        .send_command = scsi_send_command,
1360 1367
        .read_data    = scsi_read_data,
1361 1368
        .write_data   = scsi_write_data,

Also available in: Unified diff