@@ -1643,6 +1643,8 @@ def on_domain_pre_deleted(self, event, vm):
16431643        :param qubes.vm.QubesVM name: Qube name. 
16441644        """ 
16451645        # pylint: disable=unused-argument 
1646+         preloads  =  set ()
1647+         dependencies  =  []
16461648        for  obj  in  itertools .chain (self .domains , (self ,)):
16471649            if  obj  is  vm :
16481650                # allow removed VM to reference itself 
@@ -1653,18 +1655,32 @@ def on_domain_pre_deleted(self, event, vm):
16531655                        isinstance (prop , qubes .vm .VMProperty )
16541656                        and  getattr (obj , prop .__name__ ) ==  vm 
16551657                    ):
1656-                         self .log .error (
1657-                             "Cannot remove %s, used by %s.%s" ,
1658-                             vm ,
1659-                             obj ,
1660-                             prop .__name__ ,
1661-                         )
1662-                         raise  qubes .exc .QubesVMInUseError (
1663-                             vm ,
1664-                             "Domain is in use: {!r};" 
1665-                             "see 'journalctl -u qubesd -e' in dom0 for " 
1666-                             "details" .format (vm .name ),
1667-                         )
1658+                         if  getattr (obj , "is_preload" , False ) and  (
1659+                             prop .__name__  ==  "template" 
1660+                             or  (
1661+                                 prop .__name__  ==  "default_dispvm" 
1662+                                 and  getattr (obj , "template" , None ) ==  vm 
1663+                             )
1664+                         ):
1665+                             preloads .add (obj .name )
1666+                             continue 
1667+                         if  isinstance (obj , qubes .app .Qubes ):
1668+                             dependencies .insert (0 , ('"GLOBAL"' , prop .__name__ ))
1669+                         elif  not  obj .property_is_default (prop ):
1670+                             dependencies .append ((obj .name , prop .__name__ ))
1671+         if  dependencies :
1672+             self .log .error (
1673+                 "Cannot remove %s as it is used by %s" ,
1674+                 vm ,
1675+                 ", " .join (
1676+                     ":" .join (str (i ) for  i  in  tup ) for  tup  in  dependencies 
1677+                 ),
1678+             )
1679+             raise  qubes .exc .QubesVMInUseError (
1680+                 vm ,
1681+                 "Domain is in use: {!r};  see 'journalctl -u qubesd -e' in dom0" 
1682+                 " for details" .format (vm .name ),
1683+             )
16681684        if  isinstance (vm , qubes .vm .qubesvm .QubesVM ):
16691685            assignments  =  vm .get_provided_assignments ()
16701686        else :
@@ -1675,6 +1691,9 @@ def on_domain_pre_deleted(self, event, vm):
16751691                vm , "VM has devices assigned to other VMs: "  +  desc 
16761692            )
16771693
1694+         if  preloads :
1695+             vm .remove_preload_excess (0 , reason = "domain will be deleted" )
1696+ 
16781697    @qubes .events .handler ("domain-delete" ) 
16791698    def  on_domain_deleted (self , event , vm ):
16801699        # pylint: disable=unused-argument 
0 commit comments