@@ -36,6 +36,7 @@ LCTL=${LCTL:-lctl}
MCREATE=${MCREATE:-mcreate}
OPENFILE=${OPENFILE:-openfile}
OPENUNLINK=${OPENUNLINK:-openunlink}
export MULTIOP=${MULTIOP:-multiop}
READS=${READS:-"reads"}
MUNLINK=${MUNLINK:-munlink}
SOCKETSERVER=${SOCKETSERVER:-socketserver}
@@ -691,13 +692,13 @@ run_test 24k "touch .../R11a/f; mv .../R11a/f .../R11a/d ======="
# bug 2429 - rename foo foo foo creates invalid file
test_24l() {
f="$DIR/f24l"
multiop $f OcNs || error
$MULTIOP $f OcNs || error
}
run_test 24l "Renaming a file to itself ========================"

test_24m() {
f="$DIR/f24m"
multiop $f OcLN ${f}2 ${f}2 || error "link ${f}2 ${f}2 failed"
$MULTIOP $f OcLN ${f}2 ${f}2 || error "link ${f}2 ${f}2 failed"
# on ext3 this does not remove either the source or target files
# though the "expected" operation would be to remove the source
$CHECKSTAT -t file ${f} || error "${f} missing"
@@ -774,7 +775,7 @@ test_24t() {
run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="

test_24u() { # bug12192
multiop $DIR/$tfile C2w$((2048 * 1024))c || error
$MULTIOP $DIR/$tfile C2w$((2048 * 1024))c || error
$CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size"
}
run_test 24u "create stripe file"
@@ -1543,7 +1544,7 @@ run_test 31a "open-unlink file =================================="
test_31b() {
touch $DIR/f31 || error
ln $DIR/f31 $DIR/f31b || error
multiop $DIR/f31b Ouc || error
$MULTIOP $DIR/f31b Ouc || error
$CHECKSTAT -t file $DIR/f31 || error
}
run_test 31b "unlink file with multiple links while open ======="
@@ -1553,7 +1554,7 @@ test_31c() {
ln $DIR/f31 $DIR/f31c || error
multiop_bg_pause $DIR/f31 O_uc || return 1
MULTIPID=$!
multiop $DIR/f31c Ouc
$MULTIOP $DIR/f31c Ouc
kill -USR1 $MULTIPID
wait $MULTIPID
}
@@ -2064,7 +2065,7 @@ test_34h() {
local sz=1000

dd if=/dev/zero of=$DIR/$tfile bs=1M count=10 || error
multiop $DIR/$tfile OG${gid}T${sz}g${gid}c &
$MULTIOP $DIR/$tfile OG${gid}T${sz}g${gid}c &
MULTIPID=$!
sleep 2

@@ -2782,7 +2783,7 @@ run_test 42e "verify sub-RPC writes are not done synchronously"
test_43() {
mkdir -p $DIR/$tdir
cp -p /bin/ls $DIR/$tdir/$tfile
multiop $DIR/$tdir/$tfile Ow_c &
$MULTIOP $DIR/$tdir/$tfile Ow_c &
pid=$!
# give multiop a chance to open
sleep 1
@@ -2794,10 +2795,10 @@ run_test 43 "execution of file opened for write should return -ETXTBSY"

test_43a() {
mkdir -p $DIR/d43
cp -p `which multiop` $DIR/d43/multiop || cp -p multiop $DIR/d43/multiop
cp -p `which $MULTIOP` $DIR/d43/multiop || cp -p multiop $DIR/d43/multiop
MULTIOP_PROG=$DIR/d43/multiop multiop_bg_pause $TMP/test43.junk O_c || return 1
MULTIOP_PID=$!
multiop $DIR/d43/multiop Oc && error "expected error, got success"
$MULTIOP $DIR/d43/multiop Oc && error "expected error, got success"
kill -USR1 $MULTIOP_PID || return 2
wait $MULTIOP_PID || return 3
rm $TMP/test43.junk
@@ -2806,7 +2807,7 @@ run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"

test_43b() {
mkdir -p $DIR/d43
cp -p `which multiop` $DIR/d43/multiop || cp -p multiop $DIR/d43/multiop
cp -p `which $MULTIOP` $DIR/d43/multiop || cp -p multiop $DIR/d43/multiop
MULTIOP_PROG=$DIR/d43/multiop multiop_bg_pause $TMP/test43.junk O_c || return 1
MULTIOP_PID=$!
$TRUNCATE $DIR/d43/multiop 0 && error "expected error, got success"
@@ -4021,7 +4022,7 @@ test_61() {
f="$DIR/f61"
dd if=/dev/zero of=$f bs=`page_size` count=1
cancel_lru_locks osc
multiop $f OSMWUc || error
$MULTIOP $f OSMWUc || error
sync
}
run_test 61 "mmap() writes don't make sync hang ================"
@@ -4067,7 +4068,7 @@ test_63b() {

#define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
lctl set_param fail_loc=0x80000406
multiop $DIR/$tfile Owy && \
$MULTIOP $DIR/$tfile Owy && \
error "sync didn't return ENOMEM"
sync; sleep 2; sync # do a real sync this time to flush page
lctl get_param -n llite.*.dump_page_cache | grep locked && \
@@ -4437,11 +4438,11 @@ test_73() {
pid1=$!

lctl set_param fail_loc=0x80000129
multiop $DIR/d73-1/f73-2 Oc &
$MULTIOP $DIR/d73-1/f73-2 Oc &
sleep 1
lctl set_param fail_loc=0

multiop $DIR/d73-2/f73-3 Oc &
$MULTIOP $DIR/d73-2/f73-3 Oc &
pid3=$!

kill -USR1 $pid1
@@ -4817,7 +4818,7 @@ test_81a() { # LU-456

# write should trigger a retry and success
$SETSTRIPE -i 0 -c 1 $DIR/$tfile
multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
$MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
RC=$?
if [ $RC -ne 0 ] ; then
error "write should success, but failed for $RC"
@@ -4833,7 +4834,7 @@ test_81b() { # LU-456

# write should retry several times and return -ENOSPC finally
$SETSTRIPE -i 0 -c 1 $DIR/$tfile
multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
$MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
RC=$?
ENOSPC=28
if [ $RC -ne $ENOSPC ] ; then
@@ -4842,6 +4843,27 @@ test_81b() { # LU-456
}
run_test 81b "OST should return -ENOSPC when retry still fails ======="

test_82() { # LU-1031
dd if=/dev/zero of=$DIR/$tfile bs=1M count=10
local gid1=14091995
local gid2=16022000

multiop_bg_pause $DIR/$tfile OG${gid1}_g${gid1}c || return 1
local MULTIPID1=$!
multiop_bg_pause $DIR/$tfile O_G${gid2}r10g${gid2}c || return 2
local MULTIPID2=$!
kill -USR1 $MULTIPID2
sleep 2
if [[ `ps h -o comm -p $MULTIPID2` == "" ]]; then
error "First grouplock does not block second one"
else
echo "Second grouplock blocks first one"
fi
kill -USR1 $MULTIPID1
wait $MULTIPID1
wait $MULTIPID2
}
run_test 82 "Basic grouplock test ==============================="

test_99a() {
[ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs" && \
@@ -5903,7 +5925,7 @@ test_118a() #bug 11710
{
reset_async

multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
$MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)

@@ -5923,7 +5945,7 @@ test_118b()

#define OBD_FAIL_OST_ENOENT 0x217
set_nodes_failloc "$(osts_nodes)" 0x217
multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
$MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
RC=$?
set_nodes_failloc "$(osts_nodes)" 0
DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
@@ -5944,7 +5966,7 @@ test_118b()

# Due to the above error the OSC will issue all RPCs syncronously
# until a subsequent RPC completes successfully without error.
multiop $DIR/$tfile Ow4096yc
$MULTIOP $DIR/$tfile Ow4096yc
rm -f $DIR/$tfile

return 0
@@ -5961,7 +5983,7 @@ test_118c()
set_nodes_failloc "$(osts_nodes)" 0x216

# multiop should block due to fsync until pages are written
multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
$MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
MULTIPID=$!
sleep 1

@@ -6004,7 +6026,7 @@ test_118d()
#define OBD_FAIL_OST_BRW_PAUSE_BULK
set_nodes_failloc "$(osts_nodes)" 0x214
# multiop should block due to fsync until pages are written
multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
$MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
MULTIPID=$!
sleep 1

@@ -6041,7 +6063,7 @@ test_118f() {
lctl set_param fail_loc=0x8000040a

# Should simulate EINVAL error which is fatal
multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
$MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
RC=$?
if [[ $RC -eq 0 ]]; then
error "Must return error due to dropped pages, rc=$RC"
@@ -6076,7 +6098,7 @@ test_118g() {
lctl set_param fail_loc=0x406

# simulate local -ENOMEM
multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
$MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
RC=$?

lctl set_param fail_loc=0
@@ -6112,7 +6134,7 @@ test_118h() {
#define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
set_nodes_failloc "$(osts_nodes)" 0x20e
# Should simulate ENOMEM error which is recoverable and should be handled by timeout
multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
$MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
RC=$?

set_nodes_failloc "$(osts_nodes)" 0
@@ -6148,7 +6170,7 @@ test_118i() {
set_nodes_failloc "$(osts_nodes)" 0x20e

# Should simulate ENOMEM error which is recoverable and should be handled by timeout
multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
$MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
PID=$!
sleep 5
set_nodes_failloc "$(osts_nodes)" 0
@@ -6186,7 +6208,7 @@ test_118j() {
set_nodes_failloc "$(osts_nodes)" 0x220

# return -EIO from OST
multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
$MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
RC=$?
set_nodes_failloc "$(osts_nodes)" 0x0
if [[ $RC -eq 0 ]]; then
@@ -6238,7 +6260,7 @@ test_118l()
{
# LU-646
mkdir -p $DIR/$tdir
multiop $DIR/$tdir Dy || error "fsync dir failed"
$MULTIOP $DIR/$tdir Dy || error "fsync dir failed"
rm -rf $DIR/$tdir
}
run_test 118l "fsync dir ========="
@@ -6268,7 +6290,7 @@ test_119b() # bug 11737
$SETSTRIPE -c 2 $DIR/$tfile || error "setstripe failed"
dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed"
sync
multiop $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) || \
$MULTIOP $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) || \
error "direct read failed"
rm -f $DIR/$tfile
}
@@ -6906,7 +6928,7 @@ test_129() {
I=0
J=0
while [ ! $I -gt $((MAX * MDSCOUNT)) ]; do
multiop $DIR/$tdir/$J Oc
$MULTIOP $DIR/$tdir/$J Oc
rc=$?
if [ $rc -eq $EFBIG ]; then
set_dir_limits 0
@@ -7673,7 +7695,7 @@ test_152() {
run_test 152 "test read/write with enomem ============================"

test_153() {
multiop $DIR/$tfile Ow4096Ycu || error "multiop failed"
$MULTIOP $DIR/$tfile Ow4096Ycu || error "multiop failed"
}
run_test 153 "test if fdatasync does not crash ======================="

@@ -8226,11 +8248,11 @@ run_test 163 "kernel <-> userspace comms"
test_169() {
# do directio so as not to populate the page cache
log "creating a 10 Mb file"
multiop $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
$MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
log "starting reads"
dd if=$DIR/$tfile of=/dev/null bs=4096 &
log "truncating the file"
multiop $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
$MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
log "killing dd"
kill %+ || true # reads might have finished
echo "wait until dd is finished"
@@ -9058,11 +9080,11 @@ run_test 217 "check lctl ping for hostnames with hiphen ('-')"
test_218() {
# do directio so as not to populate the page cache
log "creating a 10 Mb file"
multiop $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
$MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
log "starting reads"
dd if=$DIR/$tfile of=/dev/null bs=4096 &
log "truncating the file"
multiop $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
$MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
log "killing dd"
kill %+ || true # reads might have finished
echo "wait until dd is finished"
@@ -25,6 +25,7 @@ CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
MCREATE=${MCREATE:-mcreate}
OPENFILE=${OPENFILE:-openfile}
OPENUNLINK=${OPENUNLINK:-openunlink}
export MULTIOP=${MULTIOP:-multiop}
export TMP=${TMP:-/tmp}
MOUNT_2=${MOUNT_2:-"yes"}
CHECK_GRANT=${CHECK_GRANT:-"yes"}
@@ -270,7 +271,7 @@ test_14a() {
cp -p `which multiop` $DIR1/d14/multiop || error "cp failed"
MULTIOP_PROG=$DIR1/d14/multiop multiop_bg_pause $TMP/test14.junk O_c || return 1
MULTIOP_PID=$!
multiop $DIR2/d14/multiop Oc && error "expected error, got success"
$MULTIOP $DIR2/d14/multiop Oc && error "expected error, got success"
kill -USR1 $MULTIOP_PID || return 2
wait $MULTIOP_PID || return 3
rm $TMP/test14.junk $DIR1/d14/multiop || error "removing multiop"
@@ -392,9 +393,9 @@ test_20() {
mkdir $DIR1/d20
cancel_lru_locks osc
CNT=$((`lctl get_param -n llite.*.dump_page_cache | wc -l`))
multiop $DIR1/f20 Ow8190c
multiop $DIR2/f20 Oz8194w8190c
multiop $DIR1/f20 Oz0r8190c
$MULTIOP $DIR1/f20 Ow8190c
$MULTIOP $DIR2/f20 Oz8194w8190c
$MULTIOP $DIR1/f20 Oz0r8190c
cancel_lru_locks osc
CNTD=$((`lctl get_param -n llite.*.dump_page_cache | wc -l` - $CNT))
[ $CNTD -gt 0 ] && \
@@ -1200,7 +1201,7 @@ run_test 40e "pdirops: rename and others =============="
test_41a() {
#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145
do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145
multiop $DIR1/$tfile oO_CREAT:O_RDWR:c &
$MULTIOP $DIR1/$tfile oO_CREAT:O_RDWR:c &
PID1=$!
sleep 1
mkdir $DIR2/$tfile && error "mkdir must fail"
@@ -1213,10 +1214,10 @@ run_test 41a "pdirops: create vs mkdir =============="
test_41b() {
#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145
do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145
multiop $DIR1/$tfile oO_CREAT:O_RDWR:c &
$MULTIOP $DIR1/$tfile oO_CREAT:O_RDWR:c &
PID1=$!
sleep 1
multiop $DIR2/$tfile oO_CREAT:O_EXCL:c && error "create must fail"
$MULTIOP $DIR2/$tfile oO_CREAT:O_EXCL:c && error "create must fail"
check_pdo_conflict $PID1 && { wait $PID1; error "create isn't blocked"; }
rm -r $DIR1/*
return 0
@@ -1227,7 +1228,7 @@ test_41c() {
touch $DIR1/$tfile-2
#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145
do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145
multiop $DIR1/$tfile oO_CREAT:O_RDWR:c &
$MULTIOP $DIR1/$tfile oO_CREAT:O_RDWR:c &
PID1=$!
sleep 1
link $DIR2/$tfile-2 $DIR2/$tfile && error "link must fail"
@@ -1240,7 +1241,7 @@ run_test 41c "pdirops: create vs link =============="
test_41d() {
#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145
do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145
multiop $DIR1/$tfile oO_CREAT:O_RDWR:c &
$MULTIOP $DIR1/$tfile oO_CREAT:O_RDWR:c &
PID1=$!
sleep 1
rm $DIR2/$tfile || error "unlink must succeed"
@@ -1254,7 +1255,7 @@ test_41e() {
touch $DIR1/$tfile-2
#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145
do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145
multiop $DIR1/$tfile oO_CREAT:O_RDWR:c &
$MULTIOP $DIR1/$tfile oO_CREAT:O_RDWR:c &
PID1=$!
sleep 1
mv $DIR2/$tfile-2 $DIR2/$tfile || error "rename must succeed"
@@ -1267,7 +1268,7 @@ run_test 41e "pdirops: create and rename (tgt) =============="
test_41f() {
#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145
do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145
multiop $DIR1/$tfile oO_CREAT:O_RDWR:c &
$MULTIOP $DIR1/$tfile oO_CREAT:O_RDWR:c &
PID1=$!
sleep 1
mv $DIR2/$tfile $DIR2/$tfile-2 || error "rename must succeed"
@@ -1280,7 +1281,7 @@ run_test 41f "pdirops: create and rename (src) =============="
test_41g() {
#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145
do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145
multiop $DIR1/$tfile oO_CREAT:O_RDWR:c &
$MULTIOP $DIR1/$tfile oO_CREAT:O_RDWR:c &
PID1=$!
sleep 1
stat $DIR2/$tfile > /dev/null || error "stat must succeed"
@@ -1293,7 +1294,7 @@ run_test 41g "pdirops: create vs getattr =============="
test_41h() {
#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145
do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145
multiop $DIR1/$tfile oO_CREAT:O_RDWR:c &
$MULTIOP $DIR1/$tfile oO_CREAT:O_RDWR:c &
PID1=$!
sleep 1
ls -lia $DIR2/ > /dev/null
@@ -1323,7 +1324,7 @@ test_42b() {
mkdir $DIR1/$tfile &
PID1=$!
sleep 1
multiop $DIR2/$tfile oO_CREAT:O_EXCL:c && error "create must fail"
$MULTIOP $DIR2/$tfile oO_CREAT:O_EXCL:c && error "create must fail"
check_pdo_conflict $PID1 && { wait $PID1; error "create isn't blocked"; }
rm -r $DIR1/*
return 0
@@ -1432,7 +1433,7 @@ test_43b() {
rm $DIR1/$tfile &
PID1=$!
sleep 1
multiop $DIR2/$tfile oO_CREAT:O_EXCL:c || error "create must succeed"
$MULTIOP $DIR2/$tfile oO_CREAT:O_EXCL:c || error "create must succeed"
check_pdo_conflict $PID1 && { wait $PID1; error "create isn't blocked"; }
rm -r $DIR1/*
return 0
@@ -1547,7 +1548,7 @@ test_44b() {
mv $DIR1/$tfile-2 $DIR1/$tfile &
PID1=$!
sleep 1
multiop $DIR2/$tfile oO_CREAT:O_EXCL:c && error "create must fail"
$MULTIOP $DIR2/$tfile oO_CREAT:O_EXCL:c && error "create must fail"
check_pdo_conflict $PID1 && { wait $PID1; error "create isn't blocked"; }
rm -r $DIR1/*
return 0
@@ -1664,7 +1665,7 @@ test_45b() {
mv $DIR1/$tfile $DIR1/$tfile-2 &
PID1=$!
sleep 1
multiop $DIR2/$tfile oO_CREAT:O_EXCL:c || error "create must succeed"
$MULTIOP $DIR2/$tfile oO_CREAT:O_EXCL:c || error "create must succeed"
check_pdo_conflict $PID1 && { wait $PID1; error "create isn't blocked"; }
rm -r $DIR1/*
return 0
@@ -1779,7 +1780,7 @@ test_46b() {
link $DIR1/$tfile-2 $DIR1/$tfile &
PID1=$!
sleep 1
multiop $DIR2/$tfile oO_CREAT:O_EXCL:c && error "create must fail"
$MULTIOP $DIR2/$tfile oO_CREAT:O_EXCL:c && error "create must fail"
check_pdo_conflict $PID1 && { wait $PID1; error "create isn't blocked"; }
rm -r $DIR1/*
return 0
@@ -3835,7 +3835,7 @@ fi"
# Run multiop in the background, but wait for it to print
# "PAUSING" to its stdout before returning from this function.
multiop_bg_pause() {
MULTIOP_PROG=${MULTIOP_PROG:-multiop}
MULTIOP_PROG=${MULTIOP_PROG:-$MULTIOP}
FILE=$1
ARGS=$2