All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Lieven <pl@kamp.de>
To: ronnie sahlberg <ronniesahlberg@gmail.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	qemu-devel <qemu-devel@nongnu.org>,
	Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 1/2] iscsi: add support for bdrv_co_is_allocated()
Date: Fri, 21 Jun 2013 19:18:10 +0200	[thread overview]
Message-ID: <51C48AD2.8000207@kamp.de> (raw)
In-Reply-To: <CAN05THSYd7jaRk=fD7QpasiYt7acb1t12sNGFHShQsYeJYqcTw@mail.gmail.com>

Am 21.06.2013 19:13, schrieb ronnie sahlberg:
> On Fri, Jun 21, 2013 at 10:06 AM, Peter Lieven <pl@kamp.de> wrote:
>> Am 21.06.2013 18:31, schrieb Paolo Bonzini:
>>> Il 21/06/2013 13:07, Kevin Wolf ha scritto:
>>>>>>>> Note that you're blocking here. The preferred way would be something
>>>>>>>> involving a yield from the coroutine and a reenter as soon as all
>>>>>>>> requests are done. Maybe a CoRwLock does what you need?
>>>>>> Is there a document how to use it? Or can you help here?
>>>> The idea would be to take a read lock while any request is in flight
>>>> (i.e. qemu_co_rwlock_rdlock() before it's started and
>>>> qemu_co_rwlock_unlock() when it completes), and to take a write lock
>>>> (qemu_co_rwlock_wrlock) for the part of iscsi_co_is_allocated() that
>>>> requires that no other request runs in parallel.
>>>>
>>> You can just send the SCSI command asynchronously and wait for the
>>> result.  There is an example in block/qed.c, the same would apply for iscsi.
>> thanks for the pointer paolo, this was i was looking for. this here seems to work:
>>
>> 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));
> Only the first descriptor?
> sector_num -> sector_num+nb_sectors  could be partially allocated in
> which case you get multiple descriptors.
The number of sectors for which the returned provisioning state
holds true is set in *pnum. If it is only partly allocated the
return value of iscsi_co_is_allocated will be 1 or 0 and pnum
returns the number of sectors for which this is true.
>>     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;
>> }

  reply	other threads:[~2013-06-21 17:18 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-20 18:20 [Qemu-devel] [PATCH 0/2] iscsi: support for is_allocated and inproved has_zero_init Peter Lieven
2013-06-20 18:20 ` [Qemu-devel] [PATCH 1/2] iscsi: add support for bdrv_co_is_allocated() Peter Lieven
2013-06-21  9:18   ` Kevin Wolf
2013-06-21  9:45     ` Peter Lieven
2013-06-21 11:07       ` Kevin Wolf
2013-06-21 11:42         ` Peter Lieven
2013-06-21 13:14           ` Kevin Wolf
2013-06-21 13:23             ` Peter Lieven
2013-06-21 16:31         ` Paolo Bonzini
2013-06-21 17:06           ` Peter Lieven
2013-06-21 17:13             ` ronnie sahlberg
2013-06-21 17:18               ` Peter Lieven [this message]
2013-06-21 16:06     ` ronnie sahlberg
2013-06-21 20:01       ` Paolo Bonzini
2013-06-24  8:13     ` Stefan Hajnoczi
2013-06-24 13:49       ` Paolo Bonzini
2013-06-24 16:11         ` Peter Lieven
2013-06-20 18:20 ` [Qemu-devel] [PATCH 2/2] iscsi: add intelligent has_zero_init check Peter Lieven
2013-06-21 20:00   ` Paolo Bonzini
2013-06-21 20:25     ` Peter Lieven
  -- strict thread matches above, loose matches on Subject: below --
2013-06-20 18:08 [Qemu-devel] [PATCH 0/2] iscsi: support for is_allocated and inproved has_zero_init Peter Lieven
2013-06-20 18:08 ` [Qemu-devel] [PATCH 1/2] iscsi: add support for bdrv_co_is_allocated() 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=51C48AD2.8000207@kamp.de \
    --to=pl@kamp.de \
    --cc=kwolf@redhat.com \
    --cc=pbonzini@redhat.com \
    --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.