Enable vn_io_fault() deadlock avoidance for msdosfs.
Reported and tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 2 weeks
This commit is contained in:
parent
097a1d5fbb
commit
84700300cf
@ -742,7 +742,7 @@ mountmsdosfs(struct vnode *devvp, struct mount *mp)
|
||||
mp->mnt_stat.f_fsid.val[1] = mp->mnt_vfc->vfc_typenum;
|
||||
MNT_ILOCK(mp);
|
||||
mp->mnt_flag |= MNT_LOCAL;
|
||||
mp->mnt_kern_flag |= MNTK_USES_BCACHE;
|
||||
mp->mnt_kern_flag |= MNTK_USES_BCACHE | MNTK_NO_IOPF;
|
||||
MNT_IUNLOCK(mp);
|
||||
|
||||
if (pmp->pm_flags & MSDOSFS_LARGEFS)
|
||||
|
@ -593,7 +593,7 @@ msdosfs_read(struct vop_read_args *ap)
|
||||
diff = blsize - bp->b_resid;
|
||||
if (diff < n)
|
||||
n = diff;
|
||||
error = uiomove(bp->b_data + on, (int) n, uio);
|
||||
error = vn_io_fault_uiomove(bp->b_data + on, (int) n, uio);
|
||||
brelse(bp);
|
||||
} while (error == 0 && uio->uio_resid > 0 && n != 0);
|
||||
if (!isadir && (error == 0 || uio->uio_resid != orig_resid) &&
|
||||
@ -723,6 +723,12 @@ msdosfs_write(struct vop_write_args *ap)
|
||||
* then no need to read data from disk.
|
||||
*/
|
||||
bp = getblk(thisvp, bn, pmp->pm_bpcluster, 0, 0, 0);
|
||||
/*
|
||||
* This call to vfs_bio_clrbuf() ensures that
|
||||
* even if vn_io_fault_uiomove() below faults,
|
||||
* garbage from the newly instantiated buffer
|
||||
* is not exposed to the userspace via mmap().
|
||||
*/
|
||||
vfs_bio_clrbuf(bp);
|
||||
/*
|
||||
* Do the bmap now, since pcbmap needs buffers
|
||||
@ -760,7 +766,7 @@ msdosfs_write(struct vop_write_args *ap)
|
||||
/*
|
||||
* Copy the data from user space into the buf header.
|
||||
*/
|
||||
error = uiomove(bp->b_data + croffset, n, uio);
|
||||
error = vn_io_fault_uiomove(bp->b_data + croffset, n, uio);
|
||||
if (error) {
|
||||
brelse(bp);
|
||||
break;
|
||||
|
Loading…
x
Reference in New Issue
Block a user