Author: kib
Date: Fri Oct 28 11:35:06 2016
New Revision: 308025
URL: https://svnweb.freebsd.org/changeset/base/308025

Log:
  Enable vn_io_fault() deadlock avoidance for msdosfs.
  
  Reported and tested by:       pho
  Sponsored by: The FreeBSD Foundation
  MFC after:    2 weeks

Modified:
  head/sys/fs/msdosfs/msdosfs_vfsops.c
  head/sys/fs/msdosfs/msdosfs_vnops.c

Modified: head/sys/fs/msdosfs/msdosfs_vfsops.c
==============================================================================
--- head/sys/fs/msdosfs/msdosfs_vfsops.c        Fri Oct 28 11:34:32 2016        
(r308024)
+++ head/sys/fs/msdosfs/msdosfs_vfsops.c        Fri Oct 28 11:35:06 2016        
(r308025)
@@ -742,7 +742,7 @@ mountmsdosfs(struct vnode *devvp, struct
        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)

Modified: head/sys/fs/msdosfs/msdosfs_vnops.c
==============================================================================
--- head/sys/fs/msdosfs/msdosfs_vnops.c Fri Oct 28 11:34:32 2016        
(r308024)
+++ head/sys/fs/msdosfs/msdosfs_vnops.c Fri Oct 28 11:35:06 2016        
(r308025)
@@ -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;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to