SRU request submitted to the Ubuntu kernel team mailing list for impish,
hirsute and focal:
https://lists.ubuntu.com/archives/kernel-team/2021-November/thread.html#125581
Changing status to 'In Progress' for impish, hirsute and focal.
** Changed in: linux (Ubuntu Impish)
Status: New => In Progress
** Changed in: linux (Ubuntu Hirsute)
Status: New => In Progress
** Changed in: linux (Ubuntu Focal)
Status: New => In Progress
** Changed in: linux (Ubuntu Impish)
Assignee: (unassigned) => Canonical Kernel Team (canonical-kernel-team)
** Changed in: linux (Ubuntu Hirsute)
Assignee: (unassigned) => Canonical Kernel Team (canonical-kernel-team)
** Changed in: linux (Ubuntu Focal)
Assignee: (unassigned) => Canonical Kernel Team (canonical-kernel-team)
** Description changed:
+ SRU Justification:
+ ==================
+
+ [Impact]
+
+ * The kernel is unable to read partitions on virtio-block DASD (on KVM).
+ That's a severe situation, since it prevents Ubuntu from starting, if
installed on a DASD.
+ This issue can either occur after a fresh installation or after an upgrade.
+
+ * The virtio specification virtio-v1.1-cs01 states: "Transitional devices
+ MUST detect Legacy drivers by detecting that VIRTIO_F_VERSION_1 has not
+ been acknowledged by the driver."
+ And this is what QEMU as of 6.1 has done relying solely on
+ VIRTIO_F_VERSION_1 for detecting that.
+
+ * But the specification also says: "... the driver MAY read (but MUST
+ NOT write) the device-specific configuration fields to check that it can
+ support the device ..." before setting FEATURES_OK.
+
+ * In this case, any transitional device relying solely on VIRTIO_F_VERSION_1
+ for detecting legacy drivers will return data in legacy format.
+ In particular, this implies that it's in big endian format for
+ big endian guests. This naturally confuses the driver that expects
+ little endian in the modern mode.
+
+ * VIRTIO_F_VERSION_1 can only be relied on after the feature negotiation
+ is done.
+
+ * 'verify' is called before virtio_finalize_features(), so a transitional
+ s390 virtio device still serves native endian (i.e. big endian) config
space,
+ while the driver knows that it is going to accept VERSION_1,
+ so when reading the config space, it assumes it got little endian, and
byteswaps.
+
+ * For QEMU, we can work around the issue by writing out the feature bits with
+ VIRTIO_F_VERSION_1 bit set. We (ab)use the finalize_features config op for
+ this. This isn't enough to address all vhost devices since these do not get
+ the features until FEATURES_OK, however it looks like the affected devices
+ actually never handled the endianness for legacy mode correctly, so at least
+ that's not a regression.
+
+ [Fix]
+
+ * 2f9a174f918e29608564c7a4e8329893ab604fb4 2f9a174f918e "virtio: write
+ back F_VERSION_1 before validate"
+
+ [Test Case]
+
+ * Setup an IBM Z or LinuxONE LPAR with Ubuntu Server 20.04 as KVM host.
+
+ * This Ubuntu KVM host can either be installed on FCP or DASD storage,
+ but at least one DASD disk need to be reserved for a KVM guest.
+
+ * Now hand over the reserved DASD disk (low-level formatted using dasdfmt
+ and partitioned using fdasd) using 'virtio-block' to a KVM virtual machine
+ (e.g. using a virsh VM config).
+
+ * Try to install an Ubuntu KVM virtual machine using this DASD disk,
+ that includes the check and read of the partition table.
+
+ [Where problems could occur]
+
+ * First of all requested commit contains one additional if statement;
+ and is due tothat relatively traceable.
+
+ * But the change is in /drivers/virtio/virtio.c, means in common code!
+
+ * This issue obviously affects big endian systems only.
+
+ * But if done wrong, it may effect in worst-case little endian systems,
+ too!
+
+ * But the if statement explicitly checks for
+ '!virtio_legacy_is_little_endian()'.
+
+ * Only virtio net and virtio blk devices seem to be affected.
+
+ * And the commit/solutions was in-depth discussed upstream here:
+
https://lore.kernel.org/all/[email protected]/t/#u
+
+ [Other]
+
+ * Patches are upstream accepted with since 5.15-rc6
+ and tagged for upstream stable #v4.11.
+ Hence jammy is not affected.
+
+ * Request was to add the patches to focal / 20.04,
+ but to avoid potential regressions on upgrades,
+ the patches need to be added to impish and hirsute, too.
+
+ * Fortunately cherry-picking the commit works cleanly
+ from all the affected Ubuntu releases.
+
+ __________
+
Description: kernel: unable to read partitions on virtio-block dasd (kvm)
Symptom: unable to read partitions on virtio-block dasd (kvm)
Problem: verify is called before virtio_finalize_features() , so a
- transitional s390 virtio device still serves native endian
- (i.e. big endian) config space, while the driver knows that it
- is going to accept VERSION_1, so when reading the config space,
- it assumes it got little endian, and byteswaps.
+ transitional s390 virtio device still serves native endian
+ (i.e. big endian) config space, while the driver knows that it
+ is going to accept VERSION_1, so when reading the config space,
+ it assumes it got little endian, and byteswaps.
Solution: For QEMU, we can work around the issue by writing out the
- feature bits with VIRTIO_F_VERSION_1 bit set. We (ab)use the
- finalize_features config op for this. This isn't enough to
- address all vhost devices since these do not get the features
- until FEATURES_OK, however it looks like the affected devices
- actually never handled the endianness for legacy mode correctly,
- so at least that's not a regression.
+ feature bits with VIRTIO_F_VERSION_1 bit set. We (ab)use the
+ finalize_features config op for this. This isn't enough to
+ address all vhost devices since these do not get the features
+ until FEATURES_OK, however it looks like the affected devices
+ actually never handled the endianness for legacy mode correctly,
+ so at least that's not a regression.
** Changed in: ubuntu-z-systems
Status: Triaged => In Progress
--
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1950144
Title:
[UBUNTU 20.04] kernel: unable to read partitions on virtio-block dasd
(kvm)
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu-z-systems/+bug/1950144/+subscriptions
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs