On 03/05/2019 18:15, Andre Przywara wrote: > clang and GCC9 refuse to compile virtio/blk.c with the following message: > virtio/blk.c:161:37: error: taking address of packed member 'geometry' of class > or structure 'virtio_blk_config' may result in an unaligned pointer value > [-Werror,-Waddress-of-packed-member] > struct virtio_blk_geometry *geo = &conf->geometry; > > Since struct virtio_blk_geometry is in a kernel header, we can't do much > about the packed attribute, but as Peter pointed out, the solution is > rather simple: just get rid of the convenience variable and use the > original struct member directly. > > Suggested-by: Peter Maydell <peter.maydell@xxxxxxxxxx> > Signed-off-by: Andre Przywara <andre.przywara@xxxxxxx> Reviewed-by: Jean-Philippe Brucker <jean-philippe.brucker@xxxxxxx> I just encountered this one with GCC 9.1 > --- > virtio/blk.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/virtio/blk.c b/virtio/blk.c > index 50db6f5f..f267be15 100644 > --- a/virtio/blk.c > +++ b/virtio/blk.c > @@ -161,7 +161,6 @@ static void set_guest_features(struct kvm *kvm, void *dev, u32 features) > { > struct blk_dev *bdev = dev; > struct virtio_blk_config *conf = &bdev->blk_config; > - struct virtio_blk_geometry *geo = &conf->geometry; > > bdev->features = features; > > @@ -170,7 +169,8 @@ static void set_guest_features(struct kvm *kvm, void *dev, u32 features) > conf->seg_max = virtio_host_to_guest_u32(&bdev->vdev, conf->seg_max); > > /* Geometry */ > - geo->cylinders = virtio_host_to_guest_u16(&bdev->vdev, geo->cylinders); > + conf->geometry.cylinders = virtio_host_to_guest_u16(&bdev->vdev, > + conf->geometry.cylinders); > > conf->blk_size = virtio_host_to_guest_u32(&bdev->vdev, conf->blk_size); > conf->min_io_size = virtio_host_to_guest_u16(&bdev->vdev, conf->min_io_size); >