Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 11 Nov 2016 19:40:34 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r308545 - stable/11/sys/fs/msdosfs
Message-ID:  <201611111940.uABJeYra000529@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Fri Nov 11 19:40:34 2016
New Revision: 308545
URL: https://svnweb.freebsd.org/changeset/base/308545

Log:
  MFC r308025:
  Enable vn_io_fault() deadlock avoidance for msdosfs.

Modified:
  stable/11/sys/fs/msdosfs/msdosfs_vfsops.c
  stable/11/sys/fs/msdosfs/msdosfs_vnops.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/fs/msdosfs/msdosfs_vfsops.c
==============================================================================
--- stable/11/sys/fs/msdosfs/msdosfs_vfsops.c	Fri Nov 11 19:37:51 2016	(r308544)
+++ stable/11/sys/fs/msdosfs/msdosfs_vfsops.c	Fri Nov 11 19:40:34 2016	(r308545)
@@ -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: stable/11/sys/fs/msdosfs/msdosfs_vnops.c
==============================================================================
--- stable/11/sys/fs/msdosfs/msdosfs_vnops.c	Fri Nov 11 19:37:51 2016	(r308544)
+++ stable/11/sys/fs/msdosfs/msdosfs_vnops.c	Fri Nov 11 19:40:34 2016	(r308545)
@@ -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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201611111940.uABJeYra000529>