From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:40869) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S5gwZ-0004wP-Ip for qemu-devel@nongnu.org; Thu, 08 Mar 2012 12:16:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1S5gwS-0004rC-R2 for qemu-devel@nongnu.org; Thu, 08 Mar 2012 12:15:59 -0500 Received: from mail-iy0-f173.google.com ([209.85.210.173]:47906) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S5gwS-0004n5-Ju for qemu-devel@nongnu.org; Thu, 08 Mar 2012 12:15:52 -0500 Received: by mail-iy0-f173.google.com with SMTP id j26so1015616iaf.4 for ; Thu, 08 Mar 2012 09:15:51 -0800 (PST) Sender: Paolo Bonzini From: Paolo Bonzini Date: Thu, 8 Mar 2012 18:15:11 +0100 Message-Id: <1331226917-6658-12-git-send-email-pbonzini@redhat.com> In-Reply-To: <1331226917-6658-1-git-send-email-pbonzini@redhat.com> References: <1331226917-6658-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [RFC PATCH 11/17] ide/scsi: prepare for flipping the discard defaults List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Let a discard_granularity equal to -1 represent "enabled with default granularity". Also, Linux requires the discard_granularity to be a power of two because it uses it with an AND, make the user obey. Signed-off-by: Paolo Bonzini --- block.h | 6 +++--- hw/ide/qdev.c | 6 +++++- hw/scsi-disk.c | 12 ++++++++++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/block.h b/block.h index e28321e..aa224d3 100644 --- a/block.h +++ b/block.h @@ -422,7 +422,7 @@ typedef struct BlockConf { uint16_t min_io_size; uint32_t opt_io_size; int32_t bootindex; - uint32_t discard_granularity; + int32_t discard_granularity; uint32_t discard_zeroes_data; } BlockConf; @@ -450,8 +450,8 @@ static inline unsigned int get_physical_block_exp(BlockConf *conf) DEFINE_PROP_INT32("bootindex", _state, _conf.bootindex, -1), \ DEFINE_PROP_BIT("discard_zeroes_data", _state, \ _conf.discard_zeroes_data, 0, false), \ - DEFINE_PROP_UINT32("discard_granularity", _state, \ - _conf.discard_granularity, 0) + DEFINE_PROP_INT32("discard_granularity", _state, \ + _conf.discard_granularity, 0) #endif diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c index f6a4896..5c7141f 100644 --- a/hw/ide/qdev.c +++ b/hw/ide/qdev.c @@ -121,8 +121,12 @@ static int ide_dev_initfn(IDEDevice *dev, IDEDriveKind kind) IDEState *s = bus->ifs + dev->unit; const char *serial; DriveInfo *dinfo; + int discard_granularity; - if (dev->conf.discard_granularity && dev->conf.discard_granularity != 512) { + discard_granularity = dev->conf.discard_granularity; + if (discard_granularity == -1) { + dev->conf.discard_granularity = 512; + } else if (discard_granularity && discard_granularity != 512) { error_report("discard_granularity must be 512 for ide"); return -1; } diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c index f489078..00d355e 100644 --- a/hw/scsi-disk.c +++ b/hw/scsi-disk.c @@ -1577,12 +1577,24 @@ static int scsi_initfn(SCSIDevice *dev) { SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev); DriveInfo *dinfo; + int discard_granularity; if (!s->qdev.conf.bs) { error_report("drive property not set"); return -1; } + discard_granularity = s->qdev.conf.discard_granularity; + if (discard_granularity == -1) { + s->qdev.conf.discard_granularity = s->qdev.conf.logical_block_size; + } else if (discard_granularity < s->qdev.conf.logical_block_size) { + error_report("scsi-block: invalid discard_granularity"); + return -1; + } else if (discard_granularity & (discard_granularity - 1)) { + error_report("scsi-block: discard_granularity not a power of two"); + return -1; + } + if (!s->removable && !bdrv_is_inserted(s->qdev.conf.bs)) { error_report("Device needs media, but drive is empty"); return -1; -- 1.7.7.6