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",
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to