From: Kevin Wolf <kwolf@redhat.com>
To: Christoph Hellwig <hch@lst.de>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 2/7] scsi-disk: support WRITE SAME (16) with unmap bit
Date: Thu, 16 Dec 2010 16:48:15 +0100 [thread overview]
Message-ID: <4D0A34BF.9020004@redhat.com> (raw)
In-Reply-To: <20101210150055.GB31114@lst.de>
Am 10.12.2010 16:00, schrieb Christoph Hellwig:
> Support discards via the WRITE SAME command with the unmap bit set, and
> tell the initiator about the support for it via the block limit and the
> new thin provisioning EVPD pages. Also fix the comment which incorrectly
> describedthe block limits EVPD page.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
>
> Index: qemu/hw/scsi-disk.c
> ===================================================================
> --- qemu.orig/hw/scsi-disk.c 2010-12-07 09:35:44.203009851 +0100
> +++ qemu/hw/scsi-disk.c 2010-12-07 09:42:07.984255141 +0100
> @@ -424,7 +424,8 @@ static int scsi_disk_emulate_inquiry(SCS
> outbuf[buflen++] = 0x80; // unit serial number
> outbuf[buflen++] = 0x83; // device identification
> if (bdrv_get_type_hint(s->bs) != BDRV_TYPE_CDROM) {
> - outbuf[buflen++] = 0xb0; // block device characteristics
> + outbuf[buflen++] = 0xb0; // block limits
> + outbuf[buflen++] = 0xb2; // thin provisioning
> }
> outbuf[pages] = buflen - pages - 1; // number of pages
> break;
> @@ -466,8 +467,10 @@ static int scsi_disk_emulate_inquiry(SCS
> buflen += id_len;
> break;
> }
> - case 0xb0: /* block device characteristics */
> + case 0xb0: /* block limits */
> {
> + unsigned int unmap_sectors =
> + s->qdev.conf.discard_granularity / s->qdev.blocksize;
> unsigned int min_io_size =
> s->qdev.conf.min_io_size / s->qdev.blocksize;
> unsigned int opt_io_size =
> @@ -492,6 +495,21 @@ static int scsi_disk_emulate_inquiry(SCS
> outbuf[13] = (opt_io_size >> 16) & 0xff;
> outbuf[14] = (opt_io_size >> 8) & 0xff;
> outbuf[15] = opt_io_size & 0xff;
> +
> + /* optimal unmap granularity */
> + outbuf[28] = (unmap_sectors >> 24) & 0xff;
> + outbuf[29] = (unmap_sectors >> 16) & 0xff;
> + outbuf[30] = (unmap_sectors >> 8) & 0xff;
> + outbuf[31] = unmap_sectors & 0xff;
> + break;
> + }
> + case 0xb2: /* thin provisioning */
> + {
> + outbuf[3] = buflen = 8;
> + outbuf[4] = 0;
> + outbuf[5] = 0x40; /* write same with unmap supported */
> + outbuf[6] = 0;
> + outbuf[7] = 0;
> break;
> }
> default:
> @@ -959,6 +977,11 @@ static int scsi_disk_emulate_command(SCS
> outbuf[11] = 0;
> outbuf[12] = 0;
> outbuf[13] = get_physical_block_exp(&s->qdev.conf);
> +
> + /* set TPE bit if the format supports discard */
> + if (s->qdev.conf.discard_granularity)
> + outbuf[14] = 0x80;
Missing braces.
> +
> /* Protection, exponent and lowest lba field left blank. */
> buflen = req->cmd.xfer;
> break;
> @@ -1123,6 +1146,34 @@ static int32_t scsi_send_command(SCSIDev
> goto illegal_lba;
> }
> break;
> + case WRITE_SAME_16:
> + len = r->req.cmd.xfer / d->blocksize;
> +
> + DPRINTF("WRITE SAME(16) (sector %" PRId64 ", count %d)\n",
> + r->req.cmd.lba, len);
> +
> + if (r->req.cmd.lba > s->max_lba) {
> + goto illegal_lba;
> + }
> +
> + /*
> + * We only support WRITE SAME with the unmap bit set for now.
> + */
> + if (!(buf[1] & 0x8)) {
> + goto fail;
> + }
> +
> + rc = bdrv_discard(s->bs, r->req.cmd.lba * s->cluster_size,
> + len * s->cluster_size);
> + if (rc < 0) {
> + /* XXX: better error code ?*/
> + goto fail;
> + }
> +
> + scsi_req_set_status(r, GOOD, NO_SENSE);
> + scsi_req_complete(&r->req);
> + scsi_remove_request(r);
Isn't this the same as scsi_command_complete()?
> + return 0;
And if you break; here instead of returning (like all other commands)
and remove the three lines above completely, I think it would just do
the right thing.
Kevin
next prev parent reply other threads:[~2010-12-16 15:47 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-10 15:00 [Qemu-devel] ]PATCH 0/7] add TRIM/UNMAP support, v3 Christoph Hellwig
2010-12-10 15:00 ` [Qemu-devel] [PATCH 1/7] block: add discard support Christoph Hellwig
2010-12-10 15:00 ` [Qemu-devel] [PATCH 2/7] scsi-disk: support WRITE SAME (16) with unmap bit Christoph Hellwig
2010-12-16 15:48 ` Kevin Wolf [this message]
2010-12-16 16:41 ` Christoph Hellwig
2010-12-10 15:01 ` [Qemu-devel] [PATCH 3/7] make dma_bdrv_io available to drivers Christoph Hellwig
2010-12-10 15:01 ` [Qemu-devel] [PATCH 4/7] ide: factor dma handling helpers Christoph Hellwig
2010-12-10 15:01 ` [Qemu-devel] [PATCH 5/7] ide: also reset io_buffer_index for writes Christoph Hellwig
2010-12-10 15:01 ` [Qemu-devel] [PATCH 6/7] ide: add TRIM support Christoph Hellwig
2010-12-10 15:01 ` [Qemu-devel] [PATCH 7/7] raw-posix: add discard support Christoph Hellwig
2010-12-12 15:28 ` [Qemu-devel] ]PATCH 0/7] add TRIM/UNMAP support, v3 Stefan Hajnoczi
2010-12-13 15:45 ` Christoph Hellwig
2010-12-16 15:43 ` Kevin Wolf
2010-12-16 16:42 ` Christoph Hellwig
2010-12-16 18:36 ` [Qemu-devel] Re: [PATCH 0/3] add TRIM/UNMAP support, v4 Christoph Hellwig
2010-12-16 18:36 ` [Qemu-devel] [PATCH 1/3] block: add discard support Christoph Hellwig
2010-12-16 18:36 ` [Qemu-devel] [PATCH 2/3] scsi-disk: support WRITE SAME (16) with unmap bit Christoph Hellwig
2010-12-16 18:36 ` [Qemu-devel] [PATCH 3/3] raw-posix: add discard support Christoph Hellwig
2010-12-17 10:32 ` Kevin Wolf
2010-12-17 10:41 ` [Qemu-devel] [PATCH v5] " Christoph Hellwig
2010-12-17 10:53 ` [Qemu-devel] " Kevin Wolf
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=4D0A34BF.9020004@redhat.com \
--to=kwolf@redhat.com \
--cc=hch@lst.de \
--cc=qemu-devel@nongnu.org \
/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.