]> www.infradead.org Git - users/sagi/blktests.git/commitdiff
src/miniublk: fix logical block size setting
authorAkinobu Mita <akinobu.mita@gmail.com>
Sat, 4 Nov 2023 12:17:42 +0000 (21:17 +0900)
committerShin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Tue, 7 Nov 2023 00:43:33 +0000 (09:43 +0900)
The miniublk always sets the logical block size to 512 bytes when setting
a regular file-backed loop target.
A test fails if the regular file is on a filesystem built on a block
device with a logical block size of 4KB.

$ cd blktests
$ modprobe -r scsi_debug
$ modprobe scsi_debug sector_size=4096 dev_size_mb=2048
$ mkfs.ext4 /dev/sdX
$ mount /dev/sdX results/
$ ./check ublk/003

The logical block size of the ublk block device is set to 512 bytes,
so a request that is not 4KB aligned may occur, and the miniublk will
attempt to process it with direct IO and fail.

The original ublk program already fixed this problem by determining
the logical block size to set based on the block device to which the
target regular file belongs.

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
src/miniublk.c

index 1c97668e9ff3dc52ba72fd198029def5aa1e378a..565aa608ce9e63a7465e017b3b0869faea252f10 100644 (file)
@@ -1440,6 +1440,8 @@ static int ublk_loop_tgt_init(struct ublk_dev *dev)
                p.basic.physical_bs_shift = ilog2(pbs);
        } else if (S_ISREG(st.st_mode)) {
                bytes = st.st_size;
+               p.basic.logical_bs_shift = ilog2(st.st_blksize);
+               p.basic.physical_bs_shift = ilog2(st.st_blksize);
        } else {
                bytes = 0;
        }
@@ -1512,6 +1514,8 @@ static int ublk_loop_tgt_recover(struct ublk_dev *dev)
                        return -1;
        } else if (S_ISREG(st.st_mode)) {
                bytes = st.st_size;
+               bs = st.st_blksize;
+               pbs = st.st_blksize;
        } else {
                bytes = 0;
        }