Newzheimer's Syndrome

Kent Forschmiedt kent at happym.UUCP
Sun Sep 18 14:30:18 AEST 1988


In article <576 at mbph.UUCP> hybl at mbph.UUCP (Albert Hybl  Dept of Biophysics  SM)
relates how he has discovered that his system has the SYSV inode cache bug.

I was going to reply by mail, but this hasn't been explained in public
lately, so I'll give it a go.

There is a boundary error in many System V's which causes a file system 
to fail to refill its inode cache when it runs out under a certain 
(internal) condition.  The problem is not likely to occur except when 
hundreds or thousands of files are created with no intervening 
deletions.  News, processing batches, does that routinely, so it tends 
to trigger the bug. 

The problem causes no file system damage, and fsck refills the inode 
cache. Since filling the cache defers the problem, using fsck frequently 
enough prevents it.  My spool/news lives on its own partition, and my 
daily news demon unmounts, cleans, and remounts it before doing the rest 
of its business.  Before I started dong this, my file system screwed up 
about 3 or 4 times a month.  Now it almost never happens. 


# @(#) newsdemon.sh
#
TZ=PST8PDT
PATH=$HOME:$PATH

cd $HOME

# This needs to be setuid root, so it is not done in line...
# do it before running expire; there might be news queued up.
# If it fails, rnews is probably running.  If so, it probably
# isn't broken anyway.  I hope.
/usr/lib/news/fixnewsfs

trap "rm -f tmp$$" 0

DAY=`date +%d`
ODD=`expr $DAY / 2`
WD=`date +%w`

if [ $WD -eq 1 ]; then

	expire -n all,all.all -e 26 -E 32
	rm -f o.Log-WEEK.Z
	mv Log-WEEK o.Log-WEEK
	compress o.Log-WEEK

elif [ $ODD -eq 1 ]; then

	expire -n junk,control,rec.all,soc.all,talk.all -e 5 -E 32

else

	expire -n misc.all,alt.all -e 14 -E 32

fi

mv log tmp$$
>log
cat tmp$$ >>Log-WEEK
echo "-------------------- `date`" >>Log-WEEK

# END newsdemon.sh

/* fixnewsfs.c */
/* this is a binary instead of a script because setuid
   scripts don't work on my system */
main()
{
	/* euid is already 0... */
	setuid(0);

	system("/etc/umount /dev/dsk/m320_1s2")
		||
	system("/etc/fsck -y /dev/dsk/m320_1s2")
		||
	system("/etc/mount /dev/dsk/m320_1s2 /u/spool/news");
}

-- 
  kent at happym.UUCP, tikal!camco!happym!kent, Happy Man Corp. USA 206-282-9598



More information about the Comp.unix.questions mailing list