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",
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to