Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 4 Dec 2020 00:48:11 +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-12@freebsd.org
Subject:   svn commit: r368318 - stable/12/sys/fs/msdosfs
Message-ID:  <202012040048.0B40mBnC098522@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Fri Dec  4 00:48:11 2020
New Revision: 368318
URL: https://svnweb.freebsd.org/changeset/base/368318

Log:
  MFC r367895:
  msdosfs: suspend around unmount or remount rw->ro.

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

Modified: stable/12/sys/fs/msdosfs/msdosfs_vfsops.c
==============================================================================
--- stable/12/sys/fs/msdosfs/msdosfs_vfsops.c	Thu Dec  3 22:23:57 2020	(r368317)
+++ stable/12/sys/fs/msdosfs/msdosfs_vfsops.c	Fri Dec  4 00:48:11 2020	(r368318)
@@ -250,22 +250,28 @@ msdosfs_mount(struct mount *mp)
 		pmp = VFSTOMSDOSFS(mp);
 		if (!(pmp->pm_flags & MSDOSFSMNT_RONLY) &&
 		    vfs_flagopt(mp->mnt_optnew, "ro", NULL, 0)) {
-			error = VFS_SYNC(mp, MNT_WAIT);
-			if (error)
+			if ((error = vn_start_write(NULL, &mp, V_WAIT)) != 0)
 				return (error);
+			error = vfs_write_suspend_umnt(mp);
+			if (error != 0)
+				return (error);
+
 			flags = WRITECLOSE;
 			if (mp->mnt_flag & MNT_FORCE)
 				flags |= FORCECLOSE;
 			error = vflush(mp, 0, flags, td);
-			if (error)
+			if (error != 0) {
+				vfs_write_resume(mp, 0);
 				return (error);
+			}
 
 			/*
 			 * Now the volume is clean.  Mark it so while the
 			 * device is still rw.
 			 */
 			error = markvoldirty(pmp, 0);
-			if (error) {
+			if (error != 0) {
+				vfs_write_resume(mp, 0);
 				(void)markvoldirty(pmp, 1);
 				return (error);
 			}
@@ -275,6 +281,7 @@ msdosfs_mount(struct mount *mp)
 			error = g_access(pmp->pm_cp, 0, -1, 0);
 			g_topology_unlock();
 			if (error) {
+				vfs_write_resume(mp, 0);
 				(void)markvoldirty(pmp, 1);
 				return (error);
 			}
@@ -288,6 +295,7 @@ msdosfs_mount(struct mount *mp)
 			MNT_ILOCK(mp);
 			mp->mnt_flag |= MNT_RDONLY;
 			MNT_IUNLOCK(mp);
+			vfs_write_resume(mp, 0);
 		} else if ((pmp->pm_flags & MSDOSFSMNT_RONLY) &&
 		    !vfs_flagopt(mp->mnt_optnew, "ro", NULL, 0)) {
 			/*
@@ -741,21 +749,31 @@ msdosfs_unmount(struct mount *mp, int mntflags)
 {
 	struct msdosfsmount *pmp;
 	int error, flags;
+	bool susp;
 
 	error = flags = 0;
 	pmp = VFSTOMSDOSFS(mp);
-	if ((pmp->pm_flags & MSDOSFSMNT_RONLY) == 0)
-		error = msdosfs_sync(mp, MNT_WAIT);
+	susp = (pmp->pm_flags & MSDOSFSMNT_RONLY) == 0;
+
+	if (susp) {
+		error = vfs_write_suspend_umnt(mp);
+		if (error != 0)
+			return (error);
+	}
+
 	if ((mntflags & MNT_FORCE) != 0)
 		flags |= FORCECLOSE;
-	else if (error != 0)
-		return (error);
 	error = vflush(mp, 0, flags, curthread);
-	if (error != 0 && error != ENXIO)
+	if (error != 0 && error != ENXIO) {
+		if (susp)
+			vfs_write_resume(mp, VR_START_WRITE);
 		return (error);
-	if ((pmp->pm_flags & MSDOSFSMNT_RONLY) == 0) {
+	}
+	if (susp) {
 		error = markvoldirty(pmp, 0);
-		if (error && error != ENXIO) {
+		if (error != 0 && error != ENXIO) {
+			if (susp)
+				vfs_write_resume(mp, VR_START_WRITE);
 			(void)markvoldirty(pmp, 1);
 			return (error);
 		}
@@ -792,6 +810,9 @@ msdosfs_unmount(struct mount *mp, int mntflags)
 		BO_UNLOCK(bo);
 	}
 #endif
+	if (susp)
+		vfs_write_resume(mp, VR_START_WRITE);
+
 	g_topology_lock();
 	g_vfs_close(pmp->pm_cp);
 	g_topology_unlock();



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