storeage/reflink: unlock size getter

Don't update _size in the getter, so it can be unlocked (which is
helpful for QubesOS/qubes-issues#5935).

!!! If cherry-picking for release4.0, also adjust import_data() to !!!
!!! use self.size (no underscore) instead of self._get_size()      !!!
This commit is contained in:
Rusty Bird 2020-07-07 15:39:06 +00:00
parent b98c1814ee
commit a1b5262426
No known key found for this signature in database
GPG Key ID: 469D78F47AAF2ADF

View File

@ -217,7 +217,7 @@ class ReflinkVolume(qubes.storage.Volume):
# Preferably use the size of a leftover image, in case # Preferably use the size of a leftover image, in case
# the volume was previously resized - but then a crash # the volume was previously resized - but then a crash
# prevented qubes.xml serialization of the new size. # prevented qubes.xml serialization of the new size.
_create_sparse_file(self._path_dirty, self._get_size()) _create_sparse_file(self._path_dirty, self.size)
return self return self
@_coroutinized @_coroutinized
@ -227,7 +227,7 @@ class ReflinkVolume(qubes.storage.Volume):
self._commit(self._path_dirty) self._commit(self._path_dirty)
else: else:
if not self.snap_on_start: if not self.snap_on_start:
self._get_size() # preserve manual resize of image self._size = self.size # preserve manual resize of image
_remove_file(self._path_dirty) _remove_file(self._path_dirty)
_remove_file(self._path_clean) _remove_file(self._path_clean)
return self return self
@ -339,15 +339,13 @@ class ReflinkVolume(qubes.storage.Volume):
return collections.OrderedDict(sorted(items, return collections.OrderedDict(sorted(items,
key=lambda item: int(item[0]))) key=lambda item: int(item[0])))
def _get_size(self): @property
def size(self):
for path in (self._path_dirty, self._path_clean): for path in (self._path_dirty, self._path_clean):
with suppress(FileNotFoundError): with suppress(FileNotFoundError):
self._size = os.path.getsize(path) return os.path.getsize(path)
break
return self._size return self._size
size = property(_locked(_get_size))
@property @property
def usage(self): def usage(self):
''' Return volume disk usage from the VM's perspective. It is ''' Return volume disk usage from the VM's perspective. It is