Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 6 Feb 2009 17:14:07 +0000 (UTC)
From:      Edward Tomasz Napierala <trasz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r188240 - head/sys/ufs/ffs
Message-ID:  <200902061714.n16HE7Lr066980@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200902061714.n16HE7Lr066980>