On Aug 05, 2026 / 21:46, Shin'ichiro Kawasaki wrote:
> Cc+: 0wnerD1ed
> 
> On Jul 20, 2026 / 13:10, Keith Busch wrote:
> > From: Keith Busch <[email protected]>
> > 
> > The bio-based drivers don't necessarily check the alignment split, and
> > stacking block drivers don't always handle a misalignment detected after
> > submitting the bio. Validate user vectors against the device's
> > dma_alignment as the bio is built from the iov_iter, rejecting
> > misaligned early with -EINVAL.
> 
> Recently, the new test case block/045 was added to blkests through a GitHub PR
> [1]. The test case passes with the Linux master branch tags v7.2-rcX. Today, I
> found that it fails with block/for-next branch tip [2]. I bisected and found
> that this patch triggers the failure.
> 
> 0wnerDied, Keith, may I ask your help to resolve the failure? I'm guessing
> the test case needs to care device's dma alignment, but not so sure.

I took a closer look. I modified the test case to respect the dma alignment [*],
and now the test case passes. This approach looks working. Will post the change
as a formal patch for review.

[*] fix trial patch for blktests

diff --git a/src/bio-full-trim.c b/src/bio-full-trim.c
index e304b2c..7cea3f9 100644
--- a/src/bio-full-trim.c
+++ b/src/bio-full-trim.c
@@ -12,20 +12,38 @@
 #include <sys/mman.h>
 #include <unistd.h>
 
+int msb(unsigned int v)
+{
+       unsigned int b = 0;
+
+       while (v >>= 1)
+               b++;
+
+       return b;
+}
+
 int main(int argc, char **argv)
 {
        unsigned int block_size;
        unsigned char *p;
        long page_size;
+       unsigned int dma_alignment;
+       unsigned int dma_aligned_offset;
        ssize_t ret;
        int fd;
 
-       if (argc != 2)
+       if (argc != 3)
                return EXIT_FAILURE;
+
        page_size = sysconf(_SC_PAGESIZE);
        if (page_size <= 0)
                errx(EXIT_FAILURE, "invalid page size");
 
+       dma_alignment = atoi(argv[2]);
+       dma_aligned_offset = 1 << (msb(dma_alignment) + 1);
+       if (dma_aligned_offset >= page_size)
+               err(EXIT_FAILURE, "unexpected dma_alignment");
+
        fd = open(argv[1], O_RDONLY | O_DIRECT);
        if (fd < 0)
                err(EXIT_FAILURE, "open %s", argv[1]);
@@ -40,7 +58,7 @@ int main(int argc, char **argv)
                err(EXIT_FAILURE, "mprotect");
 
        errno = 0;
-       ret = pread(fd, p + page_size - 1, block_size, 0);
+       ret = pread(fd, p + page_size - dma_aligned_offset, block_size, 0);
        if (ret == -1 && errno == EFAULT)
                return EXIT_SUCCESS;
        errx(EXIT_FAILURE, "pread returned %zd (errno %d)", ret, errno);
diff --git a/tests/block/045 b/tests/block/045
index 65bfcb9..6e112b6 100755
--- a/tests/block/045
+++ b/tests/block/045
@@ -25,7 +25,8 @@ test() {
                return 1
        fi
 
-       if ! src/bio-full-trim /dev/nullb1; then
+       if ! src/bio-full-trim /dev/nullb1 \
+            $(< /sys/block/nullb1/queue/dma_alignment); then
                echo "bio-full-trim helper failed"
        fi
 
-- 
2.55.0


Reply via email to