Return to BSD News archive
Newsgroups: comp.os.386bsd.bugs
Path: sserve!newshost.anu.edu.au!munnari.oz.au!uunet!email!mbirgmei
From: mbirgmei@email.tuwien.ac.at (Martin BIRGMEIER)
Subject: Re: FIFOs cause lockup
Message-ID: <1993May24.064242.16966@email.tuwien.ac.at>
Organization: Technical University of Vienna
References: <C7DtDE.4A@rokkaku.atl.ga.us>
Date: Mon, 24 May 1993 06:42:42 GMT
Lines: 87
In article <C7DtDE.4A@rokkaku.atl.ga.us> kml@rokkaku.atl.ga.us (Kevin Lahey) writes:
[...]
>I rebuilt the kernel to support FIFOs using the 'options FIFO' line in the
>config file. It built fine, and the mkfifo command now works. The following
>sequence of commands will lock up the system:
>
>% mkfifo /tmp/goop
>% cat > /tmp/goop < /etc/passwd &
>% cat /tmp/goop &
>% cat > /tmp/goop < /etc/passwd &
>% cat > /tmp/goop < /etc/passwd &
[...]
I once posted the following patch, although I don't know if it is correct:
============================== cut here ==============================
*** /usr/src/sys.386bsd/kern/fifo_vnops.c.FIFO_ORIG Tue Dec 24 23:24:07 1991
--- /usr/src/sys.386bsd/kern/fifo_vnops.c Mon Mar 29 12:27:30 1993
***************
*** 150,155 ****
--- 150,156 ----
vp->v_fifoinfo = NULL;
return (error);
}
+ fip->fi_writers = fip->fi_readers = 0;
wso->so_state |= SS_CANTRCVMORE;
rso->so_state |= SS_CANTSENDMORE;
}
***************
*** 163,172 ****
}
if (mode & O_NONBLOCK)
return (0);
! while (fip->fi_writers == 0)
! if (error = tsleep((caddr_t)&fip->fi_readers, PSOCK,
! openstr, 0))
break;
} else {
fip->fi_writers++;
if (fip->fi_readers == 0 && (mode & O_NONBLOCK)) {
--- 164,177 ----
}
if (mode & O_NONBLOCK)
return (0);
! while (fip->fi_writers == 0) {
! VOP_UNLOCK(vp);
! error = tsleep((caddr_t)&fip->fi_readers, PSOCK,
! openstr, 0);
! VOP_LOCK(vp);
! if (error)
break;
+ }
} else {
fip->fi_writers++;
if (fip->fi_readers == 0 && (mode & O_NONBLOCK)) {
***************
*** 177,186 ****
if (fip->fi_readers > 0)
wakeup((caddr_t)&fip->fi_readers);
}
! while (fip->fi_readers == 0)
! if (error = tsleep((caddr_t)&fip->fi_writers,
! PSOCK, openstr, 0))
break;
}
}
if (error)
--- 182,195 ----
if (fip->fi_readers > 0)
wakeup((caddr_t)&fip->fi_readers);
}
! while (fip->fi_readers == 0) {
! VOP_UNLOCK(vp);
! error = tsleep((caddr_t)&fip->fi_writers,
! PSOCK, openstr, 0);
! VOP_LOCK(vp);
! if (error)
break;
+ }
}
}
if (error)
============================== cut here ==============================
Cheers,
Martin