]> www.infradead.org Git - users/hch/xfstests-dev.git/commitdiff
src/min_dio_alignment: don't return invalid dio_offset_align
authorChao Yu <chao@kernel.org>
Wed, 11 Sep 2024 03:53:33 +0000 (11:53 +0800)
committerZorro Lang <zlang@kernel.org>
Tue, 8 Oct 2024 03:20:59 +0000 (11:20 +0800)
If returned parameters of statx() are: a)STATX_DIOALIGN is set in
stx_mask, b)stx.stx_dio_offset_align is zero, it indicates filesystem
supports DIO, but the file doesn't.

It needs to avoid returning zeroed stx.stx_dio_offset_align value,
instead, we can fallthrough to get alignment size of block device or
page size, otherwise, it may cause potential deadloop, e.g.
generic/465:

align=stx_dio_offset_align(it equals to zero)
page_size=4096
while [ $align -le $page_size ]; do
    echo "$AIO_TEST -a $align -d $testfile.$align" >> $seqres.full
    $AIO_TEST -a $align -d $testfile.$align 2>&1 | tee -a $seqres.full
    align=$((align * 2))
done

Cc: Christoph Hellwig <hch@lst.de>
Cc: Eric Biggers <ebiggers@kernel.org>
Signed-off-by: Chao Yu <chao@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Zorro Lang <zlang@kernel.org>
src/min_dio_alignment.c

index 5a7c7d9f241b7ed413fc4ad8aee1133d00d5471e..866fba1546c4a2b31edfc7a6bfe5550088c56955 100644 (file)
@@ -28,7 +28,7 @@ static int min_dio_alignment(const char *mntpnt, const char *devname)
        fd = open(mntpnt, O_TMPFILE | O_RDWR | O_EXCL, 0600);
        if (fd >= 0 &&
            xfstests_statx(fd, "", AT_EMPTY_PATH, STATX_DIOALIGN, &stx) == 0 &&
-           (stx.stx_mask & STATX_DIOALIGN))
+           (stx.stx_mask & STATX_DIOALIGN) && stx.stx_dio_offset_align != 0)
                return stx.stx_dio_offset_align;
 
        /*