From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37327) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vu8pF-0008Tx-Ef for qemu-devel@nongnu.org; Fri, 20 Dec 2013 17:45:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Vu8p6-0004IU-SS for qemu-devel@nongnu.org; Fri, 20 Dec 2013 17:45:45 -0500 Received: from mail-ea0-x234.google.com ([2a00:1450:4013:c01::234]:53771) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vu8p6-0004IQ-Er for qemu-devel@nongnu.org; Fri, 20 Dec 2013 17:45:36 -0500 Received: by mail-ea0-f180.google.com with SMTP id f15so1303301eak.25 for ; Fri, 20 Dec 2013 14:45:35 -0800 (PST) Received: from yakj.lan (net-37-116-200-88.cust.dsl.vodafone.it. [37.116.200.88]) by mx.google.com with ESMTPSA id m1sm22556116eeg.0.2013.12.20.14.45.33 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 20 Dec 2013 14:45:34 -0800 (PST) Sender: Paolo Bonzini From: Paolo Bonzini Date: Fri, 20 Dec 2013 23:45:25 +0100 Message-Id: <1387579525-6224-3-git-send-email-pbonzini@redhat.com> In-Reply-To: <1387579525-6224-1-git-send-email-pbonzini@redhat.com> References: <1387579525-6224-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PULL 2/2] scsi-disk: add non-zero MAX UNMAP LBA COUNT to block limits VPD page List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Linux prefers WRITE SAME to UNMAP if the count is zero, and WRITE SAME does not discard anything unless the device can guarantee that the resulting block is zero. This fixes thin provisioning on glusterfs. Reported-by: Bharata B Rao Signed-off-by: Paolo Bonzini --- hw/scsi/scsi-disk.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index 7653411..e42b3f2 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -47,6 +47,7 @@ do { printf("scsi-disk: " fmt , ## __VA_ARGS__); } while (0) #define SCSI_MAX_MODE_LEN 256 #define DEFAULT_DISCARD_GRANULARITY 4096 +#define DEFAULT_MAX_UNMAP_SIZE (1 << 30) /* 1 GB */ typedef struct SCSIDiskState SCSIDiskState; @@ -74,6 +75,7 @@ struct SCSIDiskState bool media_event; bool eject_request; uint64_t wwn; + uint64_t max_unmap_size; QEMUBH *bh; char *version; char *serial; @@ -625,6 +627,8 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf) s->qdev.conf.min_io_size / s->qdev.blocksize; unsigned int opt_io_size = s->qdev.conf.opt_io_size / s->qdev.blocksize; + unsigned int max_unmap_sectors = + s->max_unmap_size / s->qdev.blocksize; if (s->qdev.type == TYPE_ROM) { DPRINTF("Inquiry (EVPD[%02X] not supported for CDROM\n", @@ -647,6 +651,12 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf) outbuf[14] = (opt_io_size >> 8) & 0xff; outbuf[15] = opt_io_size & 0xff; + /* maximum unmap LBA count, hardcoded to 1GB */ + outbuf[20] = (max_unmap_sectors >> 24) & 0xff; + outbuf[21] = (max_unmap_sectors >> 16) & 0xff; + outbuf[22] = (max_unmap_sectors >> 8) & 0xff; + outbuf[23] = max_unmap_sectors & 0xff; + /* optimal unmap granularity */ outbuf[28] = (unmap_sectors >> 24) & 0xff; outbuf[29] = (unmap_sectors >> 16) & 0xff; @@ -2519,6 +2529,8 @@ static Property scsi_hd_properties[] = { DEFINE_PROP_BIT("dpofua", SCSIDiskState, features, SCSI_DISK_F_DPOFUA, false), DEFINE_PROP_HEX64("wwn", SCSIDiskState, wwn, 0), + DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState, max_unmap_size, + DEFAULT_MAX_UNMAP_SIZE), DEFINE_BLOCK_CHS_PROPERTIES(SCSIDiskState, qdev.conf), DEFINE_PROP_END_OF_LIST(), }; @@ -2628,6 +2640,8 @@ static Property scsi_disk_properties[] = { DEFINE_PROP_BIT("dpofua", SCSIDiskState, features, SCSI_DISK_F_DPOFUA, false), DEFINE_PROP_HEX64("wwn", SCSIDiskState, wwn, 0), + DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState, max_unmap_size, + DEFAULT_MAX_UNMAP_SIZE), DEFINE_PROP_END_OF_LIST(), }; -- 1.8.4.2