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