From: Paolo Bonzini <pbonzini@redhat.com>
To: Peter Lieven <pl@kamp.de>
Cc: Kevin Wolf <kwolf@redhat.com>,
ronniesahlberg@gmail.com, qemu-devel@nongnu.org,
Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 2/8] iscsi: add bdrv_co_is_allocated
Date: Mon, 24 Jun 2013 16:36:35 +0200 [thread overview]
Message-ID: <51C85973.9040107@redhat.com> (raw)
In-Reply-To: <1371934712-11714-3-git-send-email-pl@kamp.de>
Il 22/06/2013 22:58, Peter Lieven ha scritto:
> Signed-off-by: Peter Lieven <pl@kamp.de>
> ---
> block/iscsi.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 103 insertions(+)
>
> diff --git a/block/iscsi.c b/block/iscsi.c
> index a38a1bf..98be71e 100644
> --- a/block/iscsi.c
> +++ b/block/iscsi.c
> @@ -56,6 +56,15 @@ typedef struct IscsiLun {
> uint8_t lbpws10;
> } IscsiLun;
>
> +typedef struct IscsiTask {
> + IscsiLun *iscsilun;
> + BlockDriverState *bs;
> + int status;
> + int complete;
> + Coroutine *co;
> + struct scsi_lba_status_descriptor lbasd;
> +} IscsiTask;
> +
> typedef struct IscsiAIOCB {
> BlockDriverAIOCB common;
> QEMUIOVector *qiov;
> @@ -805,6 +814,98 @@ iscsi_getlength(BlockDriverState *bs)
> return len;
> }
>
> +static void
> +iscsi_co_is_allocated_cb(struct iscsi_context *iscsi, int status,
> + void *command_data, void *opaque)
> +{
> + struct IscsiTask *iTask = opaque;
> + struct scsi_task *task = command_data;
> + struct scsi_get_lba_status *lbas = NULL;
> +
> + iTask->complete = 1;
> +
> + if (status != 0) {
> + error_report("iSCSI: Failed to get_lba_status on iSCSI lun. %s",
> + iscsi_get_error(iscsi));
> + iTask->status = 1;
> + goto out;
> + }
> +
> + lbas = scsi_datain_unmarshall(task);
> + if (lbas == NULL) {
> + iTask->status = 1;
> + goto out;
> + }
> +
> + memcpy(&iTask->lbasd, &lbas->descriptors[0],
> + sizeof(struct scsi_lba_status_descriptor));
> +
> + iTask->status = 0;
> +
> +out:
> + scsi_free_scsi_task(task);
> +
> + if (iTask->co) {
> + qemu_coroutine_enter(iTask->co, NULL);
> + }
> +}
> +
> +static int coroutine_fn iscsi_co_is_allocated(BlockDriverState *bs,
> + int64_t sector_num,
> + int nb_sectors, int *pnum)
> +{
> + IscsiLun *iscsilun = bs->opaque;
> + struct IscsiTask iTask;
> + int ret;
> +
> + *pnum = nb_sectors;
> +
> + if (iscsilun->lbpme == 0) {
> + return 1;
> + }
> +
> + iTask.iscsilun = iscsilun;
> + iTask.status = 0;
> + iTask.complete = 0;
> + iTask.bs = bs;
> +
> + if (iscsi_get_lba_status_task(iscsilun->iscsi, iscsilun->lun,
> + sector_qemu2lun(sector_num, iscsilun),
> + 8 + 16, iscsi_co_is_allocated_cb,
> + &iTask) == NULL) {
> + *pnum = 0;
> + return 0;
> + }
> +
> + while (!iTask.complete) {
> + iscsi_set_events(iscsilun);
> + iTask.co = qemu_coroutine_self();
> + qemu_coroutine_yield();
> + }
> +
> + if (iTask.status != 0) {
> + /* in case the get_lba_status_callout fails (i.e.
> + * because the device is busy or the cmd is not
> + * supported) we pretend all blocks are allocated
> + * for backwards compatiblity */
> + return 1;
> + }
> +
> + if (sector_qemu2lun(sector_num, iscsilun) != iTask.lbasd.lba) {
> + *pnum = 0;
> + return 0;
> + }
> +
> + *pnum = iTask.lbasd.num_blocks * (iscsilun->block_size / BDRV_SECTOR_SIZE);
> + if (*pnum > nb_sectors) {
> + *pnum = nb_sectors;
> + }
> +
> + return (iTask.lbasd.provisioning == SCSI_PROVISIONING_TYPE_MAPPED) ? 1 : 0;
> +
> + return ret;
> +}
> +
> static int parse_chap(struct iscsi_context *iscsi, const char *target)
> {
> QemuOptsList *list;
> @@ -1315,6 +1416,8 @@ static BlockDriver bdrv_iscsi = {
> .bdrv_getlength = iscsi_getlength,
> .bdrv_truncate = iscsi_truncate,
>
> + .bdrv_co_is_allocated = iscsi_co_is_allocated,
> +
> .bdrv_aio_readv = iscsi_aio_readv,
> .bdrv_aio_writev = iscsi_aio_writev,
> .bdrv_aio_flush = iscsi_aio_flush,
>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
next prev parent reply other threads:[~2013-06-24 14:36 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-22 20:58 [Qemu-devel] [PATCH 0/8] iscsi/qemu-img/block-migration enhancements Peter Lieven
2013-06-22 20:58 ` [Qemu-devel] [PATCH 1/8] iscsi: add logical block provisioning information to iscsilun Peter Lieven
2013-06-24 14:35 ` Paolo Bonzini
2013-06-22 20:58 ` [Qemu-devel] [PATCH 2/8] iscsi: add bdrv_co_is_allocated Peter Lieven
2013-06-24 14:36 ` Paolo Bonzini [this message]
2013-06-22 20:58 ` [Qemu-devel] [PATCH 3/8] iscsi: add bdrv_co_write_zeroes Peter Lieven
2013-06-24 14:34 ` Paolo Bonzini
2013-06-24 16:31 ` Peter Lieven
2013-06-22 20:58 ` [Qemu-devel] [PATCH 4/8] block: add bdrv_write_zeroes() Peter Lieven
2013-06-22 20:58 ` [Qemu-devel] [PATCH 5/8] block/raw: add bdrv_co_write_zeroes Peter Lieven
2013-06-22 20:58 ` [Qemu-devel] [PATCH 6/8] qemu-img: use bdrv_write_zeroes to write zeroes Peter Lieven
2013-06-24 14:33 ` Paolo Bonzini
2013-06-24 16:17 ` Peter Lieven
2013-06-24 16:25 ` Paolo Bonzini
2013-06-24 16:33 ` Peter Lieven
2013-06-24 18:46 ` Peter Lieven
2013-06-22 20:58 ` [Qemu-devel] [PATCH 7/8] iscsi: assert that sectors are aligned to LUN blocksize Peter Lieven
2013-06-24 14:30 ` Paolo Bonzini
2013-06-24 16:10 ` Peter Lieven
2013-06-24 16:13 ` Paolo Bonzini
2013-06-24 16:24 ` Peter Lieven
2013-06-24 16:27 ` Paolo Bonzini
2013-06-24 16:36 ` Peter Lieven
2013-06-22 20:58 ` [Qemu-devel] [PATCH 8/8] block-migration: efficiently encode zero blocks Peter Lieven
2013-06-24 14:32 ` Paolo Bonzini
2013-06-24 16:14 ` Peter Lieven
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=51C85973.9040107@redhat.com \
--to=pbonzini@redhat.com \
--cc=kwolf@redhat.com \
--cc=pl@kamp.de \
--cc=qemu-devel@nongnu.org \
--cc=ronniesahlberg@gmail.com \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.