|
@@ -1849,7 +1849,7 @@ static void scsi_disk_emulate_write_same(SCSIDiskReq *r, uint8_t *inbuf)
|
|
|
uint32_t nb_sectors = scsi_data_cdb_xfer(r->req.cmd.buf);
|
|
|
WriteSameCBData *data;
|
|
|
uint8_t *buf;
|
|
|
- int i;
|
|
|
+ int i, l;
|
|
|
|
|
|
/* Fail if PBDATA=1 or LBDATA=1 or ANCHOR=1. */
|
|
|
if (nb_sectors == 0 || (req->cmd.buf[1] & 0x16)) {
|
|
@@ -1891,8 +1891,9 @@ static void scsi_disk_emulate_write_same(SCSIDiskReq *r, uint8_t *inbuf)
|
|
|
data->iov.iov_len);
|
|
|
qemu_iovec_init_external(&data->qiov, &data->iov, 1);
|
|
|
|
|
|
- for (i = 0; i < data->iov.iov_len; i += s->qdev.blocksize) {
|
|
|
- memcpy(&buf[i], inbuf, s->qdev.blocksize);
|
|
|
+ for (i = 0; i < data->iov.iov_len; i += l) {
|
|
|
+ l = MIN(s->qdev.blocksize, data->iov.iov_len - i);
|
|
|
+ memcpy(&buf[i], inbuf, l);
|
|
|
}
|
|
|
|
|
|
scsi_req_ref(&r->req);
|