Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 20 Feb 2012 11:27:38 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r231936 - in stable/9/sys: fs/ext2fs fs/nfsclient geom/journal kern nfsclient sys ufs/ufs
Message-ID:  <201202201127.q1KBRcpd049031@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Mon Feb 20 11:27:37 2012
New Revision: 231936
URL: http://svn.freebsd.org/changeset/base/231936

Log:
  MFC r231075:
  Instead of removing MNTK_ASYNC from mnt_kern_flag, provide a local
  thread flag to disable async i/o for current thread only. Use the
  opportunity to move DOINGASYNC() macro into sys/vnode.h and
  consistently use it through places which tested for MNTK_ASYNC.
  
  MFC r231204:
  Unbreak detection of the async mode for clustered writes after r231075.

Modified:
  stable/9/sys/fs/ext2fs/inode.h
  stable/9/sys/fs/nfsclient/nfs_clvnops.c
  stable/9/sys/geom/journal/g_journal.c
  stable/9/sys/kern/vfs_cluster.c
  stable/9/sys/kern/vfs_subr.c
  stable/9/sys/kern/vfs_syscalls.c
  stable/9/sys/nfsclient/nfs_vnops.c
  stable/9/sys/sys/proc.h
  stable/9/sys/sys/vnode.h
  stable/9/sys/ufs/ufs/inode.h
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/fs/ext2fs/inode.h
==============================================================================
--- stable/9/sys/fs/ext2fs/inode.h	Mon Feb 20 10:15:20 2012	(r231935)
+++ stable/9/sys/fs/ext2fs/inode.h	Mon Feb 20 11:27:37 2012	(r231936)
@@ -160,9 +160,6 @@ struct indir {
 #define VTOI(vp)	((struct inode *)(vp)->v_data)
 #define ITOV(ip)	((ip)->i_vnode)
 
-/* Check whether the MNTK_ASYNC flag has been set for a mount point */
-#define DOINGASYNC(vp)		((vp)->v_mount->mnt_kern_flag & MNTK_ASYNC)
-
 /* This overlays the fid structure (see mount.h). */
 struct ufid {
 	uint16_t ufid_len;	/* Length of structure. */

Modified: stable/9/sys/fs/nfsclient/nfs_clvnops.c
==============================================================================
--- stable/9/sys/fs/nfsclient/nfs_clvnops.c	Mon Feb 20 10:15:20 2012	(r231935)
+++ stable/9/sys/fs/nfsclient/nfs_clvnops.c	Mon Feb 20 11:27:37 2012	(r231936)
@@ -1385,7 +1385,7 @@ ncl_writerpc(struct vnode *vp, struct ui
 		if (ret && !error)
 			error = ret;
 	}
-	if (vp->v_mount->mnt_kern_flag & MNTK_ASYNC)
+	if (DOINGASYNC(vp))
 		*iomode = NFSWRITE_FILESYNC;
 	if (error && NFS_ISV4(vp))
 		error = nfscl_maperr(uiop->uio_td, error, (uid_t)0, (gid_t)0);

Modified: stable/9/sys/geom/journal/g_journal.c
==============================================================================
--- stable/9/sys/geom/journal/g_journal.c	Mon Feb 20 10:15:20 2012	(r231935)
+++ stable/9/sys/geom/journal/g_journal.c	Mon Feb 20 11:27:37 2012	(r231936)
@@ -2869,7 +2869,7 @@ g_journal_do_switch(struct g_class *clas
 	struct mount *mp;
 	struct bintime bt;
 	char *mountpoint;
-	int error, vfslocked;
+	int error, save, vfslocked;
 
 	DROP_GIANT();
 	g_topology_lock();
@@ -2931,10 +2931,7 @@ g_journal_do_switch(struct g_class *clas
 			goto next;
 		}
 
-		MNT_ILOCK(mp);
-		mp->mnt_noasync++;
-		mp->mnt_kern_flag &= ~MNTK_ASYNC;
-		MNT_IUNLOCK(mp);
+		save = curthread_pflags_set(TDP_SYNCIO);
 
 		GJ_TIMER_START(1, &bt);
 		vfs_msync(mp, MNT_NOWAIT);
@@ -2949,11 +2946,7 @@ g_journal_do_switch(struct g_class *clas
 			    mountpoint, error);
 		}
 
-		MNT_ILOCK(mp);
-		mp->mnt_noasync--;
-		if ((mp->mnt_flag & MNT_ASYNC) != 0 && mp->mnt_noasync == 0)
-			mp->mnt_kern_flag |= MNTK_ASYNC;
-		MNT_IUNLOCK(mp);
+		curthread_pflags_restore(save);
 
 		vn_finished_write(mp);
 

Modified: stable/9/sys/kern/vfs_cluster.c
==============================================================================
--- stable/9/sys/kern/vfs_cluster.c	Mon Feb 20 10:15:20 2012	(r231935)
+++ stable/9/sys/kern/vfs_cluster.c	Mon Feb 20 11:27:37 2012	(r231936)
@@ -604,7 +604,7 @@ cluster_write(struct vnode *vp, struct b
 	int async;
 
 	if (vp->v_type == VREG) {
-		async = vp->v_mount->mnt_kern_flag & MNTK_ASYNC;
+		async = DOINGASYNC(vp);
 		lblocksize = vp->v_mount->mnt_stat.f_iosize;
 	} else {
 		async = 0;

Modified: stable/9/sys/kern/vfs_subr.c
==============================================================================
--- stable/9/sys/kern/vfs_subr.c	Mon Feb 20 10:15:20 2012	(r231935)
+++ stable/9/sys/kern/vfs_subr.c	Mon Feb 20 11:27:37 2012	(r231936)
@@ -3521,7 +3521,7 @@ sync_fsync(struct vop_fsync_args *ap)
 {
 	struct vnode *syncvp = ap->a_vp;
 	struct mount *mp = syncvp->v_mount;
-	int error;
+	int error, save;
 	struct bufobj *bo;
 
 	/*
@@ -3551,17 +3551,10 @@ sync_fsync(struct vop_fsync_args *ap)
 		vfs_unbusy(mp);
 		return (0);
 	}
-	MNT_ILOCK(mp);
-	mp->mnt_noasync++;
-	mp->mnt_kern_flag &= ~MNTK_ASYNC;
-	MNT_IUNLOCK(mp);
+	save = curthread_pflags_set(TDP_SYNCIO);
 	vfs_msync(mp, MNT_NOWAIT);
 	error = VFS_SYNC(mp, MNT_LAZY);
-	MNT_ILOCK(mp);
-	mp->mnt_noasync--;
-	if ((mp->mnt_flag & MNT_ASYNC) != 0 && mp->mnt_noasync == 0)
-		mp->mnt_kern_flag |= MNTK_ASYNC;
-	MNT_IUNLOCK(mp);
+	curthread_pflags_restore(save);
 	vn_finished_write(mp);
 	vfs_unbusy(mp);
 	return (error);

Modified: stable/9/sys/kern/vfs_syscalls.c
==============================================================================
--- stable/9/sys/kern/vfs_syscalls.c	Mon Feb 20 10:15:20 2012	(r231935)
+++ stable/9/sys/kern/vfs_syscalls.c	Mon Feb 20 11:27:37 2012	(r231936)
@@ -134,7 +134,7 @@ sys_sync(td, uap)
 	struct sync_args *uap;
 {
 	struct mount *mp, *nmp;
-	int vfslocked;
+	int save, vfslocked;
 
 	mtx_lock(&mountlist_mtx);
 	for (mp = TAILQ_FIRST(&mountlist); mp != NULL; mp = nmp) {
@@ -145,18 +145,10 @@ sys_sync(td, uap)
 		vfslocked = VFS_LOCK_GIANT(mp);
 		if ((mp->mnt_flag & MNT_RDONLY) == 0 &&
 		    vn_start_write(NULL, &mp, V_NOWAIT) == 0) {
-			MNT_ILOCK(mp);
-			mp->mnt_noasync++;
-			mp->mnt_kern_flag &= ~MNTK_ASYNC;
-			MNT_IUNLOCK(mp);
+			save = curthread_pflags_set(TDP_SYNCIO);
 			vfs_msync(mp, MNT_NOWAIT);
 			VFS_SYNC(mp, MNT_NOWAIT);
-			MNT_ILOCK(mp);
-			mp->mnt_noasync--;
-			if ((mp->mnt_flag & MNT_ASYNC) != 0 &&
-			    mp->mnt_noasync == 0)
-				mp->mnt_kern_flag |= MNTK_ASYNC;
-			MNT_IUNLOCK(mp);
+			curthread_pflags_restore(save);
 			vn_finished_write(mp);
 		}
 		VFS_UNLOCK_GIANT(vfslocked);

Modified: stable/9/sys/nfsclient/nfs_vnops.c
==============================================================================
--- stable/9/sys/nfsclient/nfs_vnops.c	Mon Feb 20 10:15:20 2012	(r231935)
+++ stable/9/sys/nfsclient/nfs_vnops.c	Mon Feb 20 11:27:37 2012	(r231936)
@@ -1454,7 +1454,7 @@ nfs_writerpc(struct vnode *vp, struct ui
 		tsiz -= len;
 	}
 nfsmout:
-	if (vp->v_mount->mnt_kern_flag & MNTK_ASYNC)
+	if (DOINGASYNC(vp))
 		committed = NFSV3WRITE_FILESYNC;
 	*iomode = committed;
 	if (error)

Modified: stable/9/sys/sys/proc.h
==============================================================================
--- stable/9/sys/sys/proc.h	Mon Feb 20 10:15:20 2012	(r231935)
+++ stable/9/sys/sys/proc.h	Mon Feb 20 11:27:37 2012	(r231936)
@@ -400,7 +400,7 @@ do {									\
 #define	TDP_NOSLEEPING	0x00000100 /* Thread is not allowed to sleep on a sq. */
 #define	TDP_OWEUPC	0x00000200 /* Call addupc() at next AST. */
 #define	TDP_ITHREAD	0x00000400 /* Thread is an interrupt thread. */
-#define	TDP_UNUSED800	0x00000800 /* available. */
+#define	TDP_SYNCIO	0x00000800 /* Local override, disable async i/o. */
 #define	TDP_SCHED1	0x00001000 /* Reserved for scheduler private use */
 #define	TDP_SCHED2	0x00002000 /* Reserved for scheduler private use */
 #define	TDP_SCHED3	0x00004000 /* Reserved for scheduler private use */

Modified: stable/9/sys/sys/vnode.h
==============================================================================
--- stable/9/sys/sys/vnode.h	Mon Feb 20 10:15:20 2012	(r231935)
+++ stable/9/sys/sys/vnode.h	Mon Feb 20 11:27:37 2012	(r231936)
@@ -538,6 +538,10 @@ void	assert_vop_unlocked(struct vnode *v
  */
 #define VCALL(c) ((c)->a_desc->vdesc_call(c))
 
+#define DOINGASYNC(vp)	   					\
+	(((vp)->v_mount->mnt_kern_flag & MNTK_ASYNC) != 0 &&	\
+	 ((curthread->td_pflags & TDP_SYNCIO) == 0))
+
 /*
  * VMIO support inline
  */

Modified: stable/9/sys/ufs/ufs/inode.h
==============================================================================
--- stable/9/sys/ufs/ufs/inode.h	Mon Feb 20 10:15:20 2012	(r231935)
+++ stable/9/sys/ufs/ufs/inode.h	Mon Feb 20 11:27:37 2012	(r231936)
@@ -176,7 +176,6 @@ struct indir {
 /* Determine if soft dependencies are being done */
 #define DOINGSOFTDEP(vp)   ((vp)->v_mount->mnt_flag & (MNT_SOFTDEP | MNT_SUJ))
 #define MOUNTEDSOFTDEP(mp) ((mp)->mnt_flag & (MNT_SOFTDEP | MNT_SUJ))
-#define DOINGASYNC(vp)	   ((vp)->v_mount->mnt_kern_flag & MNTK_ASYNC)
 #define DOINGSUJ(vp)	   ((vp)->v_mount->mnt_flag & MNT_SUJ)
 #define MOUNTEDSUJ(mp)	   ((mp)->mnt_flag & MNT_SUJ)
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201202201127.q1KBRcpd049031>