Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 9 Jul 2002 08:58:38 -0700 (PDT)
From:      Don Lewis <dl-freebsd@catspoiler.org>
To:        jroberson@chesapeake.net, current@FreeBSD.ORG
Cc:        jroberson@chesapeake.net, current@FreeBSD.ORG
Subject:   code ordering in coredump() (was: Re: cvs commit: src/sys/tools vnode_if.awk)
Message-ID:  <200207091558.g69Fwcwr004219@gw.catspoiler.org>
In-Reply-To: <200207081423.g68ENiwr000522@gw.catspoiler.org>

next in thread | previous in thread | raw e-mail | index | archive | help
I was studying the following DEBUG_VFS_LOCKS panic and noticed something
bothersome about the ordering of the code in coredump().  It looked to
me like it made more sense to verify that the file was something that
was valid to dump to before doing the vn_start_write() stuff.
Rearranging the code also allows VOP_GETATTR() to be called before
dropping the initial lock.

> VOP_GETATTR: 0xc7445100 is not locked but should be
> Debugger("Lock violation.
> ")
> Stopped at Debugger+0x45: xchgl %ebx,in_Debugger.0
> db> tr
> Debugger(c041b364) at Debugger+0x45
> coredump(c6a2c180) at coredump+0x470
> sigexit(c6a2c180,b,0,e54f8000,c6a2c180) at sigexit+0xa4
> postsig(b) at postsig+0xe9
> ast(e5514d48) at ast+0x27e
> doreti_ast() at doreti_ast+0x1a

Index: kern_sig.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_sig.c,v
retrieving revision 1.174
diff -u -r1.174 kern_sig.c
--- kern_sig.c	3 Jul 2002 09:15:20 -0000	1.174
+++ kern_sig.c	9 Jul 2002 15:17:31 -0000
@@ -1967,8 +1967,6 @@
  * then it passes on a vnode and a size limit to the process-specific
  * coredump routine if there is one; if there _is not_ one, it returns
  * ENOSYS; otherwise it returns the error from the process-specific routine.
- *
- * XXX: VOP_GETATTR() here requires holding the vnode lock.
  */
 
 static int
@@ -2021,6 +2019,14 @@
 	NDFREE(&nd, NDF_ONLY_PNBUF);
 	vp = nd.ni_vp;
 
+	/* Don't dump to non-regular files or files with links. */
+	if (vp->v_type != VREG ||
+	    VOP_GETATTR(vp, &vattr, cred, td) || vattr.va_nlink != 1) {
+		VOP_UNLOCK(vp, 0, td);
+		error = EFAULT;
+		goto out2;
+	}
+
 	VOP_UNLOCK(vp, 0, td);
 	lf.l_whence = SEEK_SET;
 	lf.l_start = 0;
@@ -2040,12 +2046,6 @@
 		goto restart;
 	}
 
-	/* Don't dump to non-regular files or files with links. */
-	if (vp->v_type != VREG ||
-	    VOP_GETATTR(vp, &vattr, cred, td) || vattr.va_nlink != 1) {
-		error = EFAULT;
-		goto out1;
-	}
 	VATTR_NULL(&vattr);
 	vattr.va_size = 0;
 	vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
@@ -2060,7 +2060,6 @@
 	  p->p_sysent->sv_coredump(td, vp, limit) :
 	  ENOSYS;
 
-out1:
 	lf.l_type = F_UNLCK;
 	VOP_ADVLOCK(vp, (caddr_t)p, F_UNLCK, &lf, F_FLOCK);
 	vn_finished_write(mp);



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




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