From: Omar Sandoval Date: Thu, 7 Sep 2017 17:58:21 +0000 (-0700) Subject: loop: update block size tests for new ioctl X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=282178ef1442c2997395e382c39ebb782180bf7f;p=users%2Fsagi%2Fblktests.git loop: update block size tests for new ioctl Signed-off-by: Omar Sandoval --- diff --git a/common/loop b/common/loop index eb8027c..16cc321 100644 --- a/common/loop +++ b/common/loop @@ -18,30 +18,11 @@ # along with this program. If not, see . -_have_lo_flags_blocksize() { - local tmpfile loop_dev - - # XXX: $TMPDIR isn't set up for requires(), should it be? - if ! tmpfile="$(mktemp "blktests.${TEST_NAME//\//.}.XXX")" || - ! truncate -s 1M "$tmpfile"; then - SKIP_REASON="could not create temporary file" - return 1 - fi - - if ! loop_dev="$(losetup -f --show "$tmpfile" 2>/dev/null)"; then - SKIP_REASON="could not get loop device" - rm -f "$tmpfile" +_have_loop_set_block_size() { + src/loblksize "$(losetup -f)" 512 &>/dev/null + if [[ $? -eq 2 ]]; then + SKIP_REASON="kernel does not support LOOP_SET_BLOCK_SIZE" return 1 fi - - if ! src/loblksize "$loop_dev" >/dev/null 2>&1; then - SKIP_REASON="kernel does not support LO_FLAGS_BLOCKSIZE" - losetup -d "$loop_dev" - rm -f "$tmpfile" - return 1 - fi - - losetup -d "$loop_dev" - rm -f "$tmpfile" return 0 } diff --git a/src/loblksize.c b/src/loblksize.c index 45d9939..7d9ec55 100644 --- a/src/loblksize.c +++ b/src/loblksize.c @@ -9,65 +9,42 @@ #include #include -/* LO_FLAGS_BLOCKSIZE is an enum so we can't ifdef. */ -#define LO_FLAGS_BLOCKSIZE_ 32 - -#ifndef LO_INFO_BLOCKSIZE -#define LO_INFO_BLOCKSIZE(l) (l)->lo_init[0] +#ifndef LOOP_SET_BLOCK_SIZE +#define LOOP_SET_BLOCK_SIZE 0x4C09 #endif int main(int argc, char **argv) { - struct loop_info64 lo; unsigned long long blksize; char *end; int fd = -1; - bool set = argc >= 3; - int status = EXIT_FAILURE; - if (argc != 2 && argc != 3) { + if (argc != 3) { fprintf(stderr, "usage: %s DEV [BLKSIZE]\n", argv[0]); - return EXIT_FAILURE; + return 1; } - if (set) { - errno = 0; - blksize = strtoull(argv[2], &end, 0); - if (errno || *end) { - fprintf(stderr, "invalid block size\n"); - return EXIT_FAILURE; - } + errno = 0; + blksize = strtoull(argv[2], &end, 0); + if (errno || *end) { + fprintf(stderr, "invalid block size\n"); + return 1; } - fd = open(argv[1], O_RDONLY); + fd = open(argv[1], O_RDWR); if (fd == -1) { perror("open"); - return EXIT_FAILURE; - } - - if (ioctl(fd, LOOP_GET_STATUS64, &lo) == -1) { - perror("LOOP_GET_STATUS64"); - goto out; + return 1; } - if (!(lo.lo_flags & LO_FLAGS_BLOCKSIZE_)) { - fprintf(stderr, "LO_FLAGS_BLOCKSIZE not supported"); - goto out; - } + if (ioctl(fd, LOOP_SET_BLOCK_SIZE, blksize) == -1) { + int status = errno == EINVAL ? 2 : 1; - if (set) { - lo.lo_flags |= LO_FLAGS_BLOCKSIZE_; - LO_INFO_BLOCKSIZE(&lo) = blksize; - if (ioctl(fd, LOOP_SET_STATUS64, &lo) == -1) { - perror("LOOP_SET_STATUS64"); - goto out; - } - } else { - printf("%llu\n", LO_INFO_BLOCKSIZE(&lo)); + perror("LOOP_SET_BLOCK_SIZE"); + close(fd); + return status; } - status = EXIT_SUCCESS; -out: close(fd); - return status; + return 0; } diff --git a/tests/loop/002 b/tests/loop/002 index 8f03070..2a16dba 100755 --- a/tests/loop/002 +++ b/tests/loop/002 @@ -28,7 +28,7 @@ DESCRIPTION="try various loop device block sizes" QUICK=1 requires() { - _have_program xfs_io && _have_src_program loblksize && _have_lo_flags_blocksize + _have_program xfs_io && _have_src_program loblksize && _have_loop_set_block_size } test() { @@ -51,13 +51,10 @@ test() { dd if="$loop_dev" bs="$blksize" count=1 iflag=direct status=none | sha256sum fi fi - local loop_get_status="$(src/loblksize "$loop_dev")" - local logical_block_size="$(cat "$sysfs/queue/logical_block_size")" - local physical_block_size="$(cat "$sysfs/queue/physical_block_size")" - local minimum_io_size="$(cat "$sysfs/queue/minimum_io_size")" - echo "LOOP_GET_STATUS=$loop_get_status queue/logical_block_size=$logical_block_size queue/physical_block_size=$physical_block_size queue/minimum_io_size=$minimum_io_size" + cat "$sysfs/queue/logical_block_size" done + sync losetup -d "$loop_dev" echo "Test complete" diff --git a/tests/loop/002.out b/tests/loop/002.out index 926347e..4c85620 100644 --- a/tests/loop/002.out +++ b/tests/loop/002.out @@ -1,19 +1,19 @@ Running loop/002 Checking default block size -LOOP_GET_STATUS=512 queue/logical_block_size=512 queue/physical_block_size=512 queue/minimum_io_size=512 +512 Setting block size to 4096 769bd186841c10e5b1106b55986206c0e87fc05a7f565fdee01b5abcaff6ae78 - -LOOP_GET_STATUS=4096 queue/logical_block_size=4096 queue/physical_block_size=4096 queue/minimum_io_size=4096 +4096 Setting block size to 2048 0ca3bfdeda1ef5036bfa5dad078a9f15724e79cf296bd4388cf786bfaf4195d0 - -LOOP_GET_STATUS=2048 queue/logical_block_size=2048 queue/physical_block_size=2048 queue/minimum_io_size=2048 +2048 Setting block size to 1234 -LOOP_SET_STATUS64: Invalid argument -LOOP_GET_STATUS=2048 queue/logical_block_size=2048 queue/physical_block_size=2048 queue/minimum_io_size=2048 +LOOP_SET_BLOCK_SIZE: Invalid argument +2048 Setting block size to 1024 cfa35bcc2f57149955e5e4f666e1bda1318596e8b6306e9055087643beb9f190 - -LOOP_GET_STATUS=1024 queue/logical_block_size=1024 queue/physical_block_size=1024 queue/minimum_io_size=1024 +1024 Setting block size to 512 58b991c23d339f9d25eccb315cf8ba9edb608bb60be3be6c73b03a4481dc7682 - -LOOP_GET_STATUS=512 queue/logical_block_size=512 queue/physical_block_size=512 queue/minimum_io_size=512 +512 Test complete diff --git a/tests/loop/004 b/tests/loop/004 index c5c96e4..8dcc851 100755 --- a/tests/loop/004 +++ b/tests/loop/004 @@ -24,7 +24,7 @@ DESCRIPTION="combine loop direct I/O mode and a custom block size" QUICK=1 requires() { - _have_program xfs_io && _have_scsi_debug && _have_src_program loblksize && _have_lo_flags_blocksize + _have_program xfs_io && _have_scsi_debug && _have_src_program loblksize && _have_loop_set_block_size } test() {