Signed-off-by: Lin Ma <lma(a)suse.com>
---
docs/formatdomain.html.in | 6 +++++-
docs/schemas/domaincommon.rng | 5 +++++
src/conf/domain_conf.c | 19 ++++++++++++++++++-
src/conf/domain_conf.h | 1 +
src/qemu/qemu_domain.c | 2 ++
5 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 20c28a47e3..59ee50225a 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -3019,7 +3019,7 @@
<driver name='qemu' type='raw'/>
<source dev='/dev/sda'/>
<geometry cyls='16383' heads='16' secs='63'
trans='lba'/>
- <blockio logical_block_size='512'
physical_block_size='4096'/>
+ <blockio logical_block_size='512' physical_block_size='4096'
discard_granularity='4096'/>
<target dev='hdj' bus='ide'/>
</disk>
<disk type='volume' device='disk'>
@@ -4067,6 +4067,10 @@
BLKPBSZGET ioctl and describes the disk's hardware sector
size which can be relevant for the alignment of disk data.
</dd>
+ <dt><code>discard_granularity</code></dt>
+ <dd>Its value impacts the Optimal Unmap Granularity field in
+ the block limits VPD page. <span class="since">Since
6.5.0</span>
+ </dd>
</dl>
</dd>
</dl>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index e3bf7f5d55..5206c4e246 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2177,6 +2177,11 @@
<data type="integer"/>
</attribute>
</optional>
+ <optional>
+ <attribute name="discard_granularity">
+ <data type="integer"/>
+ </attribute>
+ </optional>
</element>
</define>
<!--
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index e9336fd72d..7a6a124ffd 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -10425,6 +10425,7 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
g_autofree char *vendor = NULL;
g_autofree char *product = NULL;
g_autofree char *domain_name = NULL;
+ g_autofree char *discard_granularity = NULL;
if (!(def = virDomainDiskDefNew(xmlopt)))
return NULL;
@@ -10522,6 +10523,16 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
physical_block_size);
goto error;
}
+ discard_granularity =
+ virXMLPropString(cur, "discard_granularity");
+ if (discard_granularity &&
+ virStrToLong_ui(discard_granularity, NULL, 0,
+ &def->blockio.discard_granularity) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("invalid granularity size '%s'"),
+ discard_granularity);
+ goto error;
+ }
} else if (!virDomainDiskGetDriver(def) &&
virXMLNodeNameEqual(cur, "driver")) {
if (virDomainVirtioOptionsParseXML(cur, &def->virtio) < 0)
@@ -24958,7 +24969,8 @@ virDomainDiskBlockIoDefFormat(virBufferPtr buf,
virDomainDiskDefPtr def)
{
if (def->blockio.logical_block_size > 0 ||
- def->blockio.physical_block_size > 0) {
+ def->blockio.physical_block_size > 0 ||
+ def->blockio.discard_granularity > 0) {
virBufferAddLit(buf, "<blockio");
if (def->blockio.logical_block_size > 0) {
virBufferAsprintf(buf,
@@ -24970,6 +24982,11 @@ virDomainDiskBlockIoDefFormat(virBufferPtr buf,
" physical_block_size='%u'",
def->blockio.physical_block_size);
}
+ if (def->blockio.discard_granularity > 0) {
+ virBufferAsprintf(buf,
+ " discard_granularity='%u'",
+ def->blockio.discard_granularity);
+ }
virBufferAddLit(buf, "/>\n");
}
}
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index bda8fb6bce..9056e5e9b6 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -549,6 +549,7 @@ struct _virDomainDiskDef {
struct {
unsigned int logical_block_size;
unsigned int physical_block_size;
+ unsigned int discard_granularity;
} blockio;
virDomainBlockIoTuneInfo blkdeviotune;
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 2dad823a86..c582550def 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -8743,6 +8743,8 @@ qemuDomainDiskChangeSupported(virDomainDiskDefPtr disk,
"blockio logical_block_size", false);
CHECK_EQ(blockio.physical_block_size,
"blockio physical_block_size", false);
+ CHECK_EQ(blockio.discard_granularity,
+ "blockio discard_granularity", false);
CHECK_EQ(blkdeviotune.total_bytes_sec,
"blkdeviotune total_bytes_sec",
--
2.26.0