diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2012-07-02 17:04:40 +0200 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2012-07-26 17:44:08 +0200 |
commit | d2a9998f8864e6f816262d9416d8b538186a8cad (patch) | |
tree | 216564c5c003b72aeee73e772c7fad1655331356 /hw/lsi53c895a.c | |
parent | 2f0772c5b4818d4b2078be9dace0036d1030faee (diff) |
lsi: introduce lsi_request_free
Split the common bits of lsi_request_cancelled and lsi_command_complete
out to a new function.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'hw/lsi53c895a.c')
-rw-r--r-- | hw/lsi53c895a.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/hw/lsi53c895a.c b/hw/lsi53c895a.c index f04cc68280..078ab6d8ba 100644 --- a/hw/lsi53c895a.c +++ b/hw/lsi53c895a.c @@ -641,23 +641,24 @@ static lsi_request *lsi_find_by_tag(LSIState *s, uint32_t tag) return NULL; } +static void lsi_request_free(LSIState *s, lsi_request *p) +{ + if (p == s->current) { + s->current = NULL; + } else { + QTAILQ_REMOVE(&s->queue, p, next); + } + g_free(p); +} + static void lsi_request_cancelled(SCSIRequest *req) { LSIState *s = DO_UPCAST(LSIState, dev.qdev, req->bus->qbus.parent); lsi_request *p = req->hba_private; - if (s->current && req == s->current->req) { - scsi_req_unref(req); - g_free(s->current); - s->current = NULL; - return; - } - - if (p) { - QTAILQ_REMOVE(&s->queue, p, next); - scsi_req_unref(req); - g_free(p); - } + req->hba_private = NULL; + lsi_request_free(s, p); + scsi_req_unref(req); } /* Record that data is available for a queued command. Returns zero if @@ -706,9 +707,9 @@ static void lsi_command_complete(SCSIRequest *req, uint32_t status, size_t resid } if (s->current && req == s->current->req) { - scsi_req_unref(s->current->req); - g_free(s->current); - s->current = NULL; + req->hba_private = NULL; + lsi_request_free(s, s->current); + scsi_req_unref(req); } lsi_resume_script(s); } |