svn commit: r306630 - in stable/10/sys/ufs: ffs ufs

Konstantin Belousov kib at FreeBSD.org
Mon Oct 3 10:15:17 UTC 2016


Author: kib
Date: Mon Oct  3 10:15:16 2016
New Revision: 306630
URL: https://svnweb.freebsd.org/changeset/base/306630

Log:
  MFC r305977:
  Be more strict when selecting between snapshot/regular mount.

Modified:
  stable/10/sys/ufs/ffs/ffs_alloc.c
  stable/10/sys/ufs/ufs/ufs_gjournal.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/ufs/ffs/ffs_alloc.c
==============================================================================
--- stable/10/sys/ufs/ffs/ffs_alloc.c	Mon Oct  3 09:41:33 2016	(r306629)
+++ stable/10/sys/ufs/ffs/ffs_alloc.c	Mon Oct  3 10:15:16 2016	(r306630)
@@ -2156,12 +2156,13 @@ ffs_blkfree_cg(ump, fs, devvp, bno, size
 		/* devvp is a snapshot */
 		dev = VTOI(devvp)->i_devvp->v_rdev;
 		cgblkno = fragstoblks(fs, cgtod(fs, cg));
-	} else {
+	} else if (devvp->v_type == VCHR) {
 		/* devvp is a normal disk device */
 		dev = devvp->v_rdev;
 		cgblkno = fsbtodb(fs, cgtod(fs, cg));
 		ASSERT_VOP_LOCKED(devvp, "ffs_blkfree_cg");
-	}
+	} else
+		return;
 #ifdef INVARIANTS
 	if ((u_int)size > fs->fs_bsize || fragoff(fs, size) != 0 ||
 	    fragnum(fs, bno) + numfrags(fs, size) > fs->fs_frag) {
@@ -2255,7 +2256,7 @@ ffs_blkfree_cg(ump, fs, devvp, bno, size
 	ACTIVECLEAR(fs, cg);
 	UFS_UNLOCK(ump);
 	mp = UFSTOVFS(ump);
-	if (MOUNTEDSOFTDEP(mp) && devvp->v_type != VREG)
+	if (MOUNTEDSOFTDEP(mp) && devvp->v_type == VCHR)
 		softdep_setup_blkfree(UFSTOVFS(ump), bp, bno,
 		    numfrags(fs, size), dephd);
 	bdwrite(bp);
@@ -2320,7 +2321,7 @@ ffs_blkfree(ump, fs, devvp, bno, size, i
 	 * it has a snapshot(s) associated with it, and one of the
 	 * snapshots wants to claim the block.
 	 */
-	if (devvp->v_type != VREG &&
+	if (devvp->v_type == VCHR &&
 	    (devvp->v_vflag & VV_COPYONWRITE) &&
 	    ffs_snapblkfree(fs, devvp, bno, size, inum, vtype, dephd)) {
 		return;
@@ -2463,10 +2464,13 @@ ffs_freefile(ump, fs, devvp, ino, mode, 
 		/* devvp is a snapshot */
 		dev = VTOI(devvp)->i_devvp->v_rdev;
 		cgbno = fragstoblks(fs, cgtod(fs, cg));
-	} else {
+	} else if (devvp->v_type == VCHR) {
 		/* devvp is a normal disk device */
 		dev = devvp->v_rdev;
 		cgbno = fsbtodb(fs, cgtod(fs, cg));
+	} else {
+		bp = NULL;
+		return (0);
 	}
 	if (ino >= fs->fs_ipg * fs->fs_ncg)
 		panic("ffs_freefile: range: dev = %s, ino = %ju, fs = %s",
@@ -2505,7 +2509,7 @@ ffs_freefile(ump, fs, devvp, ino, mode, 
 	fs->fs_fmod = 1;
 	ACTIVECLEAR(fs, cg);
 	UFS_UNLOCK(ump);
-	if (MOUNTEDSOFTDEP(UFSTOVFS(ump)) && devvp->v_type != VREG)
+	if (MOUNTEDSOFTDEP(UFSTOVFS(ump)) && devvp->v_type == VCHR)
 		softdep_setup_inofree(UFSTOVFS(ump), bp,
 		    ino + cg * fs->fs_ipg, wkhd);
 	bdwrite(bp);
@@ -2532,9 +2536,11 @@ ffs_checkfreefile(fs, devvp, ino)
 	if (devvp->v_type == VREG) {
 		/* devvp is a snapshot */
 		cgbno = fragstoblks(fs, cgtod(fs, cg));
-	} else {
+	} else if (devvp->v_type == VCHR) {
 		/* devvp is a normal disk device */
 		cgbno = fsbtodb(fs, cgtod(fs, cg));
+	} else {
+		return (1);
 	}
 	if (ino >= fs->fs_ipg * fs->fs_ncg)
 		return (1);

Modified: stable/10/sys/ufs/ufs/ufs_gjournal.c
==============================================================================
--- stable/10/sys/ufs/ufs/ufs_gjournal.c	Mon Oct  3 09:41:33 2016	(r306629)
+++ stable/10/sys/ufs/ufs/ufs_gjournal.c	Mon Oct  3 10:15:16 2016	(r306630)
@@ -70,14 +70,17 @@ ufs_gjournal_modref(struct vnode *vp, in
 	ino = ip->i_number;
 
 	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));
-	} else {
+	} else if (devvp->v_type == VCHR) {
 		/* devvp is a normal disk device */
 		dev = devvp->v_rdev;
 		cgbno = fsbtodb(fs, cgtod(fs, cg));
+	} else {
+		bp = NULL;
+		return (EIO);
 	}
 	if ((u_int)ino >= fs->fs_ipg * fs->fs_ncg)
 		panic("ufs_gjournal_modref: range: dev = %s, ino = %lu, fs = %s",


More information about the svn-src-all mailing list