test_47g() {
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ sync
+ sync_all_data
#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145
do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145
$LFS mkdir -i 1 $DIR1/$tfile &
PID1=$!
- sleep 1
+ sleep 2
stat $DIR2/$tfile > /dev/null || error "stat must succeed"
check_pdo_conflict $PID1 && { wait $PID1;
error "getattr isn't blocked"; }
{ skip "checkfiemap not runnable: $?" && return; }
# write data this way: hole - data - hole - data
dd if=/dev/urandom of=$DIR1/$tfile bs=40K seek=1 count=1
- [ "$(facet_fstype ost$(($($GETSTRIPE -i $DIR1/$tfile) + 1)))" = \
+ [ "$(facet_fstype ost$(($($LFS getstripe -i $DIR1/$tfile) + 1)))" = \
"zfs" ] &&
skip "ORI-366/LU-1941: FIEMAP unimplemented on ZFS" && return 0
dd if=/dev/urandom of=$DIR1/$tfile bs=40K seek=3 count=1
$LFS setstripe -c -1 $DIR1/$tdir || error "setstripe failed"
dd if=/dev/urandom of=$DIR1/$tdir/$tfile bs=40K count=1
- [ "$(facet_fstype ost$(($($GETSTRIPE -i $DIR1/$tdir/$tfile) + 1)))" = \
+ [ "$(facet_fstype ost$(($($LFS getstripe -i $DIR1/$tdir/$tfile) + 1)))" = \
"zfs" ] &&
skip "ORI-366/LU-1941: FIEMAP unimplemented on ZFS" && return 0
checkfiemap $DIR1/$tdir/$tfile 40960 || error "checkfiemap failed"
#define OBD_FAIL_MDS_LOV_CREATE_RACE 0x163
do_facet $SINGLEMDS "lctl set_param fail_loc=0x00000163"
- $SETSTRIPE -c -1 $DIR1/$tfile-1/file1 &
+ $LFS setstripe -c -1 $DIR1/$tfile-1/file1 &
local PID1=$!
sleep 1
- $SETSTRIPE -c -1 $DIR2/$tfile-2/file2 &
+ $LFS setstripe -c -1 $DIR2/$tfile-2/file2 &
local PID2=$!
wait $PID2
wait $PID1
do_facet $SINGLEMDS "lctl set_param -n \
'lod.lustre-MDT*/qos_threshold_rr' $old_rr"
- $GETSTRIPE $DIR1/$tfile-1/file1
- rc1=$($GETSTRIPE -q $DIR1/$tfile-1/file1 |
+ $LFS getstripe $DIR1/$tfile-1/file1
+ rc1=$($LFS getstripe -q $DIR1/$tfile-1/file1 |
awk '{if (/[0-9]/) print $1 }' | sort | uniq -d | wc -l)
- $GETSTRIPE $DIR2/$tfile-2/file2
- rc2=$($GETSTRIPE -q $DIR2/$tfile-2/file2 |
+ $LFS getstripe $DIR2/$tfile-2/file2
+ rc2=$($LFS getstripe -q $DIR2/$tfile-2/file2 |
awk '{if (/[0-9]/) print $1 }' | sort | uniq -d | wc -l)
echo "rc1=$rc1 and rc2=$rc2 "
[ $rc1 -eq 0 ] && [ $rc2 -eq 0 ] ||
$CHECKSTAT -t file -s 4096 $DIR/$tdir/dom || error "stat #1"
# first stat from server should return size data and save glimpse
- local gls=$(lctl get_param -n mdc.*.stats | \
- awk '/ldlm_glimpse/ {print $2}')
- [ -z $gls ] || error "Unexpected $gls glimpse RPCs"
+ local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
+ [ $gls -eq 0 ] || error "Unexpected $gls glimpse RPCs"
# second stat to check size is NOT cached on client without IO lock
$CHECKSTAT -t file -s 4096 $DIR/$tdir/dom || error "stat #2"
- local gls=$(lctl get_param -n mdc.*.stats | grep ldlm_glimpse | wc -l)
- [ "1" == "$gls" ] || error "Expect 1 glimpse RPCs but got $gls"
+ local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
+ [ $gls -ge 1 ] || error "Expect glimpse RPCs but none"
rm -f $dom
}
run_test 100a "DoM: glimpse RPCs for stat without IO lock (DoM only file)"
# second stat to check size is cached on client
$CHECKSTAT -t file -s 4096 $DIR/$tdir/dom || error "stat #2"
- local gls=$(lctl get_param -n mdc.*.stats |
- awk '/ldlm_glimpse/ {print $2}')
+ local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
# both stats should cause no glimpse requests
- [ -z $gls ] || error "Unexpected $gls glimpse RPCs"
+ [ $gls == 0 ] || error "Unexpected $gls glimpse RPCs"
rm -f $dom
}
run_test 100b "DoM: no glimpse RPC for stat with IO lock (DoM only file)"
$CHECKSTAT -t file -s 2097152 $DIR/$tdir/dom ||
error "Wrong size from stat #1"
- local gls=$(lctl get_param -n osc.*.stats | grep ldlm_glimpse | wc -l)
+ local gls=$(lctl get_param -n osc.*.stats | grep -c ldlm_glimpse)
[ $gls -eq 0 ] && error "Expect OST glimpse RPCs but got none"
rm -f $dom
$CHECKSTAT -t file -s 4096 $DIR/$tdir/dom ||
error "Wrong size from stat #1"
- local gls=$(lctl get_param -n osc.*.stats | grep ldlm_glimpse | wc -l)
+ local gls=$(lctl get_param -n osc.*.stats | grep -c ldlm_glimpse)
[ $gls -eq 0 ] && error "Expect OST glimpse but got none"
rm -f $dom
lctl set_param -n mdc.*.stats=clear
rm $DIR2/$tfile || error "Unlink fails"
- local writes=$(lctl get_param -n mdc.*.stats | grep ost_write | wc -l)
+ local writes=$(lctl get_param -n mdc.*.stats | grep -c ost_write)
[ $writes -eq 0 ] || error "Found WRITE RPC but expect none"
}
run_test 101a "Discard DoM data on unlink"
lctl set_param -n mdc.*.stats=clear
mv $DIR2/${tfile}_2 $DIR2/$tfile || error "Rename fails"
- local writes=$(lctl get_param -n mdc.*.stats | grep ost_write | wc -l)
+ local writes=$(lctl get_param -n mdc.*.stats | grep -c ost_write)
[ $writes -eq 0 ] || error "Found WRITE RPC but expect none"
}
run_test 101b "Discard DoM data on rename"
rm $DIR2/$tfile > /dev/null || error "Unlink fails for opened file"
kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure"
- local writes=$(lctl get_param -n mdc.*.stats | grep ost_write | wc -l)
+ local writes=$(lctl get_param -n mdc.*.stats | grep -c ost_write)
[ $writes -eq 0 ] || error "Found WRITE RPC but expect none"
}
run_test 101c "Discard DoM data on close-unlink"
+# test to verify file handle related system calls
+# (name_to_handle_at/open_by_handle_at)
+# The new system calls are supported in glibc >= 2.14.
+
+# test to verify we can open by handle an unlinked file from > 1 client
+# This test opens the file normally on $DIR1, which is on one mount, and then
+# opens it by handle on $DIR2, which is on a different mount.
+test_102() {
+ echo "Test file_handle syscalls" > $DIR/$tfile ||
+ error "write failed"
+ check_fhandle_syscalls $DIR/$tfile $DIR2 ||
+ error "check_fhandle_syscalls failed"
+ rm -f $DIR2/$tfile
+}
+run_test 102 "Test open by handle of unlinked file"
+
log "cleanup: ======================================================"
# kill and wait in each test only guarentee script finish, but command in script