svn commit: r346223 - stable/12/sys/ufs/ffs
Konstantin Belousov
kib at FreeBSD.org
Tue Sep 3 14:07:41 UTC 2019
Author: kib
Date: Mon Apr 15 12:23:33 2019
New Revision: 346223
URL: https://svnweb.freebsd.org/changeset/base/346223
Log:
MFC r346031:
Handle races when remounting UFS volume from ro to rw.
Modified:
stable/12/sys/ufs/ffs/ffs_vfsops.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/ufs/ffs/ffs_vfsops.c
==============================================================================
--- stable/12/sys/ufs/ffs/ffs_vfsops.c Mon Apr 15 12:09:58 2019 (r346222)
+++ stable/12/sys/ufs/ffs/ffs_vfsops.c Mon Apr 15 12:23:33 2019 (r346223)
@@ -154,7 +154,7 @@ ffs_mount(struct mount *mp)
struct fs *fs;
pid_t fsckpid = 0;
int error, error1, flags;
- uint64_t mntorflags;
+ uint64_t mntorflags, saved_mnt_flag;
accmode_t accmode;
struct nameidata ndp;
char *fspec;
@@ -371,25 +371,40 @@ ffs_mount(struct mount *mp)
return (error);
if ((error = vn_start_write(NULL, &mp, V_WAIT)) != 0)
return (error);
+ error = vfs_write_suspend_umnt(mp);
+ if (error != 0)
+ return (error);
fs->fs_ronly = 0;
MNT_ILOCK(mp);
- mp->mnt_flag &= ~MNT_RDONLY;
+ saved_mnt_flag = MNT_RDONLY;
+ if (MOUNTEDSOFTDEP(mp) && (mp->mnt_flag &
+ MNT_ASYNC) != 0)
+ saved_mnt_flag |= MNT_ASYNC;
+ mp->mnt_flag &= ~saved_mnt_flag;
MNT_IUNLOCK(mp);
fs->fs_mtime = time_second;
/* check to see if we need to start softdep */
if ((fs->fs_flags & FS_DOSOFTDEP) &&
(error = softdep_mount(devvp, mp, fs, td->td_ucred))){
- vn_finished_write(mp);
+ fs->fs_ronly = 1;
+ MNT_ILOCK(mp);
+ mp->mnt_flag |= saved_mnt_flag;
+ MNT_IUNLOCK(mp);
+ vfs_write_resume(mp, 0);
return (error);
}
fs->fs_clean = 0;
if ((error = ffs_sbupdate(ump, MNT_WAIT, 0)) != 0) {
- vn_finished_write(mp);
+ fs->fs_ronly = 1;
+ MNT_ILOCK(mp);
+ mp->mnt_flag |= saved_mnt_flag;
+ MNT_IUNLOCK(mp);
+ vfs_write_resume(mp, 0);
return (error);
}
if (fs->fs_snapinum[0] != 0)
ffs_snapshot_mount(mp);
- vn_finished_write(mp);
+ vfs_write_resume(mp, 0);
}
/*
* Soft updates is incompatible with "async",
More information about the svn-src-all
mailing list