Author: mckusick
Date: Fri Mar 29 01:15:37 2019
New Revision: 345666
URL: https://svnweb.freebsd.org/changeset/base/345666

Log:
  MFC of 343536, 345077, and 345352
  
  Collectively fixing ffs_truncate3 and dangling dependencies panics
  when using ACLs.
  
  Sponsored by: Netflix

Modified:
  stable/12/sys/kern/vfs_bio.c
  stable/12/sys/ufs/ffs/ffs_softdep.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/kern/vfs_bio.c
==============================================================================
--- stable/12/sys/kern/vfs_bio.c        Fri Mar 29 00:04:50 2019        
(r345665)
+++ stable/12/sys/kern/vfs_bio.c        Fri Mar 29 01:15:37 2019        
(r345666)
@@ -4852,6 +4852,8 @@ b_io_dismiss(struct buf *bp, int ioflag, bool release)
 
        if ((ioflag & IO_DIRECT) != 0)
                bp->b_flags |= B_DIRECT;
+       if ((ioflag & IO_EXT) != 0)
+               bp->b_xflags |= BX_ALTDATA;
        if ((ioflag & (IO_VMIO | IO_DIRECT)) != 0 && LIST_EMPTY(&bp->b_dep)) {
                bp->b_flags |= B_RELBUF;
                if ((ioflag & IO_NOREUSE) != 0)

Modified: stable/12/sys/ufs/ffs/ffs_softdep.c
==============================================================================
--- stable/12/sys/ufs/ffs/ffs_softdep.c Fri Mar 29 00:04:50 2019        
(r345665)
+++ stable/12/sys/ufs/ffs/ffs_softdep.c Fri Mar 29 01:15:37 2019        
(r345666)
@@ -13954,6 +13954,8 @@ softdep_bp_to_mp(bp)
        if (LIST_EMPTY(&bp->b_dep))
                return (NULL);
        vp = bp->b_vp;
+       KASSERT(vp != NULL,
+           ("%s, buffer with dependencies lacks vnode", __func__));
 
        /*
         * The ump mount point is stable after we get a correct
@@ -13963,17 +13965,33 @@ softdep_bp_to_mp(bp)
         * workitem might be freed while dereferenced.
         */
 retry:
-       if (vp->v_type == VCHR) {
+       switch (vp->v_type) {
+       case VCHR:
                VI_LOCK(vp);
                mp = vp->v_type == VCHR ? vp->v_rdev->si_mountpt : NULL;
                VI_UNLOCK(vp);
                if (mp == NULL)
                        goto retry;
-       } else if (vp->v_type == VREG || vp->v_type == VDIR ||
-           vp->v_type == VLNK) {
+               break;
+       case VREG:
+       case VDIR:
+       case VLNK:
+       case VFIFO:
+       case VSOCK:
                mp = vp->v_mount;
-       } else {
-               return (NULL);
+               break;
+       case VBLK:
+               vn_printf(vp, "softdep_bp_to_mp: unexpected block device\n");
+               /* FALLTHROUGH */
+       case VNON:
+       case VBAD:
+       case VMARKER:
+               mp = NULL;
+               break;
+       default:
+               vn_printf(vp, "unknown vnode type");
+               mp = NULL;
+               break;
        }
        return (VFSTOUFS(mp));
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to