Revision cac3c384

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