svn commit: r368318 - stable/12/sys/fs/msdosfs
Konstantin Belousov
kib at FreeBSD.org
Fri Dec 4 00:48:12 UTC 2020
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();
More information about the svn-src-all
mailing list