DF-3057 / fix.diff
diff --git a/sys/vfs/dirfs/dirfs_vnops.c b/sys/vfs/dirfs/dirfs_vnops.c index a9acfbb5..58cf1696 100644 --- a/sys/vfs/dirfs/dirfs_vnops.c +++ b/sys/vfs/dirfs/dirfs_vnops.c @@ -738,6 +738,11 @@ dirfs_write (struct vop_write_args *ap) len = uio->uio_resid; error = bread(vp, base_offset, BSIZE, &bp); + if (error) { + brelse(bp); + dbg(9, "WRITE bread failed\n"); + break; + } error = uiomovebp(bp, (char *)bp->b_data + offset, len, uio); if (error) { brelse(bp); @@ -749,10 +754,13 @@ dirfs_write (struct vop_write_args *ap) dbg(9, "WRITE dn_size=%jd uio_offset=%jd uio_resid=%jd base_offset=%jd\n", dnp->dn_size, uio->uio_offset, uio->uio_resid, base_offset); - if (ap->a_ioflag & IO_SYNC) - bwrite(bp); - else + if (ap->a_ioflag & IO_SYNC) { + error = bwrite(bp); + if (error) + break; + } else { bdwrite(bp); + } } KTR_LOG(dirfs_write, dnp, base_offset, uio->uio_resid, |