svn commit: r188240 - head/sys/ufs/ffs

Edward Tomasz Napierala trasz at FreeBSD.org
Fri Feb 6 09:14:08 PST 2009


Author: trasz
Date: Fri Feb  6 17:14:07 2009
New Revision: 188240
URL: http://svn.freebsd.org/changeset/base/188240

Log:
  When a device containing mounted UFS filesystem disappears, the type
  of devvp becomes VBAD, which UFS incorrectly interprets as snapshot
  vnode, which in turns causes panic.  Fix it by replacing '!= VCHR'
  with '== VREG'.
  
  With this fix in place, you should no longer be able to panic the system
  by removing a device with an UFS filesystem mounted from it - assuming
  you don't use softupdates.
  
  Reviewed by:	kib
  Tested by:	pho
  Approved by:	rwatson (mentor)
  Sponsored by:	FreeBSD Foundation

Modified:
  head/sys/ufs/ffs/ffs_alloc.c

Modified: head/sys/ufs/ffs/ffs_alloc.c
==============================================================================
--- head/sys/ufs/ffs/ffs_alloc.c	Fri Feb  6 16:05:00 2009	(r188239)
+++ head/sys/ufs/ffs/ffs_alloc.c	Fri Feb  6 17:14:07 2009	(r188240)
@@ -1858,7 +1858,7 @@ ffs_blkfree(ump, fs, devvp, bno, size, i
 	struct cdev *dev;
 
 	cg = dtog(fs, bno);
-	if (devvp->v_type != VCHR) {
+	if (devvp->v_type == VREG) {
 		/* devvp is a snapshot */
 		dev = VTOI(devvp)->i_devvp->v_rdev;
 		cgblkno = fragstoblks(fs, cgtod(fs, cg));
@@ -1903,7 +1903,7 @@ ffs_blkfree(ump, fs, devvp, bno, size, i
 	if (size == fs->fs_bsize) {
 		fragno = fragstoblks(fs, cgbno);
 		if (!ffs_isfreeblock(fs, blksfree, fragno)) {
-			if (devvp->v_type != VCHR) {
+			if (devvp->v_type == VREG) {
 				UFS_UNLOCK(ump);
 				/* devvp is a snapshot */
 				brelse(bp);
@@ -2056,7 +2056,7 @@ ffs_freefile(ump, fs, devvp, ino, mode)
 	struct cdev *dev;
 
 	cg = ino_to_cg(fs, ino);
-	if (devvp->v_type != VCHR) {
+	if (devvp->v_type == VREG) {
 		/* devvp is a snapshot */
 		dev = VTOI(devvp)->i_devvp->v_rdev;
 		cgbno = fragstoblks(fs, cgtod(fs, cg));
@@ -2122,7 +2122,7 @@ ffs_checkfreefile(fs, devvp, ino)
 	u_int8_t *inosused;
 
 	cg = ino_to_cg(fs, ino);
-	if (devvp->v_type != VCHR) {
+	if (devvp->v_type == VREG) {
 		/* devvp is a snapshot */
 		cgbno = fragstoblks(fs, cgtod(fs, cg));
 	} else {


More information about the svn-src-head mailing list