[PATCH]: possible fix for the fifoor problem

Divacky Roman xdivac02 at stud.fit.vutbr.cz
Tue Nov 7 17:19:42 UTC 2006


On Tue, Nov 07, 2006 at 12:01:07PM -0500, Jung-uk Kim wrote:
> On Tuesday 07 November 2006 11:39 am, John E Hein wrote:
> > Divacky Roman wrote at 18:40 +0100 on Nov  6, 2006:
> >  > pls test
> >  > www.stud.fit.vutbr.cz/~xdivac02/linux-fifoor.patch
> >  >
> >  > and tell me if that helps you with fifoor affected tests (dup05,
> >  > select03)
> >  >
> >  > I cannot afford panic now so I am unable to test ;( and wider
> >  > testing never hurts :)
> >
> > The patch fails against RELENG_6 and -CURRENT.
> > It is probably against a local or p4 version?
> >
> > Here's one against RELENG_6 (that should also work for current).
> >
> > Index: sys/compat/linux/linux_file.c
> > ===================================================================
> > RCS file: /base/FreeBSD-CVS/src/sys/compat/linux/linux_file.c,v
> > retrieving revision 1.91.2.1
> > diff -u -p -r1.91.2.1 linux_file.c
> > --- sys/compat/linux/linux_file.c	17 Sep 2006 10:56:15
> > -0000	1.91.2.1 +++ sys/compat/linux/linux_file.c	7 Nov 2006
> > 15:52:21 -0000 @@ -92,6 +92,7 @@ linux_open(struct thread *td,
> > struct lin struct proc *p = td->td_proc;
> >      char *path;
> >      int bsd_flags, error;
> > +    struct stat sb;
> >
> >      if (args->flags & LINUX_O_CREAT)
> >  	LCONVPATHCREAT(td, args->path, &path);
> > @@ -129,6 +130,11 @@ linux_open(struct thread *td, struct lin
> >      if (args->flags & LINUX_O_NOCTTY)
> >  	bsd_flags |= O_NOCTTY;
> >
> > +    /* linux opens RDWR fifos in a nonblocking manner */
> > +    error = kern_stat(td, path, UIO_USERSPACE, &sb);
> > +    if (S_ISFIFO(sb.st_mode) && (bsd_flags & O_RDWR))
> > +	bsd_flags |= O_NONBLOCK;
> > +
> >      error = kern_open(td, path, UIO_SYSSPACE, bsd_flags,
> > args->mode); PROC_LOCK(p);
> >      if (!error && !(bsd_flags & O_NOCTTY) &&
> >
> >
> > Anyway, after patching RELENG_6 (today's source) with the above
> > patch, I tested it with:
> >
> > - run linux-seamonkey
> > - ctrl-p to bring up print dialog box
> > - check 'Print to File'
> > - click the Print button
> > - observe hang
> >
> > '/bin/ps -o wchan,command | grep seam' shows one process in the
> > fifoor state.
 
I might made mistake.... jung-uk kim seems to have better analysis 
 
> > It is killable with ctrl-c.
> >
> > I am using linux_base-fc-4_9.
> 
> Try the attached patch instead.

the patch is wrong.... this forces NONBLOCKing on all opened files
which is wrong.

according to a comment in linux source code linux never blocks for O_RDWR
which is what I tried to implement with my patch

roman


More information about the freebsd-emulation mailing list