blob: a090d8c22beca668daad69e87ffdf78dec73e214 [file] [log] [blame]
#!/bin/bash
FSTESTCFG=""
SNAPSHOT=",snapshot=on"
DO_AEX="yes"
API="1.5"
ORIG_CMDLINE="$*"
nowrap=
if base64 -w 0 < /dev/null >& /dev/null ; then
nowrap="-w 0"
fi
ORIG_CMDLINE_B64=$(echo -n "$ORIG_CMDLINE" | sed -e "s/^ //" | base64 $nowrap)
TESTRUNID=
ourtmp=$(mktemp --tmpdir --directory xfstests-cli.XXXXXXXX)
done_cleanup=false
set_default_arch
exit_code=0
trap '_cleanup; exit $exit_code' 0
trap '_cleanup; exit 1' 1 2 3 15
_cleanup()
{
if $done_cleanup
then
:
else
rm -rf "$ourtmp"
done_cleanup=true
fi
}
supported_flavors ()
{
flavor_in "$@" || print_help
}
print_help ()
{
PROG=$(basename "$0")
echo "Usage: $PROG [<OPTIONS>] smoke|full"
echo "Usage: $PROG [<OPTIONS>] <test> ..."
echo "Usage: $PROG [<OPTIONS>] -g <group> ..."
echo "Usage: $PROG [<OPTIONS>] shell|maint"
echo "Usage: $PROG [<OPTIONS>] syz <repro>"
echo ""
echo "Common options are:"
echo " -a - Disable auto-exclude; run all tests"
echo " -c config - Specify a file system configuration"
echo " -C count - Run the specified tests multiple times"
echo " -I image - Use this test appliance image"
echo " -m mountopts - Append mount options to fs config"
if flavor_in kvm gce ; then
echo " -n nr_cpus - Specify the number of cpu's"
fi
if flavor_in kvm ; then
echo " -numa num - Ask KVM to create <num> NUMA nodes"
echo " -N - Enable networking (requires root)"
fi
if flavor_in kvm gce ; then
echo " -o opts - Extra kernel command line options"
fi
echo " -O opts - Extra options for test runner"
if flavor_in kvm gce ; then
echo " -r ram - Specify memory to be used in megabytes"
fi
echo " -x group - Exclude group of tests from running"
echo " -X test - Exclude test from running"
echo " --kernel file - Boot the specified kernel"
if flavor_in gce ; then
echo " --arch arch - Specify the architecture to run on"
fi
if flavor_in kvm ; then
echo " --initrd initrd - Boot with the specified initrd"
elif flavor_in gce ; then
echo " --pmem-device - Set up persistent memory devices for DAX"
fi
if flavor_in kvm android ; then
echo " --no-log - Don't save the log file for this run"
fi
if flavor_in kvm gce ; then
echo " --no-action - Print the command to start the VM"
fi
if flavor_in gce ; then
echo " --email email - Specify the email address to send a report to"
echo " --no-email - Do not send an email"
fi
if flavor_in gce ; then
echo " --no-region-shard"
echo " - Don't shard test VMs into other GCE zones"
echo " --bucket-subdir - Use the next argument as a bucket subdir"
fi
if flavor_in gce ; then
echo " --monitor-timeout time"
echo " - LTM option to reboot test VM if no status update"
echo " after specified time. Accepted time suffixes include"
echo " \"h\", \"m\", \"s\""
fi
if flavor_in gce ; then
echo " --[no-]vm-timeout"
echo " - Sets whether or not to abort test VM after 24 hr."
echo " By default, timeout is enabled for normal runs and"
echo " disabled for LTM runs"
fi
echo ""
echo "Common file system configurations are:"
echo " 4k 1k ext3 nojournal ext3conv metacsum dioread_nolock "
echo " data_journal bigalloc_4k bigalloc_1k inline"
echo ""
echo "xfstest names have the form: ext4/NNN generic/NNN shared/NNN"
echo ""
if flavor_in gce ; then
echo "Common gce-xfstests commands:"
echo " ls - List running xfstests instances"
echo " abort - Abort a xfstests instance"
echo " ls-results - List saved test results"
echo " get-results - Get and display a specified test result"
echo " setup - Set up gce-xfstests (only needs to be run once)"
echo " ssh - Login to a running test instance"
echo " console - Get the console messages from a test instance"
echo " serial - Attach to the serial port of a test instance"
echo " launch-ltm - Launch an LTM instance. Running the LTM"
echo " requires that you build a gce-xfstests image"
echo " yourself, and set GCE_IMAGE_PROJECT to your own project."
echo " See documentation for details."
echo " ltm - Send the command to the LTM."
echo " Note: NR_CPU and MEM must be their default values."
fi
exit 1
}
validate_test_name()
{
if test -z "$DO_BLKTESTS" ; then
case "$1" in
btrfs*|ceph*|cifs*|ext4*|f2fs*|generic*|nfs*) ;;
ocfs2*|overlay*|perf*|shared*|udf*|xfs*|selftest*) ;;
*)
echo -e "Invalid xfstests test name: $1\n"
print_help
exit 1
;;
esac
else
case "$1" in
block*|loop*|meta*|nbd*|nvme*|nvmeof-mp*|scsi*|srp*) ;;
*)
echo -e "Invalid blktests test name: $1\n"
print_help
exit 1
;;
esac
fi
}
validate_config_name()
{
local arg="$1"
local fs
local cfg
local base_fstype
if [[ "$arg" == *":"* ]]; then
base_fstype="${arg%%:*}"
arg="${arg#*:}"
fi
CONFDIR="$(dirname "$DIR")/test-appliance/files/root/fs"
if test -d "$CONFDIR"
then
case "$arg" in
*/*)
fs="${arg%%/*}"
cfg="${arg#*/}"
;;
*)
if test -d "$CONFDIR/$arg"
then
fs="$arg"
cfg=default
else
fs="$PRIMARY_FSTYPE"
cfg="$arg"
fi
;;
esac
if test ! -d "$CONFDIR/$fs" ; then
echo -e "Invalid file system type: $fs\n"
print_help
exit 1
fi
# use fs types in CONFDIR as valid options for the base fstype
if test ! -d "$CONFDIR/$base_fstype" ; then
echo -e "Invalid file system type for base fstype: $base_fstype\n"
print_help
exit 1
fi
. "$CONFDIR/$fs/config"
cfg=$(test_name_alias $cfg)
if test -f "$CONFDIR/$fs/cfg/$cfg" -o \
-f "$CONFDIR/$fs/cfg/$cfg.list"
then
return
else
echo -e "Invalid config name: $arg\n"
print_help
exit 1
fi
fi
}
validate_commit_name()
{
if test -z "$GIT_REPO"; then
echo "GIT_REPO is neither found in the config file nor provided with --repo"
exit 1
fi
if [[ "$GIT_REPO" != *".git" ]]; then
GIT_REPO="$GIT_REPO.git"
fi
if ! git ls-remote "$GIT_REPO" &> /dev/null; then
echo -e "Repo not found: $GIT_REPO\n"
exit 1
elif ! git ls-remote "$GIT_REPO" | grep "$1" &> /dev/null; then
echo "Warning: $1 is not a valid branch or tag of $GIT_REPO"
fi
}
validate_branch_name()
{
if test -z "$GIT_REPO"
then
echo "GIT_REPO is neither found in the config file nor provided with --repo"
exit 1
fi
if [[ "$GIT_REPO" != *".git" ]]; then
GIT_REPO="$GIT_REPO.git"
fi
if ! git ls-remote "$GIT_REPO" > /dev/null; then
echo -e "Repo not found: $GIT_REPO\n"
exit 1
elif ! git ls-remote --heads --exit-code "$GIT_REPO" $1 > /dev/null; then
echo -e "$1 is not a valid branch of $GIT_REPO"
exit 1
fi
}
function set_git_repo ()
{
if test -n "${GIT_REPOS[$1]}" ; then
GIT_REPO="${GIT_REPOS[$1]}"
elif test -n "${DEF_GIT_REPOS[$1]}" ; then
GIT_REPO="${DEF_GIT_REPOS[$1]}"
else
GIT_REPO="$1"
fi
case "$GIT_REPO" in
http://*|https://*|git://*) ;;
*)
echo "Invalid git repo: $GIT_REPO"
exit 1
esac
local host=$(echo "$GIT_REPO" | sed -e 's;[a-z]*://;;' -e 's;/.*$;;')
if type host >& /dev/null && ! host "$host" >& /dev/null ; then
echo "Invalid hostname in git repo: $GIT_REPO"
exit 1
fi
}
function get_default_repo_branch ()
{
case "$1" in
fs-next|fs-current|pending-fixes)
echo "next.git"
;;
linux-[0-9].*.y)
echo "stable-rc.git"
;;
*)
echo "linux.git"
;;
esac
}
function get_default_repo_commit ()
{
case "$1" in
next-[12]*)
echo "next-history.git"
;;
v[0-9].*.*)
echo "stable.git"
;;
*)
get_default_repo_branch "$1"
;;
esac
}
SKIP_KERNEL_ARCH_PROBE=
shortopts="ac:C:g:hI:m:n:No:O:r:vx:X:"
longopts=(
aio:
arch:
arm64
archive
bisect-bad:
bisect-good:
blktests
bucket-subdir:
cache:
commit:
config:
cpu-type:
disable-serial
email:
enable-serial
fail-email:
fail-loop-count:
gce-disk-spec:
gce-network:
gce-zone:
gs-bucket:
help
hooks:
i386
image-family:
image-project:
initrd:
instance-name:
junit-email:
kernel:
kernel-arch:
kbuild
kbuild-opts:
kconfig-opts:
kernel-build
local-ssd
local-ssd-nvme
log
machtype:
mkfs-config:
modules:
monitor-timeout:
nfssrv:
note:
oslogin
no-oslogin
oslogin-2fa
no-oslogin-2fa
no-action
no-archive
no-collapse
no-email
no-insert
no-junit-email
no-log
no-preemptible
no-spot-fallback
no-spot
no-punch
no-region-shard
no-virtio-rng
no-vm-timeout
no-zero
numa:
pmem-device
pts-size:
preemptible
spot
spot-fallback
primary_fstype:
repo:
skip-kernel-arch-probe
soak-duration:
stress-mem:
stress-opts:
testrunid:
unwatch:
update-files
update-xfstests
update-xfstests-tar
virtfs-model:
virtfs-scratch:
virtfs-test:
virtfs:
vm-timeout
watch:
)
longopts=$(echo "${longopts[*]}" | tr ' ' ,)
if ! options=$(getopt -o "$shortopts" -l "$longopts" -- "$@"); then
print_help
fi
eval set -- "$options"
while (( $# >= 1 )); do
case "$1" in
-a)
DO_AEX=""
;;
-c) shift
if test -n "$FSTESTCFG" ; then
echo "The '-c' option (or 'smoke') can only be specified once. "
echo "If you want to run tests in multiple configurations," \
"use -c CFG1,CFG2,..."
exit 1
fi
for i in ${1//,/ }
do
validate_config_name "$i"
done
FSTESTCFG="$1"
;;
-C) shift
LOOP_COUNT="$1"
LOOP_COUNT_EXPLICIT=yes
;;
-m) shift
MNTOPTS="$1"
;;
-r) shift
supported_flavors kvm gce
case "$1" in
*[mM])
MEM=$(echo "$1" | sed -e 's/[mM]$//')
;;
*[gG])
temparg=$(echo "$1" | sed -e 's/[gG]$//')
MEM=$(expr "$temparg" \* 1024)
unset temparg
;;
*)
MEM="$1"
;;
esac
EXPLICIT_RAM=yes
;;
-g) shift
FSTESTSET="$FSTESTSET,-g,$1"
;;
-x) shift
FSTESTSET="$FSTESTSET,-x,$1"
;;
-h|--help|help)
print_help
;;
-I) shift
ROOT_FS="$1"
if flavor_in gce ; then
IMAGE_FLAG="--image"
fi
EXPLICIT_ROOT_FS=yes
;;
-n) shift
supported_flavors kvm gce
NR_CPU="$1"
EXPLICIT_CPU=yes
;;
-o) shift
supported_flavors kvm gce
EXTRA_ARG=$(echo "$1" | sed -e 's/ /:/g')
;;
-v)
supported_flavors kvm gce
if test "$V" = "1" ; then
QUIET=""
V=2
else
QUIET="systemd.show_status=auto systemd.log_level=crit"
V=1
fi
;;
-N)
supported_flavors kvm
DO_NET=yes
;;
-O) shift
FSTESTOPT="$FSTESTOPT,extra_opt,$1"
;;
-X) shift
if test -n "$FSTESTEXC" ; then
FSTESTEXC="$FSTESTEXC,$1"
else
FSTESTEXC="$1"
fi
;;
--kernel-build)
supported_flavors kvm
DO_KERNEL_BUILD=yes
;;
--arch) shift
supported_flavors kvm gce
ARCH="$1"
EXPLICIT_ARCH=yes
;;
--arm64)
supported_flavors kvm gce
ARCH="arm64"
EXPLICIT_ARCH=yes
;;
--i386)
supported_flavors kvm gce
ARCH="i386"
EXPLICIT_ARCH=yes
;;
--blktests)
supported_flavors kvm gce
FSTESTOPT="$FSTESTOPT,blktests"
DO_BLKTESTS=yes
;;
--hooks) shift
supported_flavors gce
GCE_HOOKS="$1"
;;
--image-family) shift
supported_flavors gce
ROOT_FS="$1"
IMAGE_FLAG="--image-family"
EXPLICIT_ROOT_FS=yes
;;
--fail-loop-count) shift
FAIL_LOOP_COUNT="$1"
FAIL_LOOP_COUNT_EXPLICIT=yes
;;
--update-xfstests-tar)
supported_flavors kvm gce
UPDATE_XFSTESTS_TAR=yes
UPDATE_XFSTESTS=yes
;;
--update-xfstests)
supported_flavors kvm gce
if ! test -f "$DIR/../fstests-bld/xfstests.tar.gz"
then
echo "The xfstests.tar.gz file has not been built!"
exit 1
fi
UPDATE_XFSTESTS=yes
;;
--update-files)
supported_flavors kvm gce
UPDATE_FILES=yes
;;
--nfssrv) shift
NFSSRV="$1"
;;
--numa) shift
supported_flavors kvm
NUMA_NUM="$1"
case "$NUMA_NUM" in
''|*[!0-9]*)
echo "Invalid number of NUMA nodes: $NUMA_NUM"
exit 1
esac
;;
--cpu-type) shift
supported_flavors kvm
CPU_TYPE="$1"
;;
--oslogin)
supported_flavors gce
GCE_OSLOGIN=TRUE
;;
--no-oslogin)
supported_flavors gce
GCE_OSLOGIN=FALSE
;;
--oslogin-2fa)
supported_flavors gce
GCE_OSLOGIN_2FA=TRUE
;;
--no-oslogin-2fa)
supported_flavors gce
GCE_OSLOGIN_2FA=FALSE
;;
--no-action)
supported_flavors kvm gce
NO_ACTION="echo -e Would execute:\n\t"
SKIP_LOG=yes
;;
--no-punch)
NO_PUNCH=yes
;;
--no-collapse)
NO_COLLAPSE=yes
;;
--no-insert)
NO_INSERT=yes
;;
--no-zero)
NO_ZERO=yes
;;
--no-log)
supported_flavors kvm android
SKIP_LOG=yes
;;
--log)
supported_flavors kvm android
SKIP_LOG=no
;;
--kernel) shift
KERNEL="$1"
OVERRIDE_KERNEL="$KERNEL"
;;
--kernel-arch) shift
KERNEL_ARCH="$1"
SKIP_KERNEL_ARCH_PROBE="yes"
;;
--mkfs-config) shift
MKFS_CONFIG="$1"
;;
--modules) shift
supported_flavors kvm gce
case "$1" in
gs://*)
MODULES="$1"
;;
//*)
MODULES=$(echo "$1" | sed -e "s;//;gs://$GS_BUCKET/;")
;;
none)
MODULES=""
;;
*)
if test -f "$1" ; then
MODULES="$1"
else
echo "Can't find modules at $1"
exit 1
fi
;;
esac
OVERRIDE_MODULES="$MODULES";
;;
--note) shift
;;
--initrd) shift
supported_flavors kvm
INITRD="$1"
if test ! -f "$INITRD" ; then
print_help
fi
;;
--kbuild)
DO_KBUILD=true
;;
--local-ssd)
supported_flavors gce
DO_LOCAL_SSD=SCSI
;;
--local-ssd-nvme)
supported_flavors gce
DO_LOCAL_SSD=NVME
;;
--pmem-device)
supported_flavors gce
PMEM_DEVICE=yes
;;
--machtype) shift
supported_flavors gce kvm
if flavor_in gce ; then
GCE_MACHTYPE="$1"
else
KVM_MACHTYPE="$1"
fi
;;
--image-project) shift
supported_flavors gce
GCE_IMAGE_PROJECT="$1"
;;
--instance-name) shift
supported_flavors gce
INSTANCE_NAME="$1"
;;
--no-virtio-rng)
supported_flavors kvm
NO_VIRTIO_RNG=yes
;;
--no-vm-timeout)
supported_flavors gce
GCE_NO_VM_TIMEOUT=yes
;;
--preemptible|--spot)
supported_flavors gce
GCE_SPOT=yes
;;
--spot-fallback)
supported_flavors gce
GCE_SPOT_FALLBACK=yes
;;
--primary_fstype) shift
PRIMARY_FSTYPE="$1"
;;
--pts-size) shift
supported_flavors gce
PTS_SIZE="$1"
;;
--no-preemptible|--no-spot)
supported_flavors gce
GCE_SPOT=
;;
--no-spot-fallback)
supported_flavors gce
GCE_SPOT_FALLBACK=
;;
--gce-disk-spec) shift
supported_flavors gce
GCE_DISK_SPEC="$1"
;;
--gce-network) shift
supported_flavors gce
GCE_NETWORK="$1"
if ! gcloud compute networks describe "$GCE_NETWORK" > /dev/null ; then
echo -e "Invalid GCE network: $GCE_NETWORK"
echo -e "To see a list of valid zones, run"
echo -e "\tgcloud compute networks list\n"
exit 1
fi
;;
--gce-zone) shift
supported_flavors gce
GCE_ZONE="$1"
if ! gcloud compute zones describe "$GCE_ZONE" > /dev/null ; then
echo -e "Invalid GCE zone: $GCE_ZONE"
echo -e "To see a list of valid zones, run"
echo -e "\tgcloud compute zones list\n"
exit 1
fi
;;
--gs-bucket) shift
supported_flavors gce
GS_BUCKET="$1"
if ! gsutil ls -b "gs://$GS_BUCKET" > /dev/null ; then
echo -e "Invalid Cloud Storage Bucket: $GS_BUCKET\n"
exit 1
fi
;;
--bucket-subdir) shift
supported_flavors gce
BUCKET_SUBDIR="$1"
;;
--repo) shift
supported_flavors gce
set_git_repo "$1"
;;
--commit) shift
supported_flavors gce
OVERRIDE_KERNEL="none"
COMMIT="$1"
;;
--watch) shift
supported_flavors gce
OVERRIDE_KERNEL="none"
BRANCH="$1"
;;
--unwatch) shift
supported_flavors gce
OVERRIDE_KERNEL="none"
WATCHER_ID="$1"
;;
--bisect-bad) shift
supported_flavors gce
BISECT_BAD="$1"
OVERRIDE_KERNEL="none"
;;
--bisect-good) shift
supported_flavors gce
if test -z "$BISECT_GOOD"; then
BISECT_GOOD="$1"
else
BISECT_GOOD="$BISECT_GOOD|$1"
fi
OVERRIDE_KERNEL="none"
;;
--config) shift
supported_flavors gce
KCONFIG="$1"
case "$KCONFIG" in
gs://*) ;;
*)
if test -e "$KCONFIG"
then
gsutil cp "$KCONFIG" "gs://$GS_BUCKET/build_config"
KCONFIG="gs://$GS_BUCKET/build_config"
else
echo -e "Could not find: $1\n"
print_help
exit 1
fi
;;
esac
;;
--kconfig-opts) shift
supported_flavors gce
KCONFIG_OPTS="$1"
;;
--kbuild-opts) shift
KBUILD_OPTS="$1"
;;
--testrunid) shift
supported_flavors gce kvm
TESTRUNID="$1"
;;
--email) shift
supported_flavors gce
GCE_REPORT_EMAIL="$1"
;;
--fail-email) shift
supported_flavors gce
GCE_REPORT_FAIL_EMAIL="$1"
;;
--no-email)
supported_flavors gce
GCE_REPORT_EMAIL=""
GCE_REPORT_FAIL_EMAIL=""
;;
--junit-email) shift
supported_flavors gce
GCE_JUNIT_EMAIL="$1"
;;
--no-junit-email)
supported_flavors gce
GCE_JUNIT_EMAIL=""
;;
--no-region-shard)
supported_flavors gce
if test -z "$RUN_ON_LTM"; then
echo -e "The --no-region-shard option does not do anything if\n"
echo -e "not run on the ltm!\n"
echo -e "Use \"gce-xfstests ltm\" to send a command to the ltm\n"
exit 1
fi
NO_REGION_SHARD="yes"
;;
--aio) shift
supported_flavors kvm
if test "$1" = "default" ; then
AIO=
else
AIO=",aio=$1"
fi
;;
--cache) shift
supported_flavors kvm
CACHE="$1"
if test "$CACHE" = "default" ; then
CACHE=
fi
;;
--virtfs) shift
supported_flavors kvm
VIRTFS_PATH="$1"
;;
--virtfs-test) shift
supported_flavors kvm
VIRTFS_TEST_PATH="$1"
;;
--virtfs-scratch) shift
supported_flavors kvm
VIRTFS_SCRATCH_PATH="$1"
;;
--virtfs-model) shift
supported_flavors kvm
VIRTFS_MODEL="$1"
;;
--vm-timeout)
supported_flavors gce
unset GCE_NO_VM_TIMEOUT
;;
--archive)
supported_flavors kvm
DO_ARCHIVE=1
;;
--no-archive)
supported_flavors kvm
unset DO_ARCHIVE
;;
--stress-opts) shift
supported_flavors kvm gce
stress_opts=$(echo "$1" | sed -e 's/ /,/g')
if test -n "$FSTESTSTR" ; then
FSTESTSTR="$FSTESTSTR $stress_opts"
else
FSTESTSTR="$stress_opts"
fi
unset stress_opts
;;
--stress-mem) shift
supported_flavors kvm gce
stress_opts="-m,1,--vm-bytes,$1"
if test -n "$FSTESTSTR" ; then
FSTESTSTR="$FSTESTSTR $stress_opts"
else
FSTESTSTR="$stress_opts"
fi
unset stress_opts
;;
--enable-serial)
GCE_SERIAL_PORT_ACCESS=TRUE
;;
--enable-serial)
GCE_SERIAL_PORT_ACCESS=TRUE
;;
--disable-serial)
GCE_SERIAL_PORT_ACCESS=FALSE
;;
--skip-kernel-arch-probe)
SKIP_KERNEL_ARCH_PROBE=YES
;;
--soak-duration) shift
SOAK_DURATION="$1"
;;
--monitor-timeout) shift
MONITOR_TIMEOUT="$1"
;;
--)
shift
break
;;
*)
echo 1>&2 "Invalid option: \"$1\""
print_help
;;
esac
shift
done
while (( $# >= 1 )); do
case "$1" in
smoke)
DO_SMOKE=yes
;;
quick)
FSTESTSET="$FSTESTSET,-g,quick"
;;
full)
FSTESTSET="$FSTESTSET,-g,auto"
;;
syz)
supported_flavors kvm
shift
if test "$1"x = "x" ; then
echo "Missing syzkaller repro"
print_help
exit 1
fi
mkdir -p "$ourtmp/xfstests/tests"
cp -r "$DIR/test-appliance/syz" "$ourtmp/xfstests/tests"
repro="$1"
case "$repro" in
https://syzkaller*repro.syz*)
curl -o "$ourtmp/repro.syz" "$repro"
ed "$ourtmp/repro.syz" >& /dev/null <<EOF
1i
# Downloaded from $repro
.
w
q
EOF
repro="$ourtmp/repro.syz"
save_copy="/tmp/$USER-downloaded-repro.syz"
cp $repro "$save_copy"
echo "Saved downloaded copy at $save_copy"
;;
https://syzkaller*repro.c*)
curl -o "$ourtmp/repro.c" "$repro"
ed "$ourtmp/repro.c" >& /dev/null <<EOF
1i
// Downloaded from $repro
.
w
q
EOF
repro="$ourtmp/repro.c"
save_copy="/tmp/$USER-downloaded-repro.c"
cp $repro "$save_copy"
echo "Saved downloaded copy at $save_copy"
;;
https://*)
echo "Unknown URL: $repro"
exit 1
;;
esac
case "$repro" in
*.c)
if test -f "$repro" ; then
exe="$ourtmp/xfstests/tests/syz/001.exe"
if ! gcc -o $exe -static $repro -lpthread ; then
echo "Failed to build $repro"
exit 1;
fi
else
echo "Reproduction file $repro not found"
exit 1
fi
;;
*.syz)
if ! test -f "$repro" ; then
echo "Reproduction file $repro not found"
exit 1
fi
cp "$repro" "$ourtmp/xfstests/tests/syz/001.syz"
;;
*)
if ! test -f "$repro" ; then
echo "Reproduction file $repro not found"
exit 1
fi
if ! test -x "$repro" ; then
echo "Reproduction file $repro not executable"
exit 1
fi
cp "$repro" "$ourtmp/xfstests/tests/syz/001.exe"
;;
esac
tar -C "$ourtmp" -cvz -f "$ourtmp/extra-tests.tar.gz" xfstests \
>& /dev/null
UPDATE_EXTRA_TESTS=yes
FSTESTSET="$FSTESTSET,syz/001"
;;
launch)
supported_flavors gce
ARG="cmd=maint"
NO_SSH=yes
;;
shell)
ARG="cmd=maint"
;;
maint)
if ! flavor_in gce ; then
ARG="cmd=maint"
EPH="-root_ephemeral=no"
SNAPSHOT=""
else
ARG="cmd=maint"
if test -z "$GCE_MACHTYPE"
then
GCE_MACHTYPE="f1-micro"
fi
OVERRIDE_KERNEL="none"
fi
;;
pts|phoronix)
supported_flavors gce
ARG="cmd=pts"
DO_PTS="yes"
;;
ver)
ARG="cmd=ver"
;;
*)
validate_test_name "$1"
FSTESTSET="$FSTESTSET,$1"
;;
esac
shift
done
if test -n "$DO_SMOKE" ; then
SOAK_DURATION=3m
FSTESTSET="$FSTESTSET,-g,smoketest"
if test -z "$FSTESTCFG" ; then
FSTESTCFG="$PRIMARY_FSTYPE/default"
fi
fi
if test -z "$FSTESTCFG" ; then
FSTESTCFG=all
fi
if test -z "$KBUILD_OPTS" -a -n "$DO_KBUILD"; then
KBUILD_OPTS="--oldconfig"
if test "$XFSTESTS_FLAVOR" = "kvm" ; then
KBUILD_OPTS="--oldconfig --no-dpkg"
fi
fi
if test -n "$DO_KBUILD" ; then
if test ! -x "$KBUILD_DIR/kbuild" ; then
echo "kbuild not supported in this installation"
exit 1
fi
$NO_ACTION "$KBUILD_DIR/kbuild" $KBUILD_OPTS || exit 1
fi
if test -n "$RUN_ON_LTM" -a -n "$DO_BLKTESTS"
then
echo "Block tests can not be using LTM"
exit 1
fi
if test -n "$RUN_ON_KCS" -a -n "$DO_BLKTESTS"
then
echo "Block tests can not be run using KCS"
exit 1
fi
if test -z "$GIT_REPO" -a -n "$COMMIT" ; then
set_git_repo $(get_default_repo_commit "$COMMIT")
fi
if test -z "$GIT_REPO" -a -n "$BISECT_BAD" ; then
set_git_repo $(get_default_repo_commit "$BISECT_BAD")
fi
if test -z "$GIT_REPO" -a -n "$BISECT_GOOD" ; then
b=$(echo "$BISECT_GOOD" | sed -e 's/|.*//')
set_git_repo $(get_default_repo_commit "$b")
fi
if test -z "$GIT_REPO" -a -n "$BRANCH" ; then
set_git_repo $(get_default_repo_branch "$BRANCH")
fi
if test -n "$NO_ACTION" -a -n "$GIT_REPO" ; then
echo "GIT_REPO: $GIT_REPO"
fi
if test -n "$COMMIT"
then
validate_commit_name $COMMIT
fi
if test -n "$BRANCH"
then
validate_branch_name $BRANCH
fi
if test -n "$BISECT_GOOD" -o -n "$BISECT_BAD"
then
if test -z "$BISECT_BAD" -o -z "$BISECT_BAD"
then
echo "Both BISECT_GOOD and BISECT_BAD should be set"
exit 1
fi
validate_commit_name $BISECT_BAD
fi
if test -n "$RUN_ON_KCS" -a -z "$COMMIT"
then
echo "No commit id specified for KCS to build"
exit 1
fi
if test -n "$COMMIT" -a -z "$RUN_ON_LTM" -a -z "$RUN_ON_KCS"
then
echo "Specifying a commit id only makes sense with LTM or KCS"
exit 1
fi
if test -n "$GIT_REPO" -a -z "$RUN_ON_LTM" -a -z "$RUN_ON_KCS"
then
echo "Specifying a git repository only makes sense with LTM or KCS"
exit 1
fi
if test -z "$FAIL_LOOP_COUNT_EXPLICIT" -a -n "$LOOP_COUNT"
then
FAIL_LOOP_COUNT=
fi
if test -z "$LOOP_COUNT_EXPLICIT" -a -n "$FAIL_LOOP_COUNT"
then
LOOP_COUNT=
fi
if test -n "$FAIL_LOOP_COUNT" -a -n "$LOOP_COUNT"
then
echo "The options -C and --fail-loop-count are mutually exclusive"
exit 1
fi
if test -n "$FAIL_LOOP_COUNT" ; then
FSTESTOPT="$FSTESTOPT,fail_loop_count,$FAIL_LOOP_COUNT"
fi
if test -n "$LOOP_COUNT" ; then
FSTESTOPT="$FSTESTOPT,count,$LOOP_COUNT"
# Older test appliances don't clear fail_loop_count default
# This can be removed in the future...
FSTESTOPT="$FSTESTOPT,fail_loop_count,0"
fi
if test -n "$KCONFIG" -a -z "$RUN_ON_LTM" -a -z "$RUN_ON_KCS"
then
echo "--config only is supported with LTM or KCS"
exit 1
fi
if test -n "$KCONFIG_OPTS" -a -z "$RUN_ON_LTM" -a -z "$RUN_ON_KCS"
then
echo "--kconfig-opts only is supported with LTM or KCS"
exit 1
fi
if test -n "$KBUILD_OPTS" -a -z "$RUN_ON_LTM" -a -z "$RUN_ON_KCS" \
-a -z "$DO_KBUILD"
then
echo "--kbuild-opts only is supported with LTM or KCS or --kbuild"
exit 1
fi
if test -n "$BRANCH" -a -z "$RUN_ON_LTM"
then
echo "Repo watcher only works with LTM"
exit 1
fi
if test -n "$COMMIT" -a -n "$BRANCH"
then
echo "--commit conflicts with --watch"
fi
if test -z "$FSTESTSET" -a -z "$ARG" -a -z "$DO_BLKTESTS" \
-a -z "$RUN_ON_KCS" -a -z "$WATCHER_ID" -a -z "$LTM_INFO"
then
echo -e "No tests specified!\n"
print_help
exit 1
fi
if test "$ARG" = "cmd=maint" -a -z "$SKIP_LOG" ; then
SKIP_LOG=yes
fi
if test "$ARG" = "cmd=ver" -a -z "$SKIP_LOG" ; then
SKIP_LOG=yes
fi
if test "$DO_AEX" = yes ; then
FSTESTOPT="$FSTESTOPT,aex"
fi
if test "$NO_PUNCH" = yes ; then
FSTESTOPT="$FSTESTOPT,no_punch"
fi
if test "$NO_COLLAPSE" = yes ; then
FSTESTOPT="$FSTESTOPT,no_collapse"
fi
if test "$NO_INSERT" = yes ; then
FSTESTOPT="$FSTESTOPT,no_insert"
fi
if test "$NO_ZERO" = yes ; then
FSTESTOPT="$FSTESTOPT,no_zero"
fi
if test -n "$SOAK_DURATION" ; then
FSTESTOPT="$FSTESTOPT,soak,$SOAK_DURATION"
fi
if test -n "$MKFS_CONFIG" ; then
FSTESTOPT="$FSTESTOPT,mkfs_config,$MKFS_CONFIG"
fi
FSTESTOPT=${FSTESTOPT/#,/}
case "$FSTESTCFG" in
dax|dax,*|*,dax,*|*,dax|*/dax|*/dax,*)
PMEM_DEVICE=yes
;;
filestore*|*filestore|*filestore*)
if test -z "$NFSSRV" ; then
NFSSRV=filestore
fi
;;
esac
if test "$SKIP_LOG" = no ; then
unset SKIP_LOG
fi
if test -n "$ARG" ; then
:
elif test -n "$DO_BLKTESTS" ; then
ARG="fstestopt=$FSTESTOPT"
if test -n "$FSTESTSET" ; then
FSTESTSET=${FSTESTSET/#,/}
ARG="$ARG fstestset=$FSTESTSET"
fi
elif test -n "$FSTESTSET"; then
FSTESTSET=${FSTESTSET/#,/}
ARG="fstestcfg=$FSTESTCFG fstestset=$FSTESTSET fstestopt=$FSTESTOPT"
fi
if test -n "$FSTESTEXC" ; then
ARG="$ARG fstestexc=$FSTESTEXC"
fi
if test -n "$MNTOPTS" ; then
ARG="$ARG mount_opts=$MNTOPTS"
fi
if test -n "$NFSSRV" ; then
ARG="$ARG nfssrv=$NFSSRV"
fi
if test -n "$TZ" ; then
ARG="$ARG fstesttz=$TZ"
fi
if test -n "$DO_ARCHIVE" ; then
ARG="$ARG fstestarc=$DO_ARCHIVE"
fi
if test -n "$DO_KERNEL_BUILD"; then
if test ! -f MAINTAINERS -o ! -f Makefile ; then
echo "Not at top-level of kernel sources"
exit 125
fi
if test -n "$OVERRIDE_KERNEL" ; then
echo "The --kernel and --kernel-build options can not be combined"
exit 125
fi
fi
set_canonicalized_arch "$ARCH"
find_kernel_to_use
if test -z "$SKIP_KERNEL_ARCH_PROBE" -a "$OVERRIDE_KERNEL" != "none" ; then
get_kernel_file_info "$KERNEL"
fi
if test -n "$KERNEL_ARCH" ; then
if test "$KERNEL_ARCH" = "x86" -a \
\( "$ARCH" = "i386" -o "$ARCH" = "amd64" \) ; then
KERNEL_ARCH="$ARCH"
fi
if test -n "$EXPLICIT_ARCH" ; then
if test "$ARCH" != "$KERNEL_ARCH" ; then
echo "Kernel $KERNEL is apparently built for $KERNEL_ARCH"
echo "Expected architecture: $ARCH"
exit 1
fi
else
ARCH="$KERNEL_ARCH"
fi
fi
if test -n "$UPDATE_XFSTESTS_TAR" ; then
(cd "$DIR/../fstests-bld" ; ./gen-tarball --fast --arch "$ARCH")
fi
if test -n "$PMEM_DEVICE" ; then
if test -n "$EXTRA_ARG" ; then
EXTRA_ARG="$EXTRA_ARG:"
fi
EXTRA_ARG="${EXTRA_ARG}"'memmap=4G!9G:memmap=9G!14G'
if test -z "$EXPLICIT_RAM" -a -z "$GCE_MACHTYPE"; then
MEM=26624
NR_CPU=4
EXPLICIT_RAM=yes
EXPLICIT_CPU=yes
elif test "$MEM" -lt 14436 ; then
MEM=14436
fi
fi
if test -n "$DO_PTS" -a -z "$EXPLICIT_RAM" -a -z "$EXPLICIT_CPU" -a \
-z "$GCE_MACHTYPE" ; then
GCE_MACHTYPE="n1-standard-16"
fi
if test -n "$NUMA_NUM" ; then
if test "$NUMA_NUM" -lt 2 ; then
echo "Invalid number of NUMA nodes ($NUMA_NUM) too small"
exit 1
fi
if test "$NUMA_NUM" -gt "$NR_CPU" ; then
echo "Can't have more NUMA nodes than CPUs"
exit 1
fi
NUMA="-numa node"
for i in $(seq 2 "$NUMA_NUM") ; do
NUMA="$NUMA -numa node"
done
fi
if test -n "$CPU_TYPE" ; then
if test "$CPU_TYPE" = none ; then
CPU_TYPE=
else
CPU_TYPE="-cpu $CPU_TYPE"
fi
fi
if test -z "$NO_VIRTIO_RNG" ; then
VIRTIO_RNG="-object rng-random,filename=/dev/urandom,id=rng0 \
-device virtio-rng-pci,rng=rng0"
fi
ARG="$ARG fstesttyp=$PRIMARY_FSTYPE fstestapi=$API"
if test -n "$FSTESTSTR" ; then
ARG="$ARG fsteststr=$FSTESTSTR"
fi
if test -n "$PTS_SIZE" ; then
ARG="$ARG pts_size=$PTS_SIZE"
fi
ARG="$ARG orig_cmdline=$ORIG_CMDLINE_B64"