On 09/13/2017 02:26 PM, Eric Blake wrote: > On 09/13/2017 11:03 AM, Eric Blake wrote: >> Any device that has request_alignment greater than 512 should be >> unable to report status at a finer granularity; it may also be >> simpler for such devices to be guaranteed that the block layer >> has rounded things out to the granularity boundary (the way the >> block layer already rounds all other I/O out). Besides, getting >> the code correct for super-sector alignment also benefits us >> for the fact that our public interface now has byte granularity, >> even though none of our drivers have byte-level callbacks. >> >> Add an assertion in blkdebug that proves that the block layer >> never requests status of unaligned sections, similar to what it >> does on other requests (while still keeping the generic helper >> in place for when future patches add a throttle driver). Note >> that iotest 177 already covers this (it would fail if you use >> just the blkdebug.c hunk without the io.c changes). Meanwhile, >> we can drop assertions in callers that no longer have to pass >> in sector-aligned addresses. > > Bummer - 'git bisect' says this patch causes iotests 190 to hang. I'm > investigating root cause, but I'll have to post a fixup once I figure it > out. Found it: > + /* Round out to request_alignment boundaries */ > + align = MAX(bs->bl.request_alignment, BDRV_SECTOR_SIZE); > + aligned_offset = QEMU_ALIGN_DOWN(offset, align); > + aligned_bytes = ROUND_UP(offset + bytes, align) - aligned_offset; ROUND_UP(64-bit, 32-bit) has a subtle bug: it truncates the operation at 32 bits, instead of producing a 64-bit result. Using QEMU_ROUND_UP instead does NOT have the bug. That's a ticking time bomb, so I'll patch ROUND_UP() directly as a pre-requisite, then reply to the cover letter with a Based-on tag. -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org