Author: mjg
Date: Mon Oct 20 18:00:50 2014
New Revision: 273336
URL: https://svnweb.freebsd.org/changeset/base/273336

Log:
  Provide vfs suspension support only for filesystems which need it, take
  two.
  
  nullfs and unionfs need to request suspension if underlying filesystem(s)
  use it. Utilize mnt_kern_flag for this purpose.
  
  This is a fixup for 273271.
  
  No strong objections from: kib
  Pointy hat to: mjg
  MFC after:    2 weeks

Modified:
  head/sys/fs/nullfs/null_vfsops.c
  head/sys/fs/tmpfs/tmpfs_vfsops.c
  head/sys/fs/unionfs/union_vfsops.c
  head/sys/kern/vfs_vnops.c
  head/sys/sys/mount.h
  head/sys/ufs/ffs/ffs_vfsops.c

Modified: head/sys/fs/nullfs/null_vfsops.c
==============================================================================
--- head/sys/fs/nullfs/null_vfsops.c    Mon Oct 20 17:53:49 2014        
(r273335)
+++ head/sys/fs/nullfs/null_vfsops.c    Mon Oct 20 18:00:50 2014        
(r273336)
@@ -198,6 +198,8 @@ nullfs_mount(struct mount *mp)
                    MNTK_EXTENDED_SHARED);
        }
        mp->mnt_kern_flag |= MNTK_LOOKUP_EXCL_DOTDOT;
+       mp->mnt_kern_flag |= lowerrootvp->v_mount->mnt_kern_flag &
+           MNTK_SUSPENDABLE;
        MNT_IUNLOCK(mp);
        mp->mnt_data = xmp;
        vfs_getnewfsid(mp);

Modified: head/sys/fs/tmpfs/tmpfs_vfsops.c
==============================================================================
--- head/sys/fs/tmpfs/tmpfs_vfsops.c    Mon Oct 20 17:53:49 2014        
(r273335)
+++ head/sys/fs/tmpfs/tmpfs_vfsops.c    Mon Oct 20 18:00:50 2014        
(r273336)
@@ -255,6 +255,7 @@ tmpfs_mount(struct mount *mp)
 
        MNT_ILOCK(mp);
        mp->mnt_flag |= MNT_LOCAL;
+       mp->mnt_kern_flag |= MNTK_SUSPENDABLE;
        MNT_IUNLOCK(mp);
 
        mp->mnt_data = tmp;
@@ -427,14 +428,6 @@ tmpfs_sync(struct mount *mp, int waitfor
 }
 
 /*
- * A stub created so that vfs does vn_start_write for this filesystem
- */
-static void
-tmpfs_susp_clean(struct mount *mp)
-{
-}
-
-/*
  * tmpfs vfs operations.
  */
 
@@ -445,6 +438,5 @@ struct vfsops tmpfs_vfsops = {
        .vfs_statfs =                   tmpfs_statfs,
        .vfs_fhtovp =                   tmpfs_fhtovp,
        .vfs_sync =                     tmpfs_sync,
-       .vfs_susp_clean =               tmpfs_susp_clean,
 };
 VFS_SET(tmpfs_vfsops, tmpfs, VFCF_JAIL);

Modified: head/sys/fs/unionfs/union_vfsops.c
==============================================================================
--- head/sys/fs/unionfs/union_vfsops.c  Mon Oct 20 17:53:49 2014        
(r273335)
+++ head/sys/fs/unionfs/union_vfsops.c  Mon Oct 20 18:00:50 2014        
(r273336)
@@ -297,6 +297,13 @@ unionfs_domount(struct mount *mp)
        if ((ump->um_lowervp->v_mount->mnt_flag & MNT_LOCAL) &&
            (ump->um_uppervp->v_mount->mnt_flag & MNT_LOCAL))
                mp->mnt_flag |= MNT_LOCAL;
+
+       /*
+        * Check mnt_kern_flag
+        */
+       if ((ump->um_lowervp->v_mount->mnt_flag & MNTK_SUSPENDABLE) ||
+           (ump->um_uppervp->v_mount->mnt_flag & MNTK_SUSPENDABLE))
+               mp->mnt_kern_flag |= MNTK_SUSPENDABLE;
        MNT_IUNLOCK(mp);
 
        /*

Modified: head/sys/kern/vfs_vnops.c
==============================================================================
--- head/sys/kern/vfs_vnops.c   Mon Oct 20 17:53:49 2014        (r273335)
+++ head/sys/kern/vfs_vnops.c   Mon Oct 20 18:00:50 2014        (r273336)
@@ -1576,7 +1576,7 @@ static bool
 vn_suspendable_mp(struct mount *mp)
 {
 
-       return (mp->mnt_op->vfs_susp_clean != NULL);
+       return ((mp->mnt_kern_flag & MNTK_SUSPENDABLE) != 0);
 }
 
 static bool

Modified: head/sys/sys/mount.h
==============================================================================
--- head/sys/sys/mount.h        Mon Oct 20 17:53:49 2014        (r273335)
+++ head/sys/sys/mount.h        Mon Oct 20 18:00:50 2014        (r273336)
@@ -361,7 +361,7 @@ void          __mnt_vnode_markerfree_act
 #define        MNTK_SUSPEND    0x08000000      /* request write suspension */
 #define        MNTK_SUSPEND2   0x04000000      /* block secondary writes */
 #define        MNTK_SUSPENDED  0x10000000      /* write operations are 
suspended */
-#define        MNTK_UNUSED25   0x20000000      /*  --available-- */
+#define        MNTK_SUSPENDABLE        0x20000000 /* writes can be suspended */
 #define MNTK_LOOKUP_SHARED     0x40000000 /* FS supports shared lock lookups */
 #define        MNTK_NOKNOTE    0x80000000      /* Don't send KNOTEs from VOP 
hooks */
 
@@ -754,10 +754,11 @@ vfs_statfs_t      __vfs_statfs;
        _rc; })
 
 #define        VFS_SUSP_CLEAN(MP) do {                                         
\
-       MPASS(*(MP)->mnt_op->vfs_susp_clean != NULL);                   \
-       VFS_PROLOGUE(MP);                                               \
-       (*(MP)->mnt_op->vfs_susp_clean)(MP);                            \
-       VFS_EPILOGUE(MP);                                               \
+       if (*(MP)->mnt_op->vfs_susp_clean != NULL) {                    \
+               VFS_PROLOGUE(MP);                                       \
+               (*(MP)->mnt_op->vfs_susp_clean)(MP);                    \
+               VFS_EPILOGUE(MP);                                       \
+       }                                                               \
 } while (0)
 
 #define        VFS_RECLAIM_LOWERVP(MP, VP) do {                                
\

Modified: head/sys/ufs/ffs/ffs_vfsops.c
==============================================================================
--- head/sys/ufs/ffs/ffs_vfsops.c       Mon Oct 20 17:53:49 2014        
(r273335)
+++ head/sys/ufs/ffs/ffs_vfsops.c       Mon Oct 20 18:00:50 2014        
(r273336)
@@ -1055,7 +1055,7 @@ ffs_mountfs(devvp, mp, td)
         */
        MNT_ILOCK(mp);
        mp->mnt_kern_flag |= MNTK_LOOKUP_SHARED | MNTK_EXTENDED_SHARED |
-           MNTK_NO_IOPF | MNTK_UNMAPPED_BUFS;
+           MNTK_NO_IOPF | MNTK_UNMAPPED_BUFS | MNTK_SUSPENDABLE;
        MNT_IUNLOCK(mp);
 #ifdef UFS_EXTATTR
 #ifdef UFS_EXTATTR_AUTOSTART
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to