md deadlocks on wdrain. Was: [Re: quota and snapshotsin6.1-RELEASE]

Kostik Belousov kostikbel at gmail.com
Fri Nov 24 05:53:53 PST 2006


On Thu, Nov 23, 2006 at 10:36:57PM -0000, Steven Hartland wrote:
> Thanks for that, from our point of view its required
> as without the machine deadlocks without even trying.
> 
> One real strange thing was that if I created a copy of
> the vnode file, this particular task ( installworld )
> would succeed but given the nature of the bug ( timing
> critical ) that seem to make sence.
> 
> With this still being a potential issue I think we have
> no choice but to migrate away from using any vnode backed
> jails.
> 
Ok, I think the following could be the right approach.

Index: kern/vfs_bio.c
===================================================================
RCS file: /usr/local/arch/ncvs/src/sys/kern/vfs_bio.c,v
retrieving revision 1.513
diff -u -r1.513 vfs_bio.c
--- kern/vfs_bio.c	29 Oct 2006 00:04:39 -0000	1.513
+++ kern/vfs_bio.c	24 Nov 2006 11:40:33 -0000
@@ -871,7 +871,8 @@
 		 * or syncer daemon trying to clean up as that can lead
 		 * to deadlock.
 		 */
-		if ((curthread->td_pflags & TDP_NORUNNINGBUF) == 0)
+		if ((curthread->td_pflags & TDP_NORUNNINGBUF) == 0 &&
+		    (bp->b_vp->v_vflag & VV_MD) == 0)
 			waitrunningbufspace();
 	}
 
Index: sys/vnode.h
===================================================================
RCS file: /usr/local/arch/ncvs/src/sys/sys/vnode.h,v
retrieving revision 1.318
diff -u -r1.318 vnode.h
--- sys/vnode.h	13 Nov 2006 05:51:22 -0000	1.318
+++ sys/vnode.h	24 Nov 2006 11:40:33 -0000
@@ -254,6 +254,7 @@
 #define	VV_PROCDEP	0x0100	/* vnode is process dependent */
 #define	VV_NOKNOTE	0x0200	/* don't activate knotes on this vnode */
 #define	VV_DELETED	0x0400	/* should be removed */
+#define VV_MD		0x0800	/* vnode backs the md device */
 
 /*
  * Vnode attributes.  A field value of VNOVAL represents a field whose value
Index: dev/md/md.c
===================================================================
RCS file: /usr/local/arch/ncvs/src/sys/dev/md/md.c,v
retrieving revision 1.166
diff -u -r1.166 md.c
--- dev/md/md.c	1 Nov 2006 18:59:06 -0000	1.166
+++ dev/md/md.c	24 Nov 2006 11:40:33 -0000
@@ -693,6 +693,8 @@
 	mtx_lock_spin(&sched_lock);
 	sched_prio(curthread, PRIBIO);
 	mtx_unlock_spin(&sched_lock);
+	if (sc->type == MD_VNODE)
+		curthread->td_pflags |= TDP_NORUNNINGBUF;
 
 	for (;;) {
 		mtx_lock(&sc->queue_mtx);
@@ -923,6 +925,7 @@
 		VFS_UNLOCK_GIANT(vfslocked);
 		return (error ? error : EINVAL);
 	}
+	nd.ni_vp->v_vflag |= VV_MD;
 	VOP_UNLOCK(nd.ni_vp, 0, td);
 
 	if (mdio->md_fwsectors != 0)
@@ -936,6 +939,9 @@
 
 	error = mdsetcred(sc, td->td_ucred);
 	if (error != 0) {
+		vn_lock(nd.ni_vp, LK_EXCLUSIVE | LK_RETRY, td);
+		nd.ni_vp->v_vflag &= ~VV_MD;
+		VOP_UNLOCK(nd.ni_vp, 0, td);
 		(void)vn_close(nd.ni_vp, flags, td->td_ucred, td);
 		VFS_UNLOCK_GIANT(vfslocked);
 		return (error);
@@ -966,6 +972,9 @@
 	mtx_destroy(&sc->queue_mtx);
 	if (sc->vnode != NULL) {
 		vfslocked = VFS_LOCK_GIANT(sc->vnode->v_mount);
+		vn_lock(sc->vnode, LK_EXCLUSIVE | LK_RETRY, td);
+		sc->vnode->v_vflag &= ~VV_MD;
+		VOP_UNLOCK(sc->vnode, 0, td);
 		(void)vn_close(sc->vnode, sc->flags & MD_READONLY ?
 		    FREAD : (FREAD|FWRITE), sc->cred, td);
 		VFS_UNLOCK_GIANT(vfslocked);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-stable/attachments/20061124/3ba5e8be/attachment.pgp


More information about the freebsd-stable mailing list