From: Peter Lieven <pl@kamp.de>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: kwolf@redhat.com, ronniesahlberg@gmail.com,
qemu-devel@nongnu.org, stefanha@redhat.com
Subject: Re: [Qemu-devel] [PATCHv5 3/3] iscsi: add .bdrv_co_discard
Date: Fri, 19 Jul 2013 11:37:33 +0200 [thread overview]
Message-ID: <51E908DD.2030404@kamp.de> (raw)
In-Reply-To: <51E9044C.80001@redhat.com>
On 19.07.2013 11:18, Paolo Bonzini wrote:
> Il 19/07/2013 09:19, Peter Lieven ha scritto:
>> Signed-off-by: Peter Lieven <pl@kamp.de>
>> ---
>> block/iscsi.c | 156 +++++++++++++++++++++++++++------------------------------
>> 1 file changed, 73 insertions(+), 83 deletions(-)
>>
>> diff --git a/block/iscsi.c b/block/iscsi.c
>> index 19afd6c..cb44fb1 100644
>> --- a/block/iscsi.c
>> +++ b/block/iscsi.c
>> @@ -85,6 +85,7 @@ typedef struct IscsiAIOCB {
>> #define NOP_INTERVAL 5000
>> #define MAX_NOP_FAILURES 3
>> #define ISCSI_CMD_RETRIES 5
>> +#define ISCSI_MAX_UNMAP 131072
>>
>> static void
>> iscsi_bh_cb(void *p)
>> @@ -622,88 +623,6 @@ iscsi_aio_flush(BlockDriverState *bs,
>> return &acb->common;
>> }
>>
>> -static int iscsi_aio_discard_acb(IscsiAIOCB *acb);
>> -
>> -static void
>> -iscsi_unmap_cb(struct iscsi_context *iscsi, int status,
>> - void *command_data, void *opaque)
>> -{
>> - IscsiAIOCB *acb = opaque;
>> -
>> - if (acb->canceled != 0) {
>> - return;
>> - }
>> -
>> - acb->status = 0;
>> - if (status != 0) {
>> - if (status == SCSI_STATUS_CHECK_CONDITION
>> - && acb->task->sense.key == SCSI_SENSE_UNIT_ATTENTION
>> - && acb->retries-- > 0) {
>> - scsi_free_scsi_task(acb->task);
>> - acb->task = NULL;
>> - if (iscsi_aio_discard_acb(acb) == 0) {
>> - iscsi_set_events(acb->iscsilun);
>> - return;
>> - }
>> - }
>> - error_report("Failed to unmap data on iSCSI lun. %s",
>> - iscsi_get_error(iscsi));
>> - acb->status = -EIO;
>> - }
>> -
>> - iscsi_schedule_bh(acb);
>> -}
>> -
>> -static int iscsi_aio_discard_acb(IscsiAIOCB *acb) {
>> - struct iscsi_context *iscsi = acb->iscsilun->iscsi;
>> - struct unmap_list list[1];
>> -
>> - acb->canceled = 0;
>> - acb->bh = NULL;
>> - acb->status = -EINPROGRESS;
>> - acb->buf = NULL;
>> -
>> - list[0].lba = sector_qemu2lun(acb->sector_num, acb->iscsilun);
>> - list[0].num = acb->nb_sectors * BDRV_SECTOR_SIZE / acb->iscsilun->block_size;
>> -
>> - acb->task = iscsi_unmap_task(iscsi, acb->iscsilun->lun,
>> - 0, 0, &list[0], 1,
>> - iscsi_unmap_cb,
>> - acb);
>> - if (acb->task == NULL) {
>> - error_report("iSCSI: Failed to send unmap command. %s",
>> - iscsi_get_error(iscsi));
>> - return -1;
>> - }
>> -
>> - return 0;
>> -}
>> -
>> -static BlockDriverAIOCB *
>> -iscsi_aio_discard(BlockDriverState *bs,
>> - int64_t sector_num, int nb_sectors,
>> - BlockDriverCompletionFunc *cb, void *opaque)
>> -{
>> - IscsiLun *iscsilun = bs->opaque;
>> - IscsiAIOCB *acb;
>> -
>> - acb = qemu_aio_get(&iscsi_aiocb_info, bs, cb, opaque);
>> -
>> - acb->iscsilun = iscsilun;
>> - acb->nb_sectors = nb_sectors;
>> - acb->sector_num = sector_num;
>> - acb->retries = ISCSI_CMD_RETRIES;
>> -
>> - if (iscsi_aio_discard_acb(acb) != 0) {
>> - qemu_aio_release(acb);
>> - return NULL;
>> - }
>> -
>> - iscsi_set_events(iscsilun);
>> -
>> - return &acb->common;
>> -}
>> -
>> #ifdef __linux__
>> static void
>> iscsi_aio_ioctl_cb(struct iscsi_context *iscsi, int status,
>> @@ -985,6 +904,77 @@ out:
>> return ret;
>> }
>>
>> +static int
>> +coroutine_fn iscsi_co_discard(BlockDriverState *bs, int64_t sector_num,
>> + int nb_sectors)
>> +{
>> + IscsiLun *iscsilun = bs->opaque;
>> + struct IscsiTask iTask;
>> + struct unmap_list list;
>> + uint32_t nb_blocks;
>> + uint32_t max_unmap;
>> +
>> + if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) {
>> + return -EINVAL;
>> + }
>> +
>> + if (!iscsilun->lbp.lbpu) {
>> + /* UNMAP is not supported by the target */
>> + return 0;
>> + }
> I guess you'll later add support for lbpws.
It depends: I think almost all targets will support both. I would use unmap for discard and write_same for write_zeroes.
Peter
>
> Anyway, series looks fine.
Thanks. Feel free to pull it once the get_lba_status thing is upstream.
Peter
prev parent reply other threads:[~2013-07-19 9:37 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-19 7:19 [Qemu-devel] [PATCHv5 0/3] iscsi/qemu-img/block-migration enhancements Peter Lieven
2013-07-19 7:19 ` [Qemu-devel] [PATCHv5 1/3] iscsi: add logical block provisioning information to iscsilun Peter Lieven
2013-07-19 7:19 ` [Qemu-devel] [PATCHv5 2/3] iscsi: add .bdrv_get_block_status Peter Lieven
2013-07-19 7:19 ` [Qemu-devel] [PATCHv5 3/3] iscsi: add .bdrv_co_discard Peter Lieven
2013-07-19 9:18 ` Paolo Bonzini
2013-07-19 9:37 ` Peter Lieven [this message]
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=51E908DD.2030404@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).