[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