On 12/10/2017 20:59, Eric Blake wrote: > We are gradually moving away from sector-based interfaces, towards > byte-based. Update the iscsi driver accordingly. In this case, > it is handy to teach iscsi_co_block_status() to handle a NULL map > and file parameter, even though the block layer passes non-NULL > values, because we also call the function directly. For now, there > are no optimizations done based on the want_zero flag. > > Signed-off-by: Eric Blake <ebl...@redhat.com> > > --- > v4: rebase to interface tweaks > v3: no change > v2: rebase to mapping parameter > --- > block/iscsi.c | 64 > +++++++++++++++++++++++++++++------------------------------ > 1 file changed, 32 insertions(+), 32 deletions(-) > > diff --git a/block/iscsi.c b/block/iscsi.c > index 4896d50d6e..cb30e9652c 100644 > --- a/block/iscsi.c > +++ b/block/iscsi.c > @@ -647,28 +647,31 @@ out_unlock: > > > > -static int64_t coroutine_fn iscsi_co_get_block_status(BlockDriverState *bs, > - int64_t sector_num, > - int nb_sectors, int *pnum, > - BlockDriverState **file) > +static int coroutine_fn iscsi_co_block_status(BlockDriverState *bs, > + bool want_zero, int64_t offset, > + int64_t bytes, int64_t *pnum, > + int64_t *map, > + BlockDriverState **file) > { > IscsiLun *iscsilun = bs->opaque; > struct scsi_get_lba_status *lbas = NULL; > struct scsi_lba_status_descriptor *lbasd = NULL; > struct IscsiTask iTask; > - int64_t ret; > + int ret; > > iscsi_co_init_iscsitask(iscsilun, &iTask); > > - if (!is_sector_request_lun_aligned(sector_num, nb_sectors, iscsilun)) { > + if (!is_byte_request_lun_aligned(offset, bytes, iscsilun)) { > ret = -EINVAL; > goto out; > } > > /* default to all sectors allocated */ > - ret = BDRV_BLOCK_DATA; > - ret |= (sector_num << BDRV_SECTOR_BITS) | BDRV_BLOCK_OFFSET_VALID; > - *pnum = nb_sectors; > + ret = BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID; > + if (map) { > + *map = offset; > + } > + *pnum = bytes; > > /* LUN does not support logical block provisioning */ > if (!iscsilun->lbpme) { > @@ -678,7 +681,7 @@ static int64_t coroutine_fn > iscsi_co_get_block_status(BlockDriverState *bs, > qemu_mutex_lock(&iscsilun->mutex); > retry: > if (iscsi_get_lba_status_task(iscsilun->iscsi, iscsilun->lun, > - sector_qemu2lun(sector_num, iscsilun), > + offset / iscsilun->block_size, > 8 + 16, iscsi_co_generic_cb, > &iTask) == NULL) { > ret = -ENOMEM; > @@ -717,12 +720,12 @@ retry: > > lbasd = &lbas->descriptors[0]; > > - if (sector_qemu2lun(sector_num, iscsilun) != lbasd->lba) { > + if (offset / iscsilun->block_size != lbasd->lba) { > ret = -EIO; > goto out_unlock; > } > > - *pnum = sector_lun2qemu(lbasd->num_blocks, iscsilun); > + *pnum = lbasd->num_blocks * iscsilun->block_size; > > if (lbasd->provisioning == SCSI_PROVISIONING_TYPE_DEALLOCATED || > lbasd->provisioning == SCSI_PROVISIONING_TYPE_ANCHORED) { > @@ -733,15 +736,13 @@ retry: > } > > if (ret & BDRV_BLOCK_ZERO) { > - iscsi_allocmap_set_unallocated(iscsilun, sector_num * > BDRV_SECTOR_SIZE, > - *pnum * BDRV_SECTOR_SIZE); > + iscsi_allocmap_set_unallocated(iscsilun, offset, *pnum); > } else { > - iscsi_allocmap_set_allocated(iscsilun, sector_num * BDRV_SECTOR_SIZE, > - *pnum * BDRV_SECTOR_SIZE); > + iscsi_allocmap_set_allocated(iscsilun, offset, *pnum); > } > > - if (*pnum > nb_sectors) { > - *pnum = nb_sectors; > + if (*pnum > bytes) { > + *pnum = bytes; > } > out_unlock: > qemu_mutex_unlock(&iscsilun->mutex); > @@ -749,7 +750,7 @@ out: > if (iTask.task != NULL) { > scsi_free_scsi_task(iTask.task); > } > - if (ret > 0 && ret & BDRV_BLOCK_OFFSET_VALID) { > + if (ret > 0 && ret & BDRV_BLOCK_OFFSET_VALID && file) { > *file = bs; > } > return ret; > @@ -788,25 +789,24 @@ static int coroutine_fn iscsi_co_readv(BlockDriverState > *bs, > nb_sectors * BDRV_SECTOR_SIZE) && > !iscsi_allocmap_is_allocated(iscsilun, sector_num * BDRV_SECTOR_SIZE, > nb_sectors * BDRV_SECTOR_SIZE)) { > - int pnum; > - BlockDriverState *file; > + int64_t pnum; > /* check the block status from the beginning of the cluster > * containing the start sector */ > - int cluster_sectors = iscsilun->cluster_size >> BDRV_SECTOR_BITS; > - int head; > - int64_t ret; > + int64_t head; > + int ret; > > - assert(cluster_sectors); > - head = sector_num % cluster_sectors; > - ret = iscsi_co_get_block_status(bs, sector_num - head, > - BDRV_REQUEST_MAX_SECTORS, &pnum, > - &file); > + assert(iscsilun->cluster_size); > + head = (sector_num * BDRV_SECTOR_SIZE) % iscsilun->cluster_size; > + ret = iscsi_co_block_status(bs, false, > + sector_num * BDRV_SECTOR_SIZE - head, > + BDRV_REQUEST_MAX_BYTES, &pnum, NULL, > NULL); > if (ret < 0) { > return ret; > } > /* if the whole request falls into an unallocated area we can avoid > * reading and directly return zeroes instead */ > - if (ret & BDRV_BLOCK_ZERO && pnum >= nb_sectors + head) { > + if (ret & BDRV_BLOCK_ZERO && > + pnum >= nb_sectors * BDRV_SECTOR_SIZE + head) { > qemu_iovec_memset(iov, 0, 0x00, iov->size); > return 0; > } > @@ -2192,7 +2192,7 @@ static BlockDriver bdrv_iscsi = { > .bdrv_truncate = iscsi_truncate, > .bdrv_refresh_limits = iscsi_refresh_limits, > > - .bdrv_co_get_block_status = iscsi_co_get_block_status, > + .bdrv_co_block_status = iscsi_co_block_status, > .bdrv_co_pdiscard = iscsi_co_pdiscard, > .bdrv_co_pwrite_zeroes = iscsi_co_pwrite_zeroes, > .bdrv_co_readv = iscsi_co_readv, > @@ -2227,7 +2227,7 @@ static BlockDriver bdrv_iser = { > .bdrv_truncate = iscsi_truncate, > .bdrv_refresh_limits = iscsi_refresh_limits, > > - .bdrv_co_get_block_status = iscsi_co_get_block_status, > + .bdrv_co_block_status = iscsi_co_block_status, > .bdrv_co_pdiscard = iscsi_co_pdiscard, > .bdrv_co_pwrite_zeroes = iscsi_co_pwrite_zeroes, > .bdrv_co_readv = iscsi_co_readv, >
Acked-by: Paolo Bonzini <pbonz...@redhat.com>