APPLIED: [PATCH 0/1] [focal:linux, groovy:linux, hirsute:linux, impish:linux] block: return the correct bvec when checking for gaps
tim.gardner at canonical.com
Fri Jul 30 11:46:30 UTC 2021
On 7/30/21 3:51 AM, Kleber Souza wrote:
> On 29.07.21 14:14, Tim Gardner wrote:
>> Applied to focal:linux, hirsute:linux. Thanks.
>> groovy: Won't fix
>> Impish: already upstream
>> Looks like this got missed in previous cycle, nor is there a Trello
>> "Mailing List" card.
> This patch was deliberately postponed because of the relatively high
> risk for the point release kernels, as documented on the Trello
No good deed goes unpunished. I did look through the Trello cards, at
least the ones in "Mailing List". The search option is a little funky.
It dropped down a results column right on top of the lane that contained
the card, just enough so that I didn't see it. Guess that's one of
Trello's more endearing quirks.
How do you want to deal with this so that someone remembers to re-apply
it weeks from now in the next cycle ?
>> On 7/6/21 11:14 AM, Tim Gardner wrote:
>>> There is a bug in the Linux block layer responsible for merging BIOs
>>> that go
>>> across the page boundary. This bug was introduced in Linux 5.1 when
>>> the block
>>> layer BIO page tracking is enhanced to support multiple pages.
>>> Without this patch, data corruption can occur. The change to the
>>> kernel block
>>> layer in Linux 5.1 changes the way multiple pages are merged to a
>>> single block
>>> I/O descriptor, and how contiguous block I/O descriptors are merged
>>> with previous
>>> If contiguous block I/O requests cross a page boundary of 4k, defined
>>> by the hv_storvsc
>>> driver, the new block merge process can create two pages of block I/O
>>> requests (the
>>> latter page with an offset) that refer to the same physical sector on
>>> disk. This page list
>>> is then assembled for the SCSI generic driver.
>>> In the above scenario, when the block I/O request sizes are 512
>>> bytes, the Azure LIS driver
>>> (hv_storvsc module) is not able to correctly parse the page array
>>> from the SCSI generic
>>> driver due to this bug in Linux block layer and creates a potential
>>> overflow of
>>> offset I/O requests and corruption of data on disk.
>>> Mitigation of data loss is proven with filesystems with block size
>>> 4k. When block
>>> I/O requests are of sizes 4k or multiples of 4k, they are the page
>>> aligned in the
>>> memory and are not affected by the block I/O merging algorithm
>>> introduced in Linux
>>> 5.1. Most modern file systems use 4k I/O block size by default, thus
>>> this problem.
>>> An upstream patch fixes this bug: commit
>>> ("block: return the correct bvec when checking for gaps")
>>> Please include this patch in any supported kernels that are 5.1 or
>>> [Test Plan]
>>> stress-ng --sequential 8 --class io -t 5m --times
>>> [Where problems could occur]
>>> Different incorrect pages could be wriiten to disk.
>>> [Other Info]
>>> This patch has already been released in all [FGHI] Azure kernels.
More information about the kernel-team