diff --git a/qubes/devices.py b/qubes/devices.py index 56b5bb524..f095f41d7 100644 --- a/qubes/devices.py +++ b/qubes/devices.py @@ -517,9 +517,12 @@ def serialize(self) -> bytes: properties += b' ' + interfaces_prop if self.parent_device is not None: - parent_ident = serialize_str(self.parent_device.ident) - parent_prop = (b'parent=' + parent_ident.encode('ascii')) - properties += b' ' + parent_prop + ident = serialize_str(self.parent_device.ident) + ident_prop = (b'parent_ident=' + ident.encode('ascii')) + properties += b' ' + ident_prop + devclass = serialize_str(self.parent_device.devclass) + devclass_prop = (b'parent_devclass=' + devclass.encode('ascii')) + properties += b' ' + devclass_prop data = b' '.join( f'_{prop}={serialize_str(value)}'.encode('ascii') @@ -609,11 +612,14 @@ def _deserialize( for i in range(0, len(interfaces), 7)] properties['interfaces'] = interfaces - if 'parent' in properties: + if 'parent_ident' in properties: properties['parent'] = Device( backend_domain=expected_backend_domain, - ident=properties['parent'] + ident=properties['parent_ident'], + devclass=properties['parent_devclass'], ) + del properties['parent_ident'] + del properties['parent_devclass'] return cls(**properties) diff --git a/qubes/ext/block.py b/qubes/ext/block.py index 635f979cd..19b4fb9ce 100644 --- a/qubes/ext/block.py +++ b/qubes/ext/block.py @@ -422,12 +422,14 @@ def on_device_pre_attached_block(self, vm, event, device, options): ) elif option == 'parent_identity': identity = value - if device.parent.self_identity != identity: + p = device.parent_device + parent_info = p.backend_domain.devices[p.devclass][p.ident] + if parent_info.self_identity != identity: print("Unrecognized parent identity, skipping attachment of" f" {device}", file=sys.stderr) raise qubes.devices.UnrecognizedDevice( f"Parent device of {device} presents identity that" - f" {device.parent.self_identity} " + f" {parent_info.self_identity} " f"does not match expected {identity}" ) else: