Revision 0a4ac106 hw/scsi-disk.c

b/hw/scsi-disk.c
129 129
    scsi_req_data(&r->req, r->iov.iov_len);
130 130
}
131 131

  
132
static void scsi_flush_complete(void * opaque, int ret)
133
{
134
    SCSIDiskReq *r = (SCSIDiskReq *)opaque;
135
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
136

  
137
    if (r->req.aiocb != NULL) {
138
        r->req.aiocb = NULL;
139
        bdrv_acct_done(s->bs, &r->acct);
140
    }
141

  
142
    if (ret < 0) {
143
        if (scsi_handle_rw_error(r, -ret, SCSI_REQ_STATUS_RETRY_FLUSH)) {
144
            return;
145
        }
146
    }
147

  
148
    scsi_req_complete(&r->req, GOOD);
149
}
132 150

  
133 151
/* Read more data from scsi device into buffer.  */
134 152
static void scsi_read_data(SCSIRequest *req)
......
792 810
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
793 811
    uint64_t nb_sectors;
794 812
    int buflen = 0;
795
    int ret;
796 813

  
797 814
    switch (req->cmd.buf[0]) {
798 815
    case TEST_UNIT_READY:
......
864 881
        outbuf[7] = 0;
865 882
        buflen = 8;
866 883
        break;
867
    case SYNCHRONIZE_CACHE:
868
    {
869
        BlockAcctCookie acct;
870

  
871
        bdrv_acct_start(s->bs, &acct, 0, BDRV_ACCT_FLUSH);
872
        ret = bdrv_flush(s->bs);
873
        bdrv_acct_done(s->bs, &acct);
874
        if (ret < 0) {
875
            if (scsi_handle_rw_error(r, -ret, SCSI_REQ_STATUS_RETRY_FLUSH)) {
876
                return -1;
877
            }
878
        }
879
        break;
880
    }
881 884
    case GET_CONFIGURATION:
882 885
        memset(outbuf, 0, 8);
883 886
        /* ??? This should probably return much more information.  For now
......
985 988
    case START_STOP:
986 989
    case ALLOW_MEDIUM_REMOVAL:
987 990
    case READ_CAPACITY_10:
988
    case SYNCHRONIZE_CACHE:
989 991
    case READ_TOC:
990 992
    case GET_CONFIGURATION:
991 993
    case SERVICE_ACTION_IN:
......
997 999

  
998 1000
        r->iov.iov_len = rc;
999 1001
        break;
1002
    case SYNCHRONIZE_CACHE:
1003
        bdrv_acct_start(s->bs, &r->acct, 0, BDRV_ACCT_FLUSH);
1004
        r->req.aiocb = bdrv_aio_flush(s->bs, scsi_flush_complete, r);
1005
        if (r->req.aiocb == NULL) {
1006
            scsi_flush_complete(r, -EIO);
1007
        }
1008
        return 0;
1000 1009
    case READ_6:
1001 1010
    case READ_10:
1002 1011
    case READ_12:

Also available in: Unified diff