storage/lvm: remove old volume only after successfully cloning new one
In some cases, it may happen that new volume (`self._vid_snap`) does not exists. This is normally an error, but even in such a case, do not remove the only remaining instance of volume (`self.vid`). Instead, rename it temporarily and remove only after new volume is successfully cloned. Fixes QubesOS/qubes-issues#3164
This commit is contained in:
parent
ec4c7d7263
commit
021047f950
@ -271,10 +271,22 @@ class ThinVolume(qubes.storage.Volume):
|
|||||||
qubes_lvm(cmd, self.log)
|
qubes_lvm(cmd, self.log)
|
||||||
self._remove_revisions()
|
self._remove_revisions()
|
||||||
|
|
||||||
cmd = ['remove', self.vid]
|
# TODO: when converting this function to coroutine, this _must_ be
|
||||||
qubes_lvm(cmd, self.log)
|
# under a lock
|
||||||
cmd = ['clone', self._vid_snap, self.vid]
|
# remove old volume only after _successful_ clone of the new one
|
||||||
|
cmd = ['rename', self.vid, self.vid + '-tmp']
|
||||||
qubes_lvm(cmd, self.log)
|
qubes_lvm(cmd, self.log)
|
||||||
|
try:
|
||||||
|
cmd = ['clone', self._vid_snap, self.vid]
|
||||||
|
qubes_lvm(cmd, self.log)
|
||||||
|
except:
|
||||||
|
# restore original volume
|
||||||
|
cmd = ['rename', self.vid + '-tmp', self.vid]
|
||||||
|
qubes_lvm(cmd, self.log)
|
||||||
|
raise
|
||||||
|
else:
|
||||||
|
cmd = ['remove', self.vid + '-tmp']
|
||||||
|
qubes_lvm(cmd, self.log)
|
||||||
|
|
||||||
|
|
||||||
def create(self):
|
def create(self):
|
||||||
@ -494,6 +506,8 @@ def qubes_lvm(cmd, log=logging.getLogger('qubes.storage.lvm')):
|
|||||||
lvm_cmd = ["lvextend", "-L%s" % size, cmd[1]]
|
lvm_cmd = ["lvextend", "-L%s" % size, cmd[1]]
|
||||||
elif action == 'activate':
|
elif action == 'activate':
|
||||||
lvm_cmd = ['lvchange', '-ay', cmd[1]]
|
lvm_cmd = ['lvchange', '-ay', cmd[1]]
|
||||||
|
elif action == 'rename':
|
||||||
|
lvm_cmd = ['lvrename', cmd[1], cmd[2]]
|
||||||
else:
|
else:
|
||||||
raise NotImplementedError('unsupported action: ' + action)
|
raise NotImplementedError('unsupported action: ' + action)
|
||||||
if lvm_is_very_old:
|
if lvm_is_very_old:
|
||||||
|
Loading…
Reference in New Issue
Block a user