#! /bin/bash # FS QA Test No. 230 # # Simple quota enforcement test. # #----------------------------------------------------------------------- # Copyright (c) 2010 Jan Kara. All Rights Reserved. # # Based on test 219, # Copyright (c) 2005 Silicon Graphics, Inc. All Rights Reserved. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation. # # This program is distributed in the hope that it would be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # #----------------------------------------------------------------------- # # creator owner=jack@suse.cz seq=`basename $0` echo "QA output created by $seq" here=`pwd` tmp=/tmp/$$ status=1 # failure is the default! trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 # get standard environment, filters and checks . ./common.rc . ./common.filter . ./common.quota # real QA test starts here _supported_fs generic _supported_os Linux #IRIX _require_scratch _require_quota _require_user _need_to_be_root test_files() { echo; echo "### create files, setting up ownership (type=$type)" touch $SCRATCH_MNT/file{1,2} 2>/dev/null chown $qa_user $SCRATCH_MNT/file{1,2} 2>/dev/null chgrp $qa_user $SCRATCH_MNT/file{1,2} 2>/dev/null chmod 777 $SCRATCH_MNT 2>/dev/null } test_enforcement() { echo "### some buffered IO (type=$type)" echo "--- initiating IO..." >>$seq.full # Firstly fit below block soft limit echo "Write 900k..." su $qa_user -c "$XFS_IO_PROG -F -c 'pwrite 0 900k' -c fsync \ $SCRATCH_MNT/file1" 2>&1 >>$seq.full | tee -a $seq.full repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seq.full 2>&1 # Secondly overcome block soft limit echo "Rewrite 1001k..." su $qa_user -c "$XFS_IO_PROG -F -c 'pwrite 0 1001k' -c fsync \ $SCRATCH_MNT/file1" 2>&1 >>$seq.full | tee -a $seq.full repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seq.full 2>&1 # Now try to overcome block hardlimit echo "Write 1000k..." su $qa_user -c "$XFS_IO_PROG -F -c 'pwrite 0 1000k' -c fsync \ $SCRATCH_MNT/file2" 2>&1 >>$seq.full | tee -a $seq.full repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seq.full 2>&1 # Now sleep for grace time and check that softlimit got enforced sleep $((grace+1)) echo "Write 4096..." su $qa_user -c "$XFS_IO_PROG -F -c 'truncate 0' -c 'pwrite 0 4096' \ $SCRATCH_MNT/file2" 2>&1 >>$seq.full | tee -a $seq.full repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seq.full 2>&1 # And now the softlimit test for inodes # First reset space limits so that we don't have problems with # space reservations on XFS setquota -$type $qa_user 0 0 3 5 $SCRATCH_MNT echo "Touch 3+4" su $qa_user -c "touch $SCRATCH_MNT/file3 $SCRATCH_MNT/file4" \ 2>&1 >>$seq.full | _filter_scratch | tee -a $seq.full repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seq.full 2>&1 # Try to exceed inode hardlimit echo "Touch 5+6" su $qa_user -c "touch $SCRATCH_MNT/file5 $SCRATCH_MNT/file6" \ 2>&1 >>$seq.full | _filter_scratch | tee -a $seq.full repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seq.full 2>&1 # Wait and check grace time enforcement rm -f $SCRATCH_MNT/file5 >>$seq.full 2>&1 sleep $((grace+1)) echo "Touch 5" su $qa_user -c "touch $SCRATCH_MNT/file5" 2>&1 >>$seq.full | _filter_scratch | tee -a $seq.full repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seq.full 2>&1 echo "--- completed IO ($type)" >>$seq.full } cleanup_files() { rm -f $SCRATCH_MNT/file{1,2,3,4,5,6} } # real QA test starts here rm -f $seq.full grace=2 _scratch_mkfs >> $seq.full 2>&1 _scratch_mount "-o usrquota,grpquota" quotacheck -u -g $SCRATCH_MNT 2>/dev/null quotaon $SCRATCH_MNT 2>/dev/null setquota -u $qa_user 1000 2000 3 5 $SCRATCH_MNT setquota -u -t $grace $grace $SCRATCH_MNT setquota -g $qa_user 1000 2000 3 5 $SCRATCH_MNT setquota -g -t $grace $grace $SCRATCH_MNT umount $SCRATCH_DEV echo; echo "### test user limit enforcement" _scratch_mount "-o usrquota" quotaon $SCRATCH_MNT 2>/dev/null type=u test_files test_enforcement cleanup_files umount $SCRATCH_DEV 2>/dev/null echo; echo "### test group limit enforcement" _scratch_mount "-o grpquota" quotaon $SCRATCH_MNT 2>/dev/null type=g test_files test_enforcement cleanup_files umount $SCRATCH_DEV 2>/dev/null status=0 exit