From e6918187568dbd01842d8d1d2c808ce16a894239 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 21 Apr 2024 13:54:28 +0200 Subject: Adding upstream version 18.2.2. Signed-off-by: Daniel Baumann --- src/spdk/test/dd/posix.sh | 122 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100755 src/spdk/test/dd/posix.sh (limited to 'src/spdk/test/dd/posix.sh') diff --git a/src/spdk/test/dd/posix.sh b/src/spdk/test/dd/posix.sh new file mode 100755 index 000000000..15346d8d3 --- /dev/null +++ b/src/spdk/test/dd/posix.sh @@ -0,0 +1,122 @@ +#!/usr/bin/env bash +testdir=$(readlink -f "$(dirname "$0")") +rootdir=$(readlink -f "$testdir/../../") +source "$testdir/common.sh" + +cleanup() { + rm -f "$test_file0"{,.link} + rm -f "$test_file1"{,.link} +} + +append() { + local dump0 + local dump1 + + dump0=$(gen_bytes 32) + dump1=$(gen_bytes 32) + + printf '%s' "$dump0" > "$test_file0" + printf '%s' "$dump1" > "$test_file1" + + "${DD_APP[@]}" --if="$test_file0" --of="$test_file1" --oflag=append + + [[ $(< "$test_file1") == "${dump1}${dump0}" ]] +} + +directory() { + NOT "${DD_APP[@]}" --if="$test_file0" --iflag=directory --of="$test_file0" + NOT "${DD_APP[@]}" --if="$test_file0" --of="$test_file0" --oflag=directory +} + +nofollow() { + local test_file0_link=$test_file0.link + local test_file1_link=$test_file1.link + + ln -fs "$test_file0" "$test_file0_link" + ln -fs "$test_file1" "$test_file1_link" + + NOT "${DD_APP[@]}" --if="$test_file0_link" --iflag=nofollow --of="$test_file1" + NOT "${DD_APP[@]}" --if="$test_file0" --of="$test_file1_link" --oflag=nofollow + + # Do an extra step of checking if we actually can follow symlinks + gen_bytes 512 > "$test_file0" + + "${DD_APP[@]}" --if="$test_file0_link" --of="$test_file1" + [[ $(< "$test_file0") == "$(< "$test_file1")" ]] +} + +noatime() { + local atime_if + local atime_of + + # It seems like spdk_dd doesn't update the atime in case 0 bytes are copied. + # This differs from how standard dd works for instance + gen_bytes 512 > "$test_file0" + + atime_if=$(stat --printf="%X" "$test_file0") + atime_of=$(stat --printf="%X" "$test_file1") + + "${DD_APP[@]}" --if="$test_file0" --iflag=noatime --of="$test_file1" + ((atime_if == $(stat --printf="%X" "$test_file0"))) + ((atime_of == $(stat --printf="%X" "$test_file1"))) + + "${DD_APP[@]}" --if="$test_file0" --of="$test_file1" + ((atime_if < $(stat --printf="%X" "$test_file0"))) +} + +io() { + local flags_ro flags_rw flag_ro flag_rw + + # O_NONBLOCK is actually a no-op, from a functional perspective, while + # open()ing a regular file, but let's keep it just to test its usage. + flags_ro=(direct nonblock) + flags_rw=("${flags_ro[@]}" sync dsync) + + # simply check if data was correctly copied between files + for flag_ro in "${flags_ro[@]}"; do + gen_bytes 512 > "$test_file0" + for flag_rw in "${flags_rw[@]}"; do + "${DD_APP[@]}" \ + --if="$test_file0" \ + --iflag="$flag_ro" \ + --of="$test_file1" \ + --oflag="$flag_rw" + [[ $(< "$test_file0") == "$(< "$test_file1")" ]] + done + done +} + +tests() { + printf '* First test run%s\n' \ + "${msg[liburing_in_use]}" >&2 + + run_test "dd_flag_append" append + run_test "dd_flag_directory" directory + run_test "dd_flag_nofollow" nofollow + run_test "dd_flag_noatime" noatime + run_test "dd_flags_misc" io +} + +tests_forced_aio() { + printf '* Second test run%s\n' \ + "${msg[liburing_in_use ? 2 : 0]}" >&2 + + DD_APP+=("--aio") + run_test "dd_flag_append_forced_aio" append + run_test "dd_flag_directory_forced_aio" directory + run_test "dd_flag_nofollow_forced_aio" nofollow + run_test "dd_flag_noatime_forced_aio" noatime + run_test "dd_flags_misc_forced_aio" io +} + +msg[0]=", using AIO" +msg[1]=", liburing in use" +msg[2]=", disabling liburing, forcing AIO" + +trap "cleanup" EXIT + +test_file0=$SPDK_TEST_STORAGE/dd.dump0 +test_file1=$SPDK_TEST_STORAGE/dd.dump1 + +tests +tests_forced_aio -- cgit v1.2.3