[PATCH]: possible fix for the fifoor problem

John E Hein jhein at timing.com
Tue Nov 7 16:39:49 UTC 2006


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.

It is killable with ctrl-c.

I am using linux_base-fc-4_9.


More information about the freebsd-emulation mailing list