Skip to content
This repository was archived by the owner on Jan 22, 2026. It is now read-only.

Commit 2151b04

Browse files
Deepak C Shettycrobinso
authored andcommitted
virtinst: Add support for fs write policy
This introduces new attribute wrpolicy with only supported value as immediate. This helps specify whether to skip the host page cache. When wrpolicy is specified, meaning when wrpolicy=immediate a writeback is explicitly initiated for the dirty pages in the host page cache as part of the guest file write operation. Signed-off-by: Deepak C Shetty <deepakcs@linux.vnet.ibm.com>
1 parent b75a3b9 commit 2151b04

4 files changed

Lines changed: 45 additions & 1 deletion

File tree

tests/xmlparse-xml/change-filesystems-in.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@
3333
<target dir='/bar/baz'/>
3434
</filesystem>
3535
<filesystem type='mount' accessmode='squash'>
36+
<driver type='path' wrpolicy='immediate'/>
37+
<source dir='/foo/bar'/>
38+
<target dir='/bar/baz'/>
39+
</filesystem>
40+
<filesystem type='mount' accessmode='mapped'>
3641
<driver type='path'/>
3742
<source dir='/foo/bar'/>
3843
<target dir='/bar/baz'/>

tests/xmlparse-xml/change-filesystems-out.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,11 @@
3737
<target dir="/bar/baz"/>
3838
<readonly/>
3939
</filesystem>
40+
<filesystem>
41+
<driver type="handle" wrpolicy="immediate"/>
42+
<source dir="/foo/bar"/>
43+
<target dir="/bar/baz"/>
44+
<readonly/>
45+
</filesystem>
4046
</devices>
4147
</domain>

tests/xmlparse.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,11 +577,13 @@ def testAlterFilesystems(self):
577577
dev1 = guest.get_devices(devtype)[0]
578578
dev2 = guest.get_devices(devtype)[1]
579579
dev3 = guest.get_devices(devtype)[2]
580+
dev4 = guest.get_devices(devtype)[3]
580581

581582
check = self._make_checker(dev1)
582583
check("type", None, "mount")
583584
check("mode", None, "passthrough")
584585
check("driver", "handle", None)
586+
check("wrpolicy", None, None)
585587
check("source", "/foo/bar", "/new/path")
586588
check("target", "/bar/baz", "/new/target")
587589

@@ -595,6 +597,14 @@ def testAlterFilesystems(self):
595597
check("type", "mount", None)
596598
check("mode", "squash", None)
597599
check("driver", "path", "handle")
600+
check("wrpolicy", "immediate", None)
601+
check("readonly", False, True)
602+
603+
check = self._make_checker(dev4)
604+
check("type", "mount", None)
605+
check("mode", "mapped", None)
606+
check("driver", "path", "handle")
607+
check("wrpolicy", None, "immediate")
598608
check("readonly", False, True)
599609

600610
self._alter_compare(guest.get_config_xml(), outfile)

virtinst/VirtualFilesystem.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ class VirtualFilesystem(VirtualDevice.VirtualDevice):
4242
MODE_DEFAULT = "default"
4343
MOUNT_MODES = [MODE_PASSTHROUGH, MODE_MAPPED, MODE_SQUASH, MODE_DEFAULT]
4444

45+
WRPOLICY_IMM = "immediate"
46+
WRPOLICY_DEFAULT = "default"
47+
WRPOLICIES = [WRPOLICY_IMM, WRPOLICY_DEFAULT]
48+
4549
DRIVER_PATH = "path"
4650
DRIVER_HANDLE = "handle"
4751
DRIVER_DEFAULT = "default"
@@ -75,13 +79,15 @@ def __init__(self, conn, parsexml=None, parsexmlnode=None, caps=None):
7579
self._target = None
7680
self._source = None
7781
self._readonly = None
82+
self._wrpolicy = None
7883

7984
if self._is_parse():
8085
return
8186

8287
self.mode = self.MODE_DEFAULT
8388
self.type = self.TYPE_DEFAULT
8489
self.driver = self.DRIVER_DEFAULT
90+
self.wrpolicy = self.WRPOLICY_DEFAULT
8591

8692
def _get_type(self):
8793
return self._type
@@ -99,6 +105,14 @@ def _set_mode(self, val):
99105
self._mode = val
100106
mode = _xml_property(_get_mode, _set_mode, xpath="./@accessmode")
101107

108+
def _get_wrpolicy(self):
109+
return self._wrpolicy
110+
def _set_wrpolicy(self, val):
111+
if val is not None and not self.WRPOLICIES.count(val):
112+
raise ValueError(_("Unsupported filesystem write policy '%s'" % val))
113+
self._wrpolicy = val
114+
wrpolicy = _xml_property(_get_wrpolicy, _set_wrpolicy, xpath="./driver/@wrpolicy")
115+
102116
def _get_readonly(self):
103117
return self._readonly
104118
def _set_readonly(self, val):
@@ -162,13 +176,17 @@ def _get_xml_config(self):
162176
source = self.source
163177
target = self.target
164178
readonly = self.readonly
179+
wrpolicy = self.wrpolicy
165180

166181
if mode == self.MODE_DEFAULT:
167182
mode = None
168183
if ftype == self.TYPE_DEFAULT:
169184
ftype = None
170185
if driver == self.DRIVER_DEFAULT:
171186
driver = None
187+
wrpolicy = None
188+
if wrpolicy == self.WRPOLICY_DEFAULT:
189+
wrpolicy = None
172190

173191
if not source or not target:
174192
raise ValueError(
@@ -182,7 +200,12 @@ def _get_xml_config(self):
182200
fsxml += ">\n"
183201

184202
if driver:
185-
fsxml += " <driver type='%s'/>\n" % driver
203+
if not wrpolicy:
204+
fsxml += " <driver type='%s'/>\n" % driver
205+
else:
206+
fsxml += " <driver type='%s' wrpolicy='%s' />\n" % (
207+
driver,
208+
wrpolicy)
186209

187210
fsxml += " <source %s='%s'/>\n" % (
188211
self.type_to_source_prop(ftype),

0 commit comments

Comments
 (0)