| #! /bin/bash | |
| # FS QA Test No. 262 | |
| # | |
| # This test checks the project quota values reported by the quota | |
| # "df" and "report" subcommands to ensure they match what they | |
| # should be. There was a bug (fixed by xfsprogs commit 7cb2d41b) | |
| # where the values reported were double what they should have been. | |
| # | |
| # SGI PV 1015651 | |
| # | |
| #----------------------------------------------------------------------- | |
| # Copyright (c) 2011 SGI. 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=aelder@sgi.com | |
| seq=$(basename $0) | |
| echo "QA output created by ${seq}" | |
| here=$(pwd) | |
| cp /dev/null "${seq}.full" | |
| tmp=/tmp/$$ | |
| my_projects=${tmp}.projects | |
| my_projid=${tmp}.projid | |
| proj_name=test_project | |
| proj_num=1 | |
| qlimit_meg=500 # 500M limit imposed = 500 * 1024 * 1024 bytes | |
| status=1 # failure is the default! | |
| trap "_cleanup; exit \$status" 0 1 2 3 15 | |
| _cleanup() | |
| { | |
| cd / | |
| rm -f ${tmp}.* | |
| } | |
| # get standard environment, filters and checks | |
| . ./common.rc | |
| . ./common.filter | |
| . ./common.quota | |
| echo "Silence is golden." | |
| # real QA test starts here | |
| proj_dir="${SCRATCH_MNT}/test" | |
| # Modify as appropriate. | |
| _supported_fs xfs | |
| _supported_os Linux | |
| _require_quota | |
| _require_scratch | |
| # Make sure the hard limits reported are what was set. | |
| # It is entirely too clever... | |
| # It exploits the fact that we've set the soft and hard limits to | |
| # the same value, and as a result the value in the fourth field in | |
| # both the "df" and the "report" output. For "report", the line we're | |
| # interested in contains our project name in the first field. For "df" | |
| # it contains our project directory in the last field. | |
| _filter_quota_rpt() { | |
| awk ' | |
| BEGIN { | |
| proj_name = "'${proj_name}'"; | |
| proj_dir = "'${proj_dir}'"; | |
| qlimit_meg = '${qlimit_meg}'; | |
| qlimit = qlimit_meg * 1024 * 1024; | |
| } | |
| # This function parses the human-readable values produced | |
| # by xfs_quota output | |
| function byte_size(value, result) { | |
| result = strtonum(value); | |
| unit = value; | |
| gsub("[0-9][0-9]*", "", unit); | |
| shift = index("KMGTPE", unit); | |
| while (shift--) | |
| result *= 1024; | |
| return result; | |
| } | |
| { | |
| if ($1 !~ proj_name && $nf !~ proj_dir) | |
| next; | |
| bsize = byte_size($4); | |
| if (bsize != qlimit) | |
| printf("hard limit %d bytes, expected %d\n", | |
| bsize, qlimit); | |
| } | |
| ' | |
| } | |
| _quota_cmd() { | |
| xfs_quota -P "${my_projid}" -D "${my_projects}" -x \ | |
| -c "$@" "${SCRATCH_MNT}" | |
| } | |
| # Set up--mount scratch and create the project directory | |
| echo ${proj_name}:${proj_num} > "${my_projid}" | |
| echo ${proj_num}:${proj_dir} > "${my_projects}" | |
| _scratch_mkfs >> "${seq}.full" 2>&1 | |
| export MOUNT_OPTIONS="-opquota" | |
| _qmount | |
| mkdir -p "${proj_dir}" | |
| # Setup the project quota directory | |
| _quota_cmd "project -s ${proj_name}" >> "${seq}.full" 2>&1 | |
| # Assign block quota limits | |
| _quota_cmd "limit -p bhard=${qlimit_meg}m bsoft=${qlimit_meg}m ${proj_name}" \ | |
| 2>> "${seq}.full" 1>&2 | |
| # See what gets reported | |
| _quota_cmd "report" | _filter_quota_rpt 2>> "${seq}.full" | |
| _quota_cmd "df" | _filter_quota_rpt 2>> "${seq}.full" | |
| # This time using "human readable" output | |
| _quota_cmd "report -h" | _filter_quota_rpt 2>> "${seq}.full" | |
| _quota_cmd "df -h" | _filter_quota_rpt 2>> "${seq}.full" | |
| # Clean up | |
| rm -rf "${proj_dir}" | |
| _scratch_unmount | |
| status=0 # success, all done |