sheepdog: do not blindly memset all read buffers
Only buffers that map to unallocated blocks need to be zeroed. Signed-off-by: Christoph Hellwig <hch@lst.de> Acked-by: MORITA Kazutaka <morita.kazutaka@lab.ntt.co.jp> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
cddd4ac7a2
commit
19db9b9042
|
@ -1571,18 +1571,25 @@ static int coroutine_fn sd_co_rw_vector(void *p)
|
||||||
|
|
||||||
len = MIN(total - done, SD_DATA_OBJ_SIZE - offset);
|
len = MIN(total - done, SD_DATA_OBJ_SIZE - offset);
|
||||||
|
|
||||||
if (!inode->data_vdi_id[idx]) {
|
switch (acb->aiocb_type) {
|
||||||
if (acb->aiocb_type == AIOCB_READ_UDATA) {
|
case AIOCB_READ_UDATA:
|
||||||
|
if (!inode->data_vdi_id[idx]) {
|
||||||
|
qemu_iovec_memset(acb->qiov, done, 0, len);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
create = 1;
|
case AIOCB_WRITE_UDATA:
|
||||||
} else if (acb->aiocb_type == AIOCB_WRITE_UDATA
|
if (!inode->data_vdi_id[idx]) {
|
||||||
&& !is_data_obj_writable(inode, idx)) {
|
create = 1;
|
||||||
/* Copy-On-Write */
|
} else if (!is_data_obj_writable(inode, idx)) {
|
||||||
create = 1;
|
/* Copy-On-Write */
|
||||||
old_oid = oid;
|
create = 1;
|
||||||
flags = SD_FLAG_CMD_COW;
|
old_oid = oid;
|
||||||
|
flags = SD_FLAG_CMD_COW;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (create) {
|
if (create) {
|
||||||
|
@ -1668,20 +1675,12 @@ static coroutine_fn int sd_co_readv(BlockDriverState *bs, int64_t sector_num,
|
||||||
int nb_sectors, QEMUIOVector *qiov)
|
int nb_sectors, QEMUIOVector *qiov)
|
||||||
{
|
{
|
||||||
SheepdogAIOCB *acb;
|
SheepdogAIOCB *acb;
|
||||||
int i, ret;
|
int ret;
|
||||||
|
|
||||||
acb = sd_aio_setup(bs, qiov, sector_num, nb_sectors, NULL, NULL);
|
acb = sd_aio_setup(bs, qiov, sector_num, nb_sectors, NULL, NULL);
|
||||||
acb->aiocb_type = AIOCB_READ_UDATA;
|
acb->aiocb_type = AIOCB_READ_UDATA;
|
||||||
acb->aio_done_func = sd_finish_aiocb;
|
acb->aio_done_func = sd_finish_aiocb;
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO: we can do better; we don't need to initialize
|
|
||||||
* blindly.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < qiov->niov; i++) {
|
|
||||||
memset(qiov->iov[i].iov_base, 0, qiov->iov[i].iov_len);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = sd_co_rw_vector(acb);
|
ret = sd_co_rw_vector(acb);
|
||||||
if (ret <= 0) {
|
if (ret <= 0) {
|
||||||
qemu_aio_release(acb);
|
qemu_aio_release(acb);
|
||||||
|
|
Loading…
Reference in a new issue