vdev_geom may associate multiple vdevs per g_consumer
vdev_geom.c currently uses the g_consumer's private field to point to a
vdev_t. That way, a GEOM event can cause a change to a ZFS vdev. For
example, when you remove a disk, the vdev's status will change to REMOVED.
However, vdev_geom will sometimes attach multiple vdevs to the same GEOM
consumer. If this happens, then geom events will only be propagated to one
of the vdevs.
Fix this by storing a linked list of vdevs in g_consumer's private field.
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
- g_consumer.private now stores a linked list of vdev pointers
associated with the consumer instead of just a single vdev pointer.
- Change vdev_geom_set_physpath's signature to more closely match
vdev_geom_set_rotation_rate
- Don't bother calling g_access in vdev_geom_set_physpath. It's
guaranteed that we've already accessed the consumer by the time we get here.
- Don't call vdev_geom_set_physpath in vdev_geom_attach. Instead,
call it in vdev_geom_open, after we know that the open has succeeded.
PR: 218634
I'm always in the habit of putting the links at the beginning of the struct. It doesn't matter for singly linked structs, but with doubly linked, this increases the chances that both links are in the same cache line.