Author: kib
Date: Fri Aug  7 04:33:06 2015
New Revision: 286397
URL: https://svnweb.freebsd.org/changeset/base/286397

Log:
  MFC r285384:
  Do not allow creation of the dirty buffers for the dead buffer objects.

Modified:
  stable/10/sys/kern/vfs_bio.c
  stable/10/sys/kern/vfs_subr.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/kern/vfs_bio.c
==============================================================================
--- stable/10/sys/kern/vfs_bio.c        Fri Aug  7 04:31:02 2015        
(r286396)
+++ stable/10/sys/kern/vfs_bio.c        Fri Aug  7 04:33:06 2015        
(r286397)
@@ -1174,6 +1174,12 @@ bufwrite(struct buf *bp)
        int vp_md;
 
        CTR3(KTR_BUF, "bufwrite(%p) vp %p flags %X", bp, bp->b_vp, bp->b_flags);
+       if ((bp->b_bufobj->bo_flag & BO_DEAD) != 0) {
+               bp->b_flags |= B_INVAL | B_RELBUF;
+               bp->b_flags &= ~B_CACHE;
+               brelse(bp);
+               return (ENXIO);
+       }
        if (bp->b_flags & B_INVAL) {
                brelse(bp);
                return (0);

Modified: stable/10/sys/kern/vfs_subr.c
==============================================================================
--- stable/10/sys/kern/vfs_subr.c       Fri Aug  7 04:31:02 2015        
(r286396)
+++ stable/10/sys/kern/vfs_subr.c       Fri Aug  7 04:33:06 2015        
(r286397)
@@ -1584,7 +1584,8 @@ buf_vlist_add(struct buf *bp, struct buf
        int error;
 
        ASSERT_BO_WLOCKED(bo);
-       KASSERT((bo->bo_flag & BO_DEAD) == 0, ("dead bo %p", bo));
+       KASSERT((xflags & BX_VNDIRTY) == 0 || (bo->bo_flag & BO_DEAD) == 0,
+           ("dead bo %p", bo));
        KASSERT((bp->b_xflags & (BX_VNDIRTY|BX_VNCLEAN)) == 0,
            ("buf_vlist_add: Buf %p has existing xflags %d", bp, bp->b_xflags));
        bp->b_xflags |= xflags;
@@ -2841,7 +2842,7 @@ vgonel(struct vnode *vp)
                while (vinvalbuf(vp, 0, 0, 0) != 0)
                        ;
        }
-#ifdef INVARIANTS
+
        BO_LOCK(&vp->v_bufobj);
        KASSERT(TAILQ_EMPTY(&vp->v_bufobj.bo_dirty.bv_hd) &&
            vp->v_bufobj.bo_dirty.bv_cnt == 0 &&
@@ -2850,7 +2851,6 @@ vgonel(struct vnode *vp)
            ("vp %p bufobj not invalidated", vp));
        vp->v_bufobj.bo_flag |= BO_DEAD;
        BO_UNLOCK(&vp->v_bufobj);
-#endif
 
        /*
         * Reclaim the vnode.
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to