Author: kib
Date: Mon Jul 28 01:11:29 2014
New Revision: 269171
URL: http://svnweb.freebsd.org/changeset/base/269171

Log:
  MFC r268612:
  Add helper helper vfs_write_suspend_umnt().
  
  Fix the bug in the FFS unmount, when suspension failed, the ufs
  extattrs were not reinitialized.

Modified:
  stable/10/sys/kern/vfs_vnops.c
  stable/10/sys/sys/vnode.h
  stable/10/sys/ufs/ffs/ffs_vfsops.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/kern/vfs_vnops.c
==============================================================================
--- stable/10/sys/kern/vfs_vnops.c      Mon Jul 28 01:08:43 2014        
(r269170)
+++ stable/10/sys/kern/vfs_vnops.c      Mon Jul 28 01:11:29 2014        
(r269171)
@@ -1830,6 +1830,37 @@ vfs_write_resume(struct mount *mp, int f
 }
 
 /*
+ * Helper loop around vfs_write_suspend() for filesystem unmount VFS
+ * methods.
+ */
+int
+vfs_write_suspend_umnt(struct mount *mp)
+{
+       int error;
+
+       KASSERT((curthread->td_pflags & TDP_IGNSUSP) == 0,
+           ("vfs_write_suspend_umnt: recursed"));
+
+       /* dounmount() already called vn_start_write(). */
+       for (;;) {
+               vn_finished_write(mp);
+               error = vfs_write_suspend(mp, 0);
+               if (error != 0)
+                       return (error);
+               MNT_ILOCK(mp);
+               if ((mp->mnt_kern_flag & MNTK_SUSPENDED) != 0)
+                       break;
+               MNT_IUNLOCK(mp);
+               vn_start_write(NULL, &mp, V_WAIT);
+       }
+       mp->mnt_kern_flag &= ~(MNTK_SUSPENDED | MNTK_SUSPEND2);
+       wakeup(&mp->mnt_flag);
+       MNT_IUNLOCK(mp);
+       curthread->td_pflags |= TDP_IGNSUSP;
+       return (0);
+}
+
+/*
  * Implement kqueues for files by translating it to vnode operation.
  */
 static int

Modified: stable/10/sys/sys/vnode.h
==============================================================================
--- stable/10/sys/sys/vnode.h   Mon Jul 28 01:08:43 2014        (r269170)
+++ stable/10/sys/sys/vnode.h   Mon Jul 28 01:11:29 2014        (r269171)
@@ -721,6 +721,7 @@ int vfs_cache_lookup(struct vop_lookup_a
 void   vfs_timestamp(struct timespec *);
 void   vfs_write_resume(struct mount *mp, int flags);
 int    vfs_write_suspend(struct mount *mp, int flags);
+int    vfs_write_suspend_umnt(struct mount *mp);
 int    vop_stdbmap(struct vop_bmap_args *);
 int    vop_stdfsync(struct vop_fsync_args *);
 int    vop_stdgetwritemount(struct vop_getwritemount_args *);

Modified: stable/10/sys/ufs/ffs/ffs_vfsops.c
==============================================================================
--- stable/10/sys/ufs/ffs/ffs_vfsops.c  Mon Jul 28 01:08:43 2014        
(r269170)
+++ stable/10/sys/ufs/ffs/ffs_vfsops.c  Mon Jul 28 01:11:29 2014        
(r269171)
@@ -255,31 +255,9 @@ ffs_mount(struct mount *mp)
                         */
                        if ((error = vn_start_write(NULL, &mp, V_WAIT)) != 0)
                                return (error);
-                       for (;;) {
-                               vn_finished_write(mp);
-                               if ((error = vfs_write_suspend(mp, 0)) != 0)
-                                       return (error);
-                               MNT_ILOCK(mp);
-                               if (mp->mnt_kern_flag & MNTK_SUSPENDED) {
-                                       /*
-                                        * Allow the secondary writes
-                                        * to proceed.
-                                        */
-                                       mp->mnt_kern_flag &= ~(MNTK_SUSPENDED |
-                                           MNTK_SUSPEND2);
-                                       wakeup(&mp->mnt_flag);
-                                       MNT_IUNLOCK(mp);
-                                       /*
-                                        * Allow the curthread to
-                                        * ignore the suspension to
-                                        * synchronize on-disk state.
-                                        */
-                                       td->td_pflags |= TDP_IGNSUSP;
-                                       break;
-                               }
-                               MNT_IUNLOCK(mp);
-                               vn_start_write(NULL, &mp, V_WAIT);
-                       }
+                       error = vfs_write_suspend_umnt(mp);
+                       if (error != 0)
+                               return (error);
                        /*
                         * Check for and optionally get rid of files open
                         * for writing.
@@ -1250,25 +1228,9 @@ ffs_unmount(mp, mntflags)
        }
 #endif
        if (susp) {
-               /*
-                * dounmount already called vn_start_write().
-                */
-               for (;;) {
-                       vn_finished_write(mp);
-                       if ((error = vfs_write_suspend(mp, 0)) != 0)
-                               return (error);
-                       MNT_ILOCK(mp);
-                       if (mp->mnt_kern_flag & MNTK_SUSPENDED) {
-                               mp->mnt_kern_flag &= ~(MNTK_SUSPENDED |
-                                   MNTK_SUSPEND2);
-                               wakeup(&mp->mnt_flag);
-                               MNT_IUNLOCK(mp);
-                               td->td_pflags |= TDP_IGNSUSP;
-                               break;
-                       }
-                       MNT_IUNLOCK(mp);
-                       vn_start_write(NULL, &mp, V_WAIT);
-               }
+               error = vfs_write_suspend_umnt(mp);
+               if (error != 0)
+                       goto fail1;
        }
        if (MOUNTEDSOFTDEP(mp))
                error = softdep_flushfiles(mp, flags, td);
@@ -1331,6 +1293,7 @@ ffs_unmount(mp, mntflags)
 fail:
        if (susp)
                vfs_write_resume(mp, VR_START_WRITE);
+fail1:
 #ifdef UFS_EXTATTR
        if (e_restart) {
                ufs_extattr_uepm_init(&ump->um_extattr);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to