OPENFILE=${OPENFILE:-openfile}
OPENUNLINK=${OPENUNLINK:-openunlink}
READS=${READS:-"reads"}
-TRUNCATE=${TRUNCATE:-truncate}
MUNLINK=${MUNLINK:-munlink}
SOCKETSERVER=${SOCKETSERVER:-socketserver}
SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
mkdir -p $DIR/$tdir
$SETSTRIPE $DIR/$tdir -c -1
#define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141
- do_facet mds lctl set_param fail_loc=0x80000141
+ do_facet $SINGLEMDS lctl set_param fail_loc=0x80000141
touch $DIR/$tdir/$tfile || true
}
run_test 17h "create objects: lov_free_memmd() doesn't lbug"
local foo=$DIR/$tdir/$tfile
ln -s $foo $foo || error "create symlink failed"
#define OBD_FAIL_MDS_READLINK_EPROTO 0x143
- do_facet mds lctl set_param fail_loc=0x80000143
+ do_facet $SINGLEMDS lctl set_param fail_loc=0x80000143
ls -l $foo && error "error not detected"
return 0
}
}
run_test 24v "list directory with large files (handle hash collision, bug: 17560)"
+test_24w() { # bug21506
+ SZ1=234852
+ dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=4096 || return 1
+ dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2
+ dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3
+ SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'`
+ [ "$SZ1" = "$SZ2" ] || \
+ error "Error reading at the end of the file $tfile"
+}
+run_test 24w "Reading a file larger than 4Gb"
+
test_25a() {
echo '== symlink sanity ============================================='
run_test 27m "create file while OST0 was full =================="
sleep_maxage() {
- local DELAY=$(do_facet mds lctl get_param -n lov.*.qos_maxage | head -n 1 | awk '{print $1 * 2}')
+ local DELAY=$(do_facet $SINGLEMDS lctl get_param -n lov.*.qos_maxage | head -n 1 | awk '{print $1 * 2}')
sleep $DELAY
}
[ $fcount -eq 0 ] && skip "not enough space on OST0" && return
[ $fcount -gt $OSTCOUNT ] && fcount=$OSTCOUNT
- MDS_OSCS=`do_facet mds lctl dl | awk '/[oO][sS][cC].*md[ts]/ { print $4 }'`
+ MDS_OSCS=`do_facet $SINGLEMDS lctl dl | awk '/[oO][sS][cC].*md[ts]/ { print $4 }'`
OFFSET=$(($OSTCOUNT-1))
OST=-1
for OSC in $MDS_OSCS; do
OST=`osc_to_ost $OSC`
} else {
echo $OSC "is Deactivate:"
- do_facet mds lctl --device %$OSC deactivate
+ do_facet $SINGLEMDS lctl --device %$OSC deactivate
} fi
done
for OSC in $MDS_OSCS; do
[ `osc_to_ost $OSC` != $OST ] && {
echo $OSC "is activate"
- do_facet mds lctl --device %$OSC activate
+ do_facet $SINGLEMDS lctl --device %$OSC activate
}
done
}
$OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2
if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then
echo "mtime"
- ls -l $DIR/$tfile $DIR/${tfile}2
+ ls -l --full-time $DIR/$tfile $DIR/${tfile}2
echo "atime"
- ls -lu $DIR/$tfile $DIR/${tfile}2
+ ls -lu --full-time $DIR/$tfile $DIR/${tfile}2
echo "ctime"
- ls -lc $DIR/$tfile $DIR/${tfile}2
+ ls -lc --full-time $DIR/$tfile $DIR/${tfile}2
error "O_TRUNC didn't change timestamps"
fi
}
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"
+ $TRUNCATE $DIR/d43/multiop 0 && error "expected error, got success"
kill -USR1 $MULTIOP_PID || return 2
wait $MULTIOP_PID || return 3
rm $TMP/test43.junk
test_56i() {
tdir=${tdir}i
mkdir -p $DIR/$tdir
- UUID=`$LFS osts | awk '/0: / { print $2 }'`
- OUT="`$LFIND -ost $UUID $DIR/$tdir`"
+ UUID=$(ostuuid_from_index 0 $DIR/$tdir)
+ OUT=$($LFIND -obd $UUID $DIR/$tdir)
[ "$OUT" ] && error "$LFIND returned directory '$OUT'" || true
}
run_test 56i "check 'lfs find -ost UUID' skips directories ======="
STRIPE_INDEX=`do_facet $SINGLEMDS lctl get_param -n lov.*md*.target_obd |
grep $STRIPE_OST | awk -F: '{print $1}' | head -n 1`
- [ -f $DIR/$tdir/${STRIPE_INDEX} ] && continue
+ [ -f $DIR/$tdir/${STRIPE_INDEX} ] && continue
echo "$SETSTRIPE $DIR/$tdir/${STRIPE_INDEX} -i ${STRIPE_INDEX} -c 1"
do_facet client $SETSTRIPE $DIR/$tdir/${STRIPE_INDEX} -i ${STRIPE_INDEX} -c 1
RC=$?
$DIRECTIO write ${f}.2 0 1 || error "directio write error"
do_facet ost1 lctl set_param fail_loc=0x217
- truncate $f 1 # vmtruncate() will ignore truncate() error.
+ $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error.
$DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT"
do_facet ost1 lctl set_param fail_loc=0
devs=$(do_node $node "lctl get_param -n devices" | awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }')
for dev in $devs; do
mntdev=$(do_node $node "lctl get_param -n osd*.$dev.mntdev")
+ do_node $node "test -e $LDPROC/\\\$(basename $mntdev)/max_dir_size" || LDPROC=/sys/fs/ldiskfs
do_node $node "echo $1 >$LDPROC/\\\$(basename $mntdev)/max_dir_size"
done
done
err17935 "path looked up \"${path}\" instead of \"${expected}\""
return 2
fi
- echo "fid $fid resolves to path $path"
+ echo "fid $fid resolves to path $path (expected $expected)"
}
test_162() {
- # Make changes to filesystem
- mkdir -p $DIR/$tdir/d2
- touch $DIR/$tdir/d2/$tfile
- touch $DIR/$tdir/d2/x1
- touch $DIR/$tdir/d2/x2
- mkdir -p $DIR/$tdir/d2/a/b/c
- mkdir -p $DIR/$tdir/d2/p/q/r
+ # Make changes to filesystem
+ mkdir -p $DIR/$tdir/d2
+ touch $DIR/$tdir/d2/$tfile
+ touch $DIR/$tdir/d2/x1
+ touch $DIR/$tdir/d2/x2
+ mkdir -p $DIR/$tdir/d2/a/b/c
+ mkdir -p $DIR/$tdir/d2/p/q/r
# regular file
- FID=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[')
- check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0
+ FID=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
+ check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0
# softlink
- ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
- FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[')
- check_path "$tdir/d2/p/q/r/slink" $FSNAME $FID --link 0
+ ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
+ FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
+ check_path "$tdir/d2/p/q/r/slink" $FSNAME $FID --link 0
+
+ # softlink to wrong file
+ ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
+ FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
+ check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME $FID --link 0
# hardlink
- ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
- mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
- FID=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[')
- # fid2path dir/fsname should both work
- check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1
- check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0
-
- # hardlink count: check that there are 2 links
- # Doesnt work with CMD yet: 17935
+ ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
+ mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
+ FID=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
+ # fid2path dir/fsname should both work
+ check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1
+ check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0
+
+ # hardlink count: check that there are 2 links
+ # Doesnt work with CMD yet: 17935
${LFS} fid2path $DIR $FID | wc -l | grep -q 2 || \
err17935 "expected 2 links"
# hardlink indexing: remove the first link
- rm $DIR/$tdir/d2/p/q/r/hlink
- check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0
+ rm $DIR/$tdir/d2/p/q/r/hlink
+ check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0
return 0
}
sleep 1
local uuid=$($LCTL get_param -n mdc.${FSNAME}-MDT0000-mdc-*.uuid)
# this proc file is temporary and linux-only
- do_facet mds lctl set_param mdt.${FSNAME}-MDT0000.mdccomm=$uuid ||\
+ do_facet $SINGLEMDS lctl set_param mdt.${FSNAME}-MDT0000.mdccomm=$uuid ||\
error "kernel->userspace send failed"
kill -INT $!
}
test_200d() {
remote_mgs_nodsh && skip "remote MGS with nodsh" && return
- res=$($GETSTRIPE --pool $POOL_DIR | awk '/^pool:/ {print $2}')
- [ "$res" = $POOL ] || error "Pool on $POOL_DIR is $res, not $POOL"
+ res=$($GETSTRIPE --pool $POOL_DIR)
+ [ $res = $POOL ] || error "Pool on $POOL_DIR is $res, not $POOL"
}
run_test 200d "Check pool on a directory ==============================="
}
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"
+ 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"
+ log "killing dd"
+ kill %+ || true # reads might have finished
+ echo "wait until dd is finished"
+ wait
+ log "removing the temporary file"
+ rm -rf $DIR/$tfile || error "tmp file removal failed"
+}
+run_test 218 "parallel read and truncate should not deadlock ======================="
+
#
# tests that do cleanup/setup should be run at the end
#