+cmd_cancel_lru_locks() {
+ NS=$1
+ test "x$NS" = "x" && NS="mdc"
+ for d in `find $LPROC/ldlm/namespaces | grep $NS`; do
+ if test -f $d/lru_size; then
+ cancel_lru_locks $d
+ fi
+ done
+}
+
+test_124a() {
+ [ -z "`grep lru_resize $LPROC/mdc/*/connect_flags`" ] && \
+ skip "no lru resize on server" && return 0
+ cmd_cancel_lru_locks "mdc"
+ lru_resize_enable
+
+ # we want to test main pool functionality, that is cancel based on SLV
+ # this is why shrinkers are disabled
+ disable_pool_shrink "mds-$FSNAME"
+ disable_pool_shrink mdc
+
+ NR=2000
+ mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
+
+ # use touch to produce $NR new locks
+ log "create $NR files at $DIR/$tdir"
+ for ((i=0;i<$NR;i++)); do touch $DIR/$tdir/f$i; done
+
+ NSDIR=""
+ LRU_SIZE=0
+ for d in `find $LPROC/ldlm/namespaces | grep mdc-`; do
+ if test -f $d/lru_size; then
+ LRU_SIZE=`cat $d/lru_size`
+ if test $LRU_SIZE -gt 0; then
+ log "using $d namespace"
+ NSDIR=$d
+ break
+ fi
+ fi
+ done
+
+ if test -z $NSDIR; then
+ skip "No cached locks created!"
+ return 0
+ fi
+
+ if test $LRU_SIZE -lt 100; then
+ skip "Not enough cached locks created!"
+ return 0
+ fi
+ log "created $LRU_SIZE lock(s)"
+
+ # we want to sleep 30s to not make test too long
+ SLEEP=30
+ SLEEP_ADD=2
+
+ # we know that lru resize allows one client to hold $LIMIT locks for 10h
+ MAX_HRS=10
+
+ # get the pool limit
+ LIMIT=`cat $NSDIR/pool/limit`
+
+ # calculate lock volume factor taking into account data set size and the
+ # rule that number of locks will be getting smaller durring sleep interval
+ # and we need to additionally enforce LVF to take this into account.
+ # Use $LRU_SIZE_B here to take into account real number of locks created
+ # in the case of CMD, LRU_SIZE_B != $NR in most of cases
+ LVF=$(($MAX_HRS * 60 * 60 * $LIMIT / $SLEEP))
+ LRU_SIZE_B=$LRU_SIZE
+ log "make client drop locks $LVF times faster so that ${SLEEP}s is enough to cancel $LRU_SIZE_B lock(s)"
+ OLD_LVF=`cat $NSDIR/pool/lock_volume_factor`
+ echo "$LVF" > $NSDIR/pool/lock_volume_factor
+ log "sleep for $((SLEEP+SLEEP_ADD))s"
+ sleep $((SLEEP+SLEEP_ADD))
+ echo "$OLD_LVF" > $NSDIR/pool/lock_volume_factor
+ LRU_SIZE_A=`cat $NSDIR/lru_size`
+
+ [ $LRU_SIZE_B -gt $LRU_SIZE_A ] || {
+ error "No locks dropped in "$((SLEEP+SLEEP_ADD))"s. LRU size: $LRU_SIZE_A"
+ lru_resize_enable
+ unlinkmany $DIR/$tdir/f $NR
+ return
+ }
+
+ log "Dropped "$((LRU_SIZE_B-LRU_SIZE_A))" locks in "$((SLEEP+SLEEP_ADD))"s"
+ lru_resize_enable
+ log "unlink $NR files at $DIR/$tdir"
+ unlinkmany $DIR/$tdir/f $NR
+}
+run_test 124a "lru resize ======================================="
+
+set_lru_size() {
+ NS=$1
+ SIZE=$2
+ test "x$NS" = "x" && NS="mdc"
+ test "x$SIZE" = "x" && SIZE="0"
+ test $SIZE -lt 0 && SIZE="0"
+ test $SIZE -gt 0 && ACTION="disabled" || ACTION="enabled"
+ for d in `find $LPROC/ldlm/namespaces | grep $NS`; do
+ if test -f $d/lru_size; then
+ log "$(basename $d):"
+ log " lru resize $ACTION"
+ log " lru_size=$SIZE"
+ echo $SIZE > $d/lru_size
+ fi
+ done
+}
+
+get_lru_size() {
+ NS=$1
+ test "x$NS" = "x" && NS="mdc"
+ for d in `find $LPROC/ldlm/namespaces | grep $NS`; do
+ if test -f $d/lru_size; then
+ log "$(basename $d):"
+ log " lru_size=$(cat $d/lru_size)"
+ fi
+ done
+}
+
+test_124b() {
+ [ -z "`grep lru_resize $LPROC/mdc/*/connect_flags`" ] && \
+ skip "no lru resize on server" && return 0
+
+ NSDIR=`find $LPROC/ldlm/namespaces | grep mdc | head -1`
+ LIMIT=`cat $NSDIR/pool/limit`
+
+ NR_CPU=$(awk '/processor/' /proc/cpuinfo | wc -l)
+ # 100 locks here is default value for non-shrinkable lru as well
+ # as the order to switch to static lru managing policy
+ # define LDLM_DEFAULT_LRU_SIZE (100 * num_online_cpus())
+ LDLM_DEFAULT_LRU_SIZE=$((100 * NR_CPU))
+
+ NR=$((LIMIT-(LIMIT/3)))
+ log "starting lru resize disable cycle"
+ set_lru_size "mdc-" $LDLM_DEFAULT_LRU_SIZE
+
+ mkdir -p $DIR/$tdir/disable_lru_resize ||
+ error "failed to create $DIR/$tdir/disable_lru_resize"
+
+ createmany -o $DIR/$tdir/disable_lru_resize/f $NR
+ log "doing ls -la $DIR/$tdir/disable_lru_resize 3 times"
+ stime=`date +%s`
+ ls -la $DIR/$tdir/disable_lru_resize > /dev/null
+ ls -la $DIR/$tdir/disable_lru_resize > /dev/null
+ ls -la $DIR/$tdir/disable_lru_resize > /dev/null
+ etime=`date +%s`
+ nolruresize_delta=$((etime-stime))
+ log "ls -la time: $nolruresize_delta seconds"
+ get_lru_size "mdc-"
+
+ log "starting lru resize enable cycle"
+ mkdir -p $DIR/$tdir/enable_lru_resize ||
+ error "failed to create $DIR/$tdir/enable_lru_resize"
+
+ # 0 locks means here flush lru and switch to lru resize policy
+ set_lru_size "mdc-" 0
+
+ createmany -o $DIR/$tdir/enable_lru_resize/f $NR
+ log "doing ls -la $DIR/$tdir/enable_lru_resize 3 times"
+ stime=`date +%s`
+ ls -la $DIR/$tdir/enable_lru_resize > /dev/null
+ ls -la $DIR/$tdir/enable_lru_resize > /dev/null
+ ls -la $DIR/$tdir/enable_lru_resize > /dev/null
+ etime=`date +%s`
+ lruresize_delta=$((etime-stime))
+ log "ls -la time: $lruresize_delta seconds"
+ get_lru_size "mdc-"
+
+ if test $lruresize_delta -gt $nolruresize_delta; then
+ log "ls -la is $((lruresize_delta - $nolruresize_delta))s slower with lru resize enabled"
+ elif test $nolruresize_delta -gt $lruresize_delta; then
+ log "ls -la is $((nolruresize_delta - $lruresize_delta))s faster with lru resize enabled"
+ else
+ log "lru resize performs the same with no lru resize"
+ fi
+}
+run_test 124b "lru resize (performance test) ======================="
+
+test_125() { # 13358
+ [ -z "$(grep acl $LPROC/mdc/*-mdc-*/connect_flags)" ] && skip "must have acl enabled" && return
+ mkdir -p $DIR/d125 || error "mkdir failed"
+ $SETSTRIPE $DIR/d125 65536 -1 -1 || error "setstripe failed"
+ setfacl -R -m u:bin:rwx $DIR/d125 || error "setfacl $DIR/d125 failed"
+ ls -ld $DIR/d125 || error "cannot access $DIR/d125"
+}
+run_test 125 "don't return EPROTO when a dir has a non-default striping and ACLs"
+
+test_126() { # bug 12829/13455
+ [ "$UID" != 0 ] && echo "skipping $TESTNAME (must run as root)" && return
+ $RUNAS -u 0 -g 1 touch $DIR/$tfile || error "touch failed"
+ gid=`ls -n $DIR/$tfile | awk '{print $4}'`
+ rm -f $DIR/$tfile
+ [ $gid -eq "1" ] || error "gid is set to" $gid "instead of 1"
+}
+run_test 126 "check that the fsgid provided by the client is taken into account"