The problem illustrated here is a soft update lag with regards to the statfs(2) information. The problem is not limited to symlink(2); This is just an example. Script started on Fri Jun 27 18:17:38 2008 crashbox# cat -n symlink.sh 1 #!/bin/sh 2 3 # 4 # Copyright (c) 2008 Peter Holm 5 # All rights reserved. 6 # 7 # Redistribution and use in source and binary forms, with or without 8 # modification, are permitted provided that the following conditions 9 # are met: 10 # 1. Redistributions of source code must retain the above copyright 11 # notice, this list of conditions and the following disclaimer. 12 # 2. Redistributions in binary form must reproduce the above copyright 13 # notice, this list of conditions and the following disclaimer in the 14 # documentation and/or other materials provided with the distribution. 15 # 16 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 # SUCH DAMAGE. 27 # 28 # $Id: statfs.sh,v 1.3 2008/02/25 16:31:44 pho Exp $ 29 # 30 31 # Testing problem with premature disk full problem with symlinks 32 33 [ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 34 35 . ../default.cfg 36 37 D=$DISKIMAGE 38 dede $D 1m 1024 || exit 1 39 40 odir=`pwd` 41 dir=$MNTPOINT 42 43 cd /tmp 44 sed '1,/^EOF/d' < $odir/$0 > symlink.c 45 cc -o symlink -Wall symlink.c 46 rm -f symlink.c 47 cd $odir 48 49 mount | grep "$MNTPOINT" | grep md${MDSTART} > /dev/null && umount $MNTPOINT 50 mdconfig -l | grep md${MDSTART} > /dev/null && mdconfig -d -u ${MDSTART} 51 52 mdconfig -a -t vnode -f $D -u ${MDSTART} 53 54 55 tst() { 56 cd $dir 57 df -ik $MNTPOINT 58 i=`df -ik $MNTPOINT | tail -1 | awk '{printf "%d\n", ($7 - 500)/2}'` 59 [ $i -gt 20000 ] && i=20000 60 61 for k in `jot 5`; do 62 for j in `jot 2`; do 63 /tmp/symlink $i & 64 done 65 for j in `jot 2`; do 66 wait 67 done 68 df -ik $MNTPOINT | tail -1 69 # sleep 30 # With this enabled, soft update also works 70 done 71 cd $odir 72 } 73 74 for i in "" "-U"; do 75 echo "newfs $i /dev/md${MDSTART}" 76 newfs $i /dev/md${MDSTART} > /dev/null 2>&1 77 mount /dev/md${MDSTART} ${MNTPOINT} 78 79 tst 80 81 umount -f ${MNTPOINT} 82 done 83 mdconfig -d -u $MDSTART 84 exit 85 EOF 86 #include 87 #include 88 #include 89 #include 90 #include 91 #include 92 #include 93 #include 94 #include 95 #include 96 #include 97 98 int 99 main(int argc, char **argv) 100 { 101 int i, j; 102 int64_t size; 103 pid_t pid; 104 char file[128]; 105 106 size = atol(argv[1]); 107 108 // printf("Creating %jd symlinks...\n", size); fflush(stdout); 109 pid = getpid(); 110 for (j = 0; j < size; j++) { 111 sprintf(file,"p%05d.%05d", pid, j); 112 if (symlink("/mnt/not/there", file) == -1) { 113 if (errno != EINTR) { 114 warn("symlink(%s)", file); 115 printf("break out at %d, errno %d\n", j, errno); 116 break; 117 } 118 } 119 } 120 121 // printf("Deleting %jd files...\n", size); fflush(stdout); 122 for (i = --j; i >= 0; i--) { 123 sprintf(file,"p%05d.%05d", pid, i); 124 if (unlink(file) == -1) 125 err(3, "unlink(%s)", file); 126 127 } 128 return (0); 129 } crashbox# ./symlink.sh newfs /dev/md5 Filesystem 1024-blocks Used Avail Capacity iused ifree %iused Mounted on /dev/md5 1012974 4 931934 0% 2 141308 0% /mnt /dev/md5 1012974 978 930960 0% 2 141308 0% /mnt /dev/md5 1012974 978 930960 0% 2 141308 0% /mnt /dev/md5 1012974 978 930960 0% 2 141308 0% /mnt /dev/md5 1012974 978 930960 0% 2 141308 0% /mnt /dev/md5 1012974 978 930960 0% 2 141308 0% /mnt newfs -U /dev/md5 Filesystem 1024-blocks Used Avail Capacity iused ifree %iused Mounted on /dev/md5 1012974 4 931934 0% 2 141308 0% /mnt /dev/md5 1012974 978 930960 0% 2 141308 0% /mnt /dev/md5 1012974 1006 930932 0% 2 141308 0% /mnt /dev/md5 1012974 1006 930932 0% 2 141308 0% /mnt /mnt: create/symlink failed, no inodes free symlink: symlink(p11462.11059): symlink: symlink(p11461.10595): No space left on device No space left on device break out at 11059, errno 28 break out at 10595, errno 28 /dev/md5 1012974 574 931364 0% 2 141308 0% /mnt /mnt: create/symlink failed, no inodes free symlink: symlink(p11482.00000): No space left on device break out at 0, errno 28 symlink: symlink(p11483.00000): No space left on device break out at 0, errno 28 /dev/md5 1012974 574 931364 0% 2 141308 0% /mnt crashbox# uname -a FreeBSD crashbox.osted.lan 8.0-CURRENT FreeBSD 8.0-CURRENT #0: Thu Jun 26 20:28:08 CEST 2008 pho@crashbox.osted.lan:/usr/src/sys/i386/compile/PHO i386 crashbox# exit exit Script done on Fri Jun 27 19:27:48 2008