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

Reply via email to