Module Name:    src
Committed By:   eeh
Date:           Mon Dec  7 04:12:10 UTC 2009

Modified Files:
        src/sys/ufs/lfs: lfs_bio.c lfs_vfsops.c lfs_vnops.c

Log Message:
Fix some more hangs and deadlocks.


To generate a diff of this commit:
cvs rdiff -u -r1.114 -r1.115 src/sys/ufs/lfs/lfs_bio.c
cvs rdiff -u -r1.280 -r1.281 src/sys/ufs/lfs/lfs_vfsops.c
cvs rdiff -u -r1.225 -r1.226 src/sys/ufs/lfs/lfs_vnops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/ufs/lfs/lfs_bio.c
diff -u src/sys/ufs/lfs/lfs_bio.c:1.114 src/sys/ufs/lfs/lfs_bio.c:1.115
--- src/sys/ufs/lfs/lfs_bio.c:1.114	Tue May  6 18:43:45 2008
+++ src/sys/ufs/lfs/lfs_bio.c	Mon Dec  7 04:12:10 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_bio.c,v 1.114 2008/05/06 18:43:45 ad Exp $	*/
+/*	$NetBSD: lfs_bio.c,v 1.115 2009/12/07 04:12:10 eeh Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2008 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_bio.c,v 1.114 2008/05/06 18:43:45 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_bio.c,v 1.115 2009/12/07 04:12:10 eeh Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -318,11 +318,9 @@
 	 * vref vnodes here so that cleaner doesn't try to reuse them.
 	 * (see XXX comment in lfs_reserveavail)
 	 */
-	mutex_enter(&vp->v_interlock);
-	lfs_vref(vp);
+	VHOLD(vp);
 	if (vp2 != NULL) {
-		mutex_enter(&vp2->v_interlock);
-		lfs_vref(vp2);
+		VHOLD(vp2);
 	}
 
 	error = lfs_reserveavail(fs, vp, vp2, fsb);
@@ -338,9 +336,9 @@
 		lfs_reserveavail(fs, vp, vp2, -fsb);
 
 done:
-	lfs_vunref(vp);
+	HOLDRELE(vp);
 	if (vp2 != NULL) {
-		lfs_vunref(vp2);
+		HOLDRELE(vp2);
 	}
 
 	return error;

Index: src/sys/ufs/lfs/lfs_vfsops.c
diff -u src/sys/ufs/lfs/lfs_vfsops.c:1.280 src/sys/ufs/lfs/lfs_vfsops.c:1.281
--- src/sys/ufs/lfs/lfs_vfsops.c:1.280	Tue Nov 17 17:08:57 2009
+++ src/sys/ufs/lfs/lfs_vfsops.c	Mon Dec  7 04:12:10 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_vfsops.c,v 1.280 2009/11/17 17:08:57 pooka Exp $	*/
+/*	$NetBSD: lfs_vfsops.c,v 1.281 2009/12/07 04:12:10 eeh Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2007, 2007
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.280 2009/11/17 17:08:57 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.281 2009/12/07 04:12:10 eeh Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_lfs.h"
@@ -1549,6 +1549,7 @@
 	vaddr_t kva;
 	off_t eof, offset, startoffset = 0;
 	size_t bytes, iobytes, skipbytes;
+	bool async = (flags & PGO_SYNCIO) == 0;
 	daddr_t lbn, blkno;
 	struct vm_page *pg;
 	struct buf *mbp, *bp;
@@ -1778,6 +1779,14 @@
 		UVMHIST_LOG(ubchist, "skipbytes %d", skipbytes, 0,0,0);
 	}
 	UVMHIST_LOG(ubchist, "returning 0", 0,0,0,0);
+
+	if (!async) {
+		/* Start a segment write. */
+		UVMHIST_LOG(ubchist, "flushing", 0,0,0,0);
+		mutex_enter(&lfs_lock);
+		lfs_flush(fs, 0, 1);
+		mutex_exit(&lfs_lock);
+	}
 	return (0);
 
     tryagain:

Index: src/sys/ufs/lfs/lfs_vnops.c
diff -u src/sys/ufs/lfs/lfs_vnops.c:1.225 src/sys/ufs/lfs/lfs_vnops.c:1.226
--- src/sys/ufs/lfs/lfs_vnops.c:1.225	Tue Nov 17 22:49:24 2009
+++ src/sys/ufs/lfs/lfs_vnops.c	Mon Dec  7 04:12:10 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_vnops.c,v 1.225 2009/11/17 22:49:24 eeh Exp $	*/
+/*	$NetBSD: lfs_vnops.c,v 1.226 2009/12/07 04:12:10 eeh Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.225 2009/11/17 22:49:24 eeh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.226 2009/12/07 04:12:10 eeh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -1768,7 +1768,8 @@
 	if (pg == NULL)
 		return;
 
-	while (pg->flags & PG_BUSY) {
+	while (pg->flags & PG_BUSY &&
+	    pg->uobject == &vp->v_uobj) {
 		mutex_exit(&vp->v_interlock);
 		if (sp->cbpp - sp->bpp > 1) {
 			/* Write gathered pages */
@@ -2157,7 +2158,7 @@
 		 */
 		ip->i_lfs_iflags |= LFSI_NO_GOP_WRITE;
 		r = genfs_do_putpages(vp, startoffset, endoffset,
-				       ap->a_flags, &busypg);
+				       ap->a_flags & ~PGO_SYNCIO, &busypg);
 		ip->i_lfs_iflags &= ~LFSI_NO_GOP_WRITE;
 		if (r != EDEADLK)
 			return r;

Reply via email to