Revision cac3c384 hw/scsi/scsi-bus.c
b/hw/scsi/scsi-bus.c | ||
---|---|---|
505 | 505 |
uint32_t tag, uint32_t lun, void *hba_private) |
506 | 506 |
{ |
507 | 507 |
SCSIRequest *req; |
508 |
SCSIBus *bus = scsi_bus_from_device(d); |
|
509 |
BusState *qbus = BUS(bus); |
|
508 | 510 |
|
509 | 511 |
req = g_malloc0(reqops->size); |
510 | 512 |
req->refcount = 1; |
511 |
req->bus = scsi_bus_from_device(d);
|
|
513 |
req->bus = bus;
|
|
512 | 514 |
req->dev = d; |
513 | 515 |
req->tag = tag; |
514 | 516 |
req->lun = lun; |
... | ... | |
516 | 518 |
req->status = -1; |
517 | 519 |
req->sense_len = 0; |
518 | 520 |
req->ops = reqops; |
521 |
object_ref(OBJECT(d)); |
|
522 |
object_ref(OBJECT(qbus->parent)); |
|
519 | 523 |
trace_scsi_req_alloc(req->dev->id, req->lun, req->tag); |
520 | 524 |
return req; |
521 | 525 |
} |
... | ... | |
1498 | 1502 |
{ |
1499 | 1503 |
assert(req->refcount > 0); |
1500 | 1504 |
if (--req->refcount == 0) { |
1501 |
SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, req->dev->qdev.parent_bus); |
|
1505 |
BusState *qbus = req->dev->qdev.parent_bus; |
|
1506 |
SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, qbus); |
|
1507 |
|
|
1502 | 1508 |
if (bus->info->free_request && req->hba_private) { |
1503 | 1509 |
bus->info->free_request(bus, req->hba_private); |
1504 | 1510 |
} |
1505 | 1511 |
if (req->ops->free_req) { |
1506 | 1512 |
req->ops->free_req(req); |
1507 | 1513 |
} |
1514 |
object_unref(OBJECT(req->dev)); |
|
1515 |
object_unref(OBJECT(qbus->parent)); |
|
1508 | 1516 |
g_free(req); |
1509 | 1517 |
} |
1510 | 1518 |
} |
Also available in: Unified diff