Revision ad2d30f7 hw/scsi-generic.c

b/hw/scsi-generic.c
74 74
    return DO_UPCAST(SCSIGenericReq, req, req);
75 75
}
76 76

  
77
static void scsi_remove_request(SCSIGenericReq *r)
77
static void scsi_free_request(SCSIRequest *req)
78 78
{
79
    SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
80

  
79 81
    qemu_free(r->buf);
80
    scsi_req_free(&r->req);
81 82
}
82 83

  
83 84
static SCSIGenericReq *scsi_find_request(SCSIGenericState *s, uint32_t tag)
......
113 114
            r, r->req.tag, r->req.status);
114 115

  
115 116
    scsi_req_complete(&r->req);
116
    scsi_remove_request(r);
117 117
}
118 118

  
119 119
/* Cancel a pending data transfer.  */
......
128 128
        if (r->req.aiocb)
129 129
            bdrv_aio_cancel(r->req.aiocb);
130 130
        r->req.aiocb = NULL;
131
        scsi_remove_request(r);
131
        scsi_req_dequeue(&r->req);
132 132
    }
133 133
}
134 134

  
......
323 323
    SCSIGenericReq *r;
324 324
    SCSIBus *bus;
325 325
    int ret;
326
    int32_t len;
326 327

  
327 328
    if (cmd[0] != REQUEST_SENSE &&
328 329
        (lun != s->lun || (cmd[1] >> 5) != s->lun)) {
......
351 352

  
352 353
    if (-1 == scsi_req_parse(&r->req, cmd)) {
353 354
        BADF("Unsupported command length, command %x\n", cmd[0]);
354
        scsi_remove_request(r);
355
        scsi_req_dequeue(&r->req);
356
        scsi_req_unref(&r->req);
355 357
        return 0;
356 358
    }
357 359
    scsi_req_fixup(&r->req);
......
377 379
        ret = execute_command(s->bs, r, SG_DXFER_NONE, scsi_command_complete);
378 380
        if (ret == -1) {
379 381
            scsi_command_complete(r, -EINVAL);
382
            scsi_req_unref(&r->req);
380 383
            return 0;
381 384
        }
385
        scsi_req_unref(&r->req);
382 386
        return 0;
383 387
    }
384 388

  
......
393 397
    r->len = r->req.cmd.xfer;
394 398
    if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
395 399
        r->len = 0;
396
        return -r->req.cmd.xfer;
400
        len = -r->req.cmd.xfer;
401
    } else {
402
        len = r->req.cmd.xfer;
397 403
    }
398 404

  
399
    return r->req.cmd.xfer;
405
    scsi_req_unref(&r->req);
406
    return len;
400 407
}
401 408

  
402 409
static int get_blocksize(BlockDriverState *bdrv)
......
469 476
        if (r->req.aiocb) {
470 477
            bdrv_aio_cancel(r->req.aiocb);
471 478
        }
472
        scsi_remove_request(r);
479
        scsi_req_dequeue(&r->req);
473 480
    }
474 481
}
475 482

  
......
561 568
    .qdev.reset   = scsi_generic_reset,
562 569
    .init         = scsi_generic_initfn,
563 570
    .destroy      = scsi_destroy,
571
    .free_req     = scsi_free_request,
564 572
    .send_command = scsi_send_command,
565 573
    .read_data    = scsi_read_data,
566 574
    .write_data   = scsi_write_data,

Also available in: Unified diff