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> --- 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); -- 2.17.1