scsi-disk: Switch to byte-based aio block access
Sector-based blk_aio_readv() and blk_aio_writev() should die; switch to byte-based blk_aio_preadv() and blk_aio_pwritev() instead. As part of the cleanup, scsi_init_iovec() no longer needs to return a value, and reword a comment. [ kwolf: Fix read accounting change ] Signed-off-by: Eric Blake <eblake@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
d4f510eb3f
commit
03c90063cc
@ -108,7 +108,7 @@ static void scsi_check_condition(SCSIDiskReq *r, SCSISense sense)
|
||||
scsi_req_complete(&r->req, CHECK_CONDITION);
|
||||
}
|
||||
|
||||
static uint32_t scsi_init_iovec(SCSIDiskReq *r, size_t size)
|
||||
static void scsi_init_iovec(SCSIDiskReq *r, size_t size)
|
||||
{
|
||||
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
|
||||
|
||||
@ -118,7 +118,6 @@ static uint32_t scsi_init_iovec(SCSIDiskReq *r, size_t size)
|
||||
}
|
||||
r->iov.iov_len = MIN(r->sector_count * 512, r->buflen);
|
||||
qemu_iovec_init_external(&r->qiov, &r->iov, 1);
|
||||
return r->qiov.size / 512;
|
||||
}
|
||||
|
||||
static void scsi_disk_save_request(QEMUFile *f, SCSIRequest *req)
|
||||
@ -316,7 +315,6 @@ done:
|
||||
static void scsi_do_read(SCSIDiskReq *r, int ret)
|
||||
{
|
||||
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
|
||||
uint32_t n;
|
||||
|
||||
assert (r->req.aiocb == NULL);
|
||||
|
||||
@ -340,11 +338,12 @@ static void scsi_do_read(SCSIDiskReq *r, int ret)
|
||||
r->req.aiocb = dma_blk_read(s->qdev.conf.blk, r->req.sg, r->sector,
|
||||
scsi_dma_complete, r);
|
||||
} else {
|
||||
n = scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
|
||||
scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
|
||||
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
|
||||
n * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
||||
r->req.aiocb = blk_aio_readv(s->qdev.conf.blk, r->sector, &r->qiov, n,
|
||||
scsi_read_complete, r);
|
||||
r->qiov.size, BLOCK_ACCT_READ);
|
||||
r->req.aiocb = blk_aio_preadv(s->qdev.conf.blk,
|
||||
r->sector << BDRV_SECTOR_BITS, &r->qiov,
|
||||
0, scsi_read_complete, r);
|
||||
}
|
||||
|
||||
done:
|
||||
@ -504,7 +503,6 @@ static void scsi_write_data(SCSIRequest *req)
|
||||
{
|
||||
SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
|
||||
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
|
||||
uint32_t n;
|
||||
|
||||
/* No data transfer may already be in progress */
|
||||
assert(r->req.aiocb == NULL);
|
||||
@ -544,11 +542,11 @@ static void scsi_write_data(SCSIRequest *req)
|
||||
r->req.aiocb = dma_blk_write(s->qdev.conf.blk, r->req.sg, r->sector,
|
||||
scsi_dma_complete, r);
|
||||
} else {
|
||||
n = r->qiov.size / 512;
|
||||
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
|
||||
n * BDRV_SECTOR_SIZE, BLOCK_ACCT_WRITE);
|
||||
r->req.aiocb = blk_aio_writev(s->qdev.conf.blk, r->sector, &r->qiov, n,
|
||||
scsi_write_complete, r);
|
||||
r->qiov.size, BLOCK_ACCT_WRITE);
|
||||
r->req.aiocb = blk_aio_pwritev(s->qdev.conf.blk,
|
||||
r->sector << BDRV_SECTOR_BITS, &r->qiov,
|
||||
0, scsi_write_complete, r);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1730,13 +1728,13 @@ static void scsi_write_same_complete(void *opaque, int ret)
|
||||
if (data->iov.iov_len) {
|
||||
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
|
||||
data->iov.iov_len, BLOCK_ACCT_WRITE);
|
||||
/* blk_aio_write doesn't like the qiov size being different from
|
||||
* nb_sectors, make sure they match.
|
||||
*/
|
||||
/* Reinitialize qiov, to handle unaligned WRITE SAME request
|
||||
* where final qiov may need smaller size */
|
||||
qemu_iovec_init_external(&data->qiov, &data->iov, 1);
|
||||
r->req.aiocb = blk_aio_writev(s->qdev.conf.blk, data->sector,
|
||||
&data->qiov, data->iov.iov_len / 512,
|
||||
scsi_write_same_complete, data);
|
||||
r->req.aiocb = blk_aio_pwritev(s->qdev.conf.blk,
|
||||
data->sector << BDRV_SECTOR_BITS,
|
||||
&data->qiov, 0,
|
||||
scsi_write_same_complete, data);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1803,9 +1801,10 @@ static void scsi_disk_emulate_write_same(SCSIDiskReq *r, uint8_t *inbuf)
|
||||
scsi_req_ref(&r->req);
|
||||
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
|
||||
data->iov.iov_len, BLOCK_ACCT_WRITE);
|
||||
r->req.aiocb = blk_aio_writev(s->qdev.conf.blk, data->sector,
|
||||
&data->qiov, data->iov.iov_len / 512,
|
||||
scsi_write_same_complete, data);
|
||||
r->req.aiocb = blk_aio_pwritev(s->qdev.conf.blk,
|
||||
data->sector << BDRV_SECTOR_BITS,
|
||||
&data->qiov, 0,
|
||||
scsi_write_same_complete, data);
|
||||
}
|
||||
|
||||
static void scsi_disk_emulate_write_data(SCSIRequest *req)
|
||||
|
Loading…
Reference in New Issue
Block a user