Date: Wed, 30 May 2001 10:41:46 -0700 (PDT) From: Jean-Luc.Richier@imag.fr To: freebsd-gnats-submit@FreeBSD.org Subject: kern/27776: rpc.lockd panic with FreeBSD-5.0 Message-ID: <200105301741.f4UHfk704230@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 27776
>Category: kern
>Synopsis: rpc.lockd panic with FreeBSD-5.0
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Wed May 30 10:50:00 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator: Jean-Luc Richier
>Release: FreeBSD 5.0
>Organization:
IMAG
>Environment:
FreeBSD lagavulin.imag.fr 5.0-CURRENT FreeBSD 5.0-CURRENT #0: Wed May 30 12:53:26 MEST 2001
>Description:
On a FreeBSD 5-0, source dated may 2001, kernel compiled with witness
option, activating rpc.lockd causes a panic (witness violation on
holding locks when syscall returns)
>How-To-Repeat:
make a kernel with WITNESS option, current file nfs/nfs_lock.c
(I checked with files dated 18 may 2001 or 26 may), start rpc.statd and
rpc.lockd, and make some locks on nfs shared files
The system will panic with witness error:
system call nfssvc returning with mutex(s) held
>Fix:
The problem is in nfslockdans in nfs/nfs_lock.c
This function call pfind which return a pointer to a locked proc.
But ther is no calls to PROC_UNLOCK done.
A patch is:
*** /usr/src/P50/sys/nfs/nfs_lock.c.DIST Sat May 26 01:36:46 2001
--- /usr/src/P50/sys/nfs/nfs_lock.c Wed May 30 11:58:06 2001
***************
*** 128,134 ****
/*
* XXX -- I think this is wrong for anything other AF_INET.
*/
! msg.lm_addr = *(VFSTONFS(vp->v_mount)->nm_nam);
msg.lm_fh_len = NFS_ISV3(vp) ? VTONFS(vp)->n_fhsize : NFSX_V2FH;
bcopy(VTONFS(vp)->n_fhp, msg.lm_fh, msg.lm_fh_len);
msg.lm_nfsv3 = NFS_ISV3(vp);
--- 128,135 ----
/*
* XXX -- I think this is wrong for anything other AF_INET.
*/
! bcopy(VFSTONFS(vp->v_mount)->nm_nam, &msg.lm_addr,
! min(sizeof msg.lm_addr, VFSTONFS(vp->v_mount)->nm_nam->sa_len)); msg.lm_fh_len = NFS_ISV3(vp) ? VTONFS(vp)->n_fhsize : NFSX_V2FH;
bcopy(VTONFS(vp)->n_fhp, msg.lm_fh, msg.lm_fh_len);
msg.lm_nfsv3 = NFS_ISV3(vp);
***************
*** 260,267 ****
((ansp->la_msg_ident.msg_seq != -1) &&
(timevalcmp(&p->p_nlminfo->pid_start,
&ansp->la_msg_ident.pid_start, !=) ||
! p->p_nlminfo->msg_seq != ansp->la_msg_ident.msg_seq)))
return (EPIPE);
p->p_nlminfo->retcode = ansp->la_errno;
p->p_nlminfo->set_getlk_pid = ansp->la_set_getlk_pid;
--- 261,270 ----
((ansp->la_msg_ident.msg_seq != -1) &&
(timevalcmp(&p->p_nlminfo->pid_start,
&ansp->la_msg_ident.pid_start, !=) ||
! p->p_nlminfo->msg_seq != ansp->la_msg_ident.msg_seq))) {
return (EPIPE);
+ PROC_UNLOCK(p);
+ }
p->p_nlminfo->retcode = ansp->la_errno;
p->p_nlminfo->set_getlk_pid = ansp->la_set_getlk_pid;
***************
*** 269,273 ****
--- 272,277 ----
(void)wakeup((void *)p->p_nlminfo);
+ PROC_UNLOCK(p);
return (0);
}
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200105301741.f4UHfk704230>
