Comments
Patch
@@ -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
@@ -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;
}
@@ -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;
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 <pbonzini@redhat.com> --- block.h | 6 +++--- hw/ide/qdev.c | 6 +++++- hw/scsi-disk.c | 12 ++++++++++++ 3 files changed, 20 insertions(+), 4 deletions(-)