quota_scan() {
local local_ugp=$1
local local_id=$2
+ local count
if [ "$local_ugp" == "a" -o "$local_ugp" == "u" ]; then
$LFS quota -v -u $local_id $DIR
- log "Files for user ($local_id):"
+ count=$($LFS find --user $local_id $DIR | wc -l)
+ log "Files for user ($local_id), count=$count:"
($LFS find --user $local_id $DIR | head -n 4 |
xargs stat 2>/dev/null)
fi
if [ "$local_ugp" == "a" -o "$local_ugp" == "g" ]; then
$LFS quota -v -g $local_id $DIR
- log "Files for group ($local_id):"
+ count=$($LFS find --group $local_id $DIR | wc -l)
+ log "Files for group ($local_id), count=$count:"
($LFS find --group $local_id $DIR | head -n 4 |
xargs stat 2>/dev/null)
fi
is_project_quota_supported || return 0
if [ "$local_ugp" == "a" -o "$local_ugp" == "p" ]; then
$LFS quota -v -p $TSTPRJID $DIR
- log "Files for project ($TSTPRJID):"
+ count=$($LFS find --projid $TSTPRJID $DIR | wc -l)
+ log "Files for project ($TSTPRJID), count=$count:"
($LFS find --projid $TSTPRJID $DIR | head -n 4 |
xargs stat 2>/dev/null)
fi
pool_add_targets $qpool 0 $(($OSTCOUNT - 1)) ||
error "pool_add_targets failed"
+ # check qmt_pool_add dmesg error
+ local msg_rgx="QMT0000: can't add to $FSNAME-OST0000.*pool.*$qpool"
+ local dmesg_err
+ dmesg_err=$(do_facet mds1 dmesg | grep "$msg_rgx" | tail -1)
+ [[ -z "$dmesg_err" ]] || error "found qmt_pool_add error: $dmesg_err"
+
$LFS setquota -u $TSTUSR -B ${limit}M --pool $qpool $DIR ||
error "set user quota failed"
local testfile="$DIR/$tdir/$tfile-0"
local least_qunit=$(do_facet mds1 $LCTL get_param -n \
qmt.$FSNAME-QMT0000.md-0x0.info |
- awk '/least qunit/{ print $3 }')
+ sed -e 's/least qunit/least_qunit/' |
+ awk '/least_qunit/{ print $2 }')
local limit
[ "$SLOW" = "no" ] && limit=$((least_qunit * 2)) ||
limit=$((least_qunit * 1024))
+ echo "least_qunit: '$least_qunit', limit: '$limit'"
local free_inodes=$(mdt_free_inodes 0)
echo "$free_inodes free inodes on master MDT"
}
run_test 41 "df should return projid-specific values"
+test_delete_qid()
+{
+ local qslv_file=$1
+ local qtype_file=$2
+ local qtype=$3
+ local qid=$4
+ local osd="osd-ldiskfs"
+
+ [ "$ost1_FSTYPE" = zfs ] && osd="osd-zfs"
+
+ rm -f $DIR/$tdir/$tfile
+ $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile
+ chmod a+rw $DIR/$tdir/$tfile
+
+ $LFS setquota $qtype $qid -B 300M $MOUNT
+ $RUNAS dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 ||
+ error "failed to dd"
+
+ do_facet $SINGLEMDS \
+ "cat /proc/fs/lustre/qmt/$FSNAME-QMT0000/dt-0x0/$qtype_file |
+ grep -E 'id: *$qid'" || error "QMT: no qid $qid is found"
+ echo $osd
+ do_facet ost1 \
+ "cat /proc/fs/lustre/$osd/$FSNAME-OST0000/$qslv_file |
+ grep -E 'id: *$qid'" || error "QSD: no qid $qid is found"
+
+ $LFS setquota $qtype $qid --delete $MOUNT
+ do_facet $SINGLEMDS \
+ "cat /proc/fs/lustre/qmt/$FSNAME-QMT0000/dt-0x0/$qtype_file |
+ grep -E 'id: *$qid'" && error "QMT: qid $qid is not deleted"
+ sleep 5
+ do_facet ost1 \
+ "cat /proc/fs/lustre/$osd/$FSNAME-OST0000/$qslv_file |
+ grep -E 'id: *$qid'" && error "QSD: qid $qid is not deleted"
+
+ $LFS setquota $qtype $qid -B 500M $MOUNT
+ $RUNAS dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 ||
+ error "failed to dd"
+ do_facet $SINGLEMDS \
+ "cat /proc/fs/lustre/qmt/$FSNAME-QMT0000/dt-0x0/$qtype_file |
+ grep -E 'id: *$qid'" || error "QMT: qid $pid is not recreated"
+ cat /proc/fs/lustre/$osd/$FSNAME-OST0000/$qslv_file
+ do_facet ost1 \
+ "cat /proc/fs/lustre/$osd/$FSNAME-OST0000/$qslv_file |
+ grep -E 'id: *$qid'" || error "QSD: qid $qid is not recreated"
+}
+
+test_48()
+{
+ setup_quota_test || error "setup quota failed with $?"
+ set_ost_qtype $QTYPE || error "enable ost quota failed"
+ quota_init
+
+ test_delete_qid "quota_slave/limit_user" "glb-usr" "-u" $TSTID
+ test_delete_qid "quota_slave/limit_group" "glb-grp" "-g" $TSTID
+ is_project_quota_supported &&
+ test_delete_qid "quota_slave/limit_project" "glb-prj" "-p" "10000"
+
+ cleanup_quota_test
+}
+run_test 48 "lfs quota --delete should delete quota project ID"
+
test_50() {
! is_project_quota_supported &&
skip "Project quota is not supported"
test_52() {
! is_project_quota_supported &&
skip "Project quota is not supported"
+
+ (( MDS1_VERSION >= $(version_code 2.14.55) )) ||
+ skip "Need MDS version at least 2.14.55"
+
setup_quota_test || error "setup quota failed with $?"
- local dir="$DIR/$tdir/dir"
- mkdir $dir && change_project -sp 1 $dir
- touch $DIR/$tdir/file
- #Try renaming a file into the project. This should fail.
- for num in $(seq 1 2000); do
- mrename $DIR/$tdir/file $dir/file >&/dev/null &&
- error "rename should fail"
- done
- return 0
+ local dir1=$DIR/$tdir/t52_dir1
+ local dir2=$DIR/$tdir/t52_dir2
+
+ mkdir $dir1 || error "failed to mkdir $dir1"
+ mkdir $dir2 || error "failed to mkdir $dir2"
+
+ $LFS project -sp 1000 $dir1 || error "fail to set project on $dir1"
+ $LFS project -sp 1001 $dir2 || error "fail to set project on $dir2"
+
+ $DD if=/dev/zero of=/$dir1/$tfile bs=1M count=100 ||
+ error "failed to create and write $tdir1/$tfile"
+
+ cancel_lru_locks osc
+ sync; sync_all_data || true
+
+ local attrs=($(lsattr -p $dir1/$tfile))
+ (( ${attrs[0]} == 1000 )) ||
+ error "project ID on $dir1/$tfile is not inherited"
+
+ $LFS quota -p 1000 $DIR
+ $LFS quota -p 1001 $DIR
+
+ local prev_used=$(getquota -p 1000 global curspace)
+ local prev_used2=$(getquota -p 1001 global curspace)
+
+ mrename $dir1 $dir2/tdir || log "rename directory return $?"
+
+ local inum_before=$(ls -i $dir1/$tfile | awk '{print $1}')
+ mrename $dir1/$tfile $dir2/$tfile || error "failed to rename file"
+ local inum_after=$(ls -i $dir2/$tfile | awk '{print $1}')
+
+ attrs=($(lsattr -p $dir2/$tfile))
+ (( ${attrs[0]} == 1001 )) ||
+ error "project ID is not updated after rename"
+
+ (( $inum_before == $inum_after )) ||
+ error "inode is changed after rename: $inum_before, $inum_after"
+
+ sync_all_data || true
+
+ $LFS quota -p 1000 $DIR
+ $LFS quota -p 1001 $DIR
+
+ local new_used=$(getquota -p 1000 global curspace)
+ local new_used2=$(getquota -p 1001 global curspace)
+
+ (( $prev_used >= $new_used + 102400 )) ||
+ error "quota is not deducted from old project ID"
+ (( $prev_used2 <= $new_used2 - 102400 )) ||
+ error "quota is not added for the new project ID"
}
-run_test 52 "Rename across different project ID"
+run_test 52 "Rename normal file across project ID"
test_53() {
! is_project_quota_supported &&
local qtype=$2
local nr
+ wait_update_facet mds1 \
+ "$LCTL get_param -n qmt.$FSNAME-QMT0000.dt-$pool.info \
+ >/dev/null 2>&1 || echo foo" "" ||
+ error "mds1: failed to create quota pool $pool"
+
do_facet mds1 $LCTL get_param -n qmt.$FSNAME-QMT0000.dt-$pool.info |
awk '/usr/ {getline; print $2}'
}
}
run_test 78 "Check fallocate increase quota usage"
+test_78a()
+{
+ (( $CLIENT_VERSION >= $(version_code 2.15.0) )) ||
+ skip "need client at least 2.15.0"
+ (( $OST1_VERSION >= $(version_code 2.15.0) )) ||
+ skip "need OST at least 2.15.0"
+ check_set_fallocate_or_skip
+
+ setup_quota_test || error "setup quota failed with $?"
+
+ # enable ost quota
+ set_ost_qtype $QTYPE || error "enable ost quota failed"
+
+ mkdir -p $DIR/$tdir || error "failed to create $tdir"
+
+ local projectid=5200 # Random project id to test
+
+ change_project -sp $projectid $DIR/$tdir
+
+ # setup quota limit
+ $LFS setquota -p $projectid -b25M -B25M $DIR/$tdir ||
+ error "lfs setquota project failed"
+
+ # call fallocate
+ fallocate -l 204800 $DIR/$tdir/$tfile
+
+ # Get curspace (kbytes) for $projectid
+ local kbytes=$(getquota -p $projectid global curspace)
+
+ echo "kbytes returned:$kbytes"
+
+ # For file size of 204800. We should be having roughly 200 kbytes
+ # returned. Anything alarmingly low (50 taken as arbitrary value)
+ # would bail out this TC. Also this also avoids $kbytes of 0
+ # to be used in calculation below.
+ (( $kbytes > 50 )) ||
+ error "fallocate did not use projectid. kbytes returned:$kbytes"
+
+ local expect_lo=$(($kbytes * 95 / 100)) # 5% below
+ local expect_hi=$(($kbytes * 105 / 100)) # 5% above
+
+ # Verify kbytes is 200 (204800/1024). With a permited 5% drift
+ (( $kbytes >= $expect_lo && $kbytes <= $expect_hi )) ||
+ error "fallocate did not use quota projectid correctly"
+}
+run_test 78a "Check fallocate increase projectid usage"
+
test_79()
{
local qpool="qpool1"
}
run_test 81 "Race qmt_start_pool_recalc with qmt_pool_free"
+test_82()
+{
+ (( $MDS1_VERSION >= $(version_code 2.14.55) )) ||
+ skip "need MDS 2.14.55 or later"
+ is_project_quota_supported ||
+ skip "skip project quota unsupported"
+
+ setup_quota_test || error "setup quota failed with $?"
+ stack_trap cleanup_quota_test
+ quota_init
+
+ local parent_dir="$DIR/$tdir.parent"
+ local child_dir="$parent_dir/child"
+
+ mkdir -p $child_dir
+ stack_trap "chown -R 0:0 $parent_dir"
+
+ chown $TSTUSR:$TSTUSR $parent_dir ||
+ error "failed to chown on $parent_dir"
+ chown $TSTUSR2:$TSTUSRS2 $child_dir ||
+ error "failed to chown on $parent_dir"
+
+ $LFS project -p 1000 $parent_dir ||
+ error "failed to set project id on $parent_dir"
+ $LFS project -p 1001 $child_dir ||
+ error "failed to set project id on $child_dir"
+
+ rmdir $child_dir || error "cannot remove child dir, test failed"
+}
+run_test 82 "verify more than 8 qids for single operation"
+
quota_fini()
{
do_nodes $(comma_list $(nodes_list)) \