On Wed, 02/25 09:12, Max Reitz wrote: > Because I need a Notifier pointer to give to > blk_add_{insert,remove}_bs_notifier(), and most importantly because the only > "opaque" object the callbacks will receive is that Notifier pointer (which > in this case is actually a DataPlaneBlkChangeNotifier pointer). I cannot > influence the @data parameter, and I cannot (easily) identify the > VirtIOBlockDataPlane object from the BlockBackend (which is @data) alone.
Probably like this: struct VirtIOBlockDataPlane { ... Notifier insert_notifier, remove_notifier; ... }; static void data_plane_blk_insert_notifier(Notifier *n, void *data) { VirtIOBlockDataPlane *s = container_of(n, VirtIOBlockDataPlane, insert_notifier); assert(s->conf->conf.blk == data); data_plane_set_up_op_blockers(s); } void virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *conf, VirtIOBlockDataPlane **dataplane, { ... s->insert_notifier.notify = data_plane_blk_insert_notifier; blk_add_insert_bs_notifier(conf->conf.blk, &s->insert_notifier); ... } ? > Won't virtio_scsi_hotunplug() (which frees s->{insert,remove}_notifier) be > called before a second device is plugged? > No, multiple SCSIDevice objects (scsi-disk, scsi-generic, etc...) can be attached to the same virtio-scsi bus. Fam