소스 검색

Prevent removal of in-use storage pool

Fixes QubesOS/qubes-issues#4454
Marek Marczykowski-Górecki 5 년 전
부모
커밋
4f5687440f
2개의 변경된 파일18개의 추가작업 그리고 0개의 파일을 삭제
  1. 11 0
      qubes/app.py
  2. 7 0
      qubes/exc.py

+ 11 - 0
qubes/app.py

@@ -1262,6 +1262,17 @@ class Qubes(qubes.PropertyHolder):
         """ Remove a storage pool from config file.  """
         try:
             pool = self.pools[name]
+            volumes = [(vm, volume) for vm in self.domains
+                for volume in vm.volumes.values()
+                    if volume.pool is pool]
+            if volumes:
+                raise qubes.exc.QubesPoolInUseError(pool)
+            prop_suffixes = ['', '_kernel', '_private', '_root', '_volatile']
+            for suffix in prop_suffixes:
+                if getattr(self, 'default_pool' + suffix, None) is pool:
+                    raise qubes.exc.QubesPoolInUseError(pool,
+                        'Storage pool is in use: set as {}'.format(
+                            'default_pool' + suffix))
             yield from self.fire_event_async('pool-pre-delete',
                 pre_event=True, pool=pool)
             del self.pools[name]

+ 7 - 0
qubes/exc.py

@@ -116,6 +116,13 @@ class QubesNoTemplateError(QubesVMError):
             msg or 'Template for the domain {!r} not found'.format(vm.name))
 
 
+class QubesPoolInUseError(QubesException):
+    '''VM is in use, cannot remove.'''
+    def __init__(self, pool, msg=None):
+        super(QubesPoolInUseError, self).__init__(
+            msg or 'Storage pool is in use: {!r}'.format(pool.name))
+
+
 class QubesValueError(QubesException, ValueError):
     '''Cannot set some value, because it is invalid, out of bounds, etc.'''