| #! /bin/bash | |
| # FS QA Test No. 109 | |
| # | |
| # ENOSPC deadlock case from Asano Masahiro. | |
| # | |
| #----------------------------------------------------------------------- | |
| # 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=nathans@sgi.com | |
| 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 | |
| # real QA test starts here | |
| _supported_fs xfs | |
| _supported_os Linux XFS | |
| _require_scratch | |
| populate() | |
| { | |
| # "faststart" lets us effectively skip (re-)population | |
| [ "X$faststart" != "X" ] && rm -f $SCRATCH_MNT/F* | |
| # create many small files using most available space | |
| echo "creating small files..." | |
| i=0 | |
| while [ $i -le $files -a "X$faststart" = "X" ]; do | |
| file=$SCRATCH_MNT/f$i | |
| xfs_io -f -d -c 'pwrite -b 64k 0 64k' $file >/dev/null | |
| let i=$i+1 | |
| done | |
| # remove every second file, freeing up lots of space | |
| echo "removing small files..." | |
| i=1 | |
| while [ $i -le $files -a "X$faststart" = "X" ]; do | |
| rm $SCRATCH_MNT/f$i | |
| let i=$i+2 | |
| done | |
| echo "flushing changes via umount/mount." | |
| umount $SCRATCH_DEV | |
| _scratch_mount | |
| } | |
| allocate() | |
| { | |
| # now try to hit the deadlock | |
| echo "starting parallel allocators..." | |
| i=0 | |
| while [ $i -le 10 ]; do | |
| file=$SCRATCH_MNT/F$i | |
| { | |
| j=0 | |
| while [ $j -lt 100 ]; do | |
| xfs_io -f -c 'pwrite -b 64k 0 16m' $file \ | |
| >/dev/null 2>&1 | |
| rm $file | |
| let j=$j+1 | |
| done | |
| } & | |
| let i=$i+1 | |
| done | |
| wait | |
| echo "all done!" | |
| } | |
| # real QA test starts here | |
| umount $SCRATCH_DEV 2>/dev/null | |
| _scratch_mount | |
| # see if faststart is possible (and requested) | |
| files=2000 | |
| faststart="" | |
| if [ -n "$FASTSTART" -a -f $SCRATCH_MNT/f0 ]; then | |
| faststart="-N" # causes us to skip the mkfs step | |
| fi | |
| umount $SCRATCH_DEV | |
| _scratch_mkfs_xfs -dsize=160m,agcount=4 $faststart | _filter_mkfs 2>$tmp.mkfs | |
| cat $tmp.mkfs >>$seq.full | |
| _scratch_mount | |
| populate | |
| allocate | |
| status=0 | |
| exit |