#!/bin/sh
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (c) 2015-2018 Oracle and/or its affiliates. All Rights Reserved.
# Copyright (c) International Business Machines Corp., 2001
VERSION=${VERSION:=3}
NFILES=${NFILES:=1000}
SOCKET_TYPE="${SOCKET_TYPE:-udp}"
NFS_TYPE=${NFS_TYPE:=nfs}
nfs_usage()
{
echo "-t x Socket type, tcp or udp, default is udp"
echo "-v x NFS version, default is '3'"
}
nfs_parse_args()
{
case "$1" in
v) VERSION="$(echo $2 | tr ',' ' ')";;
t) SOCKET_TYPE="$(echo $2 | tr ',' ' ')";;
esac
}
TST_OPTS="v:t:"
TST_PARSE_ARGS=nfs_parse_args
TST_USAGE=nfs_usage
TST_NEEDS_TMPDIR=1
TST_NEEDS_ROOT=1
TST_NEEDS_CMDS="${TST_NEEDS_CMDS:-mount exportfs}"
TST_SETUP="${TST_SETUP:-nfs_setup}"
TST_CLEANUP="${TST_CLEANUP:-nfs_cleanup}"
. tst_net.sh
get_socket_type()
{
local t
local k=0
for t in $SOCKET_TYPE; do
if [ "$k" -eq "$1" ]; then
echo "${t}${TST_IPV6}"
return
fi
k=$(( k + 1 ))
done
}
nfs_setup_server()
{
local export_cmd="exportfs -i -o no_root_squash,rw *:$remote_dir"
if [ -n "$LTP_NETNS" ]; then
if [ ! -d $remote_dir ]; then
mkdir -p $remote_dir
ROD $export_cmd
fi
return
fi
if ! tst_rhost_run -c "test -d $remote_dir"; then
tst_rhost_run -s -c "mkdir -p $remote_dir; $export_cmd"
fi
}
nfs_mount()
{
local host_type=rhost
local mount_dir
[ -n "$LTP_NETNS" ] && host_type=
if [ $TST_IPV6 ]; then
mount_dir="[$(tst_ipaddr $host_type)]:$remote_dir"
else
mount_dir="$(tst_ipaddr $host_type):$remote_dir"
fi
local mnt_cmd="mount -t nfs $opts $mount_dir $local_dir"
tst_res TINFO "Mounting NFS: $mnt_cmd"
if [ -n "$LTP_NETNS" ]; then
tst_rhost_run -s -c "$mnt_cmd"
return
fi
ROD $mnt_cmd
}
nfs_setup()
{
# Check if current filesystem is NFS
if [ "$(stat -f . | grep "Type: nfs")" ]; then
tst_brk TCONF "Cannot run nfs-stress test on mounted NFS"
fi
local i
local type
local n=0
local opts
local local_dir
local remote_dir
local mount_dir
for i in $VERSION; do
type=$(get_socket_type $n)
tst_res TINFO "setup NFSv$i, socket type $type"
local_dir="$TST_TMPDIR/$i/$n"
remote_dir="$TST_TMPDIR/$i/$type"
mkdir -p $local_dir
nfs_setup_server
opts="-o proto=$type,vers=$i"
nfs_mount
n=$(( n + 1 ))
done
if [ "$n" -eq 1 ]; then
cd ${VERSION}/0
fi
}
nfs_cleanup()
{
tst_res TINFO "Cleaning up testcase"
cd $LTPROOT
local i
local type
local local_dir
local remote_dir
local n=0
for i in $VERSION; do
local_dir="$TST_TMPDIR/$i/$n"
grep -q "$local_dir" /proc/mounts && umount $local_dir
n=$(( n + 1 ))
done
n=0
for i in $VERSION; do
type=$(get_socket_type $n)
remote_dir="$TST_TMPDIR/$i/$type"
tst_rhost_run -c "test -d $remote_dir && exportfs -u *:$remote_dir"
tst_rhost_run -c "test -d $remote_dir && rm -rf $remote_dir"
n=$(( n + 1 ))
done
}