svn commit: r345667 - in stable/11/sys: kern ufs/ffs
Kirk McKusick
mckusick at FreeBSD.org
Tue Sep 3 14:05:52 UTC 2019
Author: mckusick
Date: Fri Mar 29 01:16:38 2019
New Revision: 345667
URL: https://svnweb.freebsd.org/changeset/base/345667
Log:
MFC of 343536, 345077, and 345352
Collectively fixing ffs_truncate3 and dangling dependencies panics
when using ACLs.
Sponsored by: Netflix
Modified:
stable/11/sys/kern/vfs_bio.c
stable/11/sys/ufs/ffs/ffs_softdep.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/kern/vfs_bio.c
==============================================================================
--- stable/11/sys/kern/vfs_bio.c Fri Mar 29 01:15:37 2019 (r345666)
+++ stable/11/sys/kern/vfs_bio.c Fri Mar 29 01:16:38 2019 (r345667)
@@ -4479,6 +4479,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/11/sys/ufs/ffs/ffs_softdep.c
==============================================================================
--- stable/11/sys/ufs/ffs/ffs_softdep.c Fri Mar 29 01:15:37 2019 (r345666)
+++ stable/11/sys/ufs/ffs/ffs_softdep.c Fri Mar 29 01:16:38 2019 (r345667)
@@ -13902,6 +13902,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
@@ -13911,17 +13913,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));
}
More information about the svn-src-stable-11
mailing list