Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 Nov 2006 12:01:07 -0500
From:      Jung-uk Kim <jkim@FreeBSD.org>
To:        freebsd-emulation@FreeBSD.org
Subject:   Re: [PATCH]: possible fix for the fifoor problem
Message-ID:  <200611071201.11899.jkim@FreeBSD.org>
In-Reply-To: <17744.46794.149852.319567@gromit.timing.com>
References:  <20061106174033.GA70360@stud.fit.vutbr.cz> <17744.46794.149852.319567@gromit.timing.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--Boundary-00=_XvLUFuHvM2Pa7el
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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.
>
> It is killable with ctrl-c.
>
> I am using linux_base-fc-4_9.

Try the attached patch instead.

Jung-uk Kim

--Boundary-00=_XvLUFuHvM2Pa7el
Content-Type: text/x-diff;
  charset="iso-8859-1";
  name="linux_stats.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename="linux_stats.diff"

--- src/sys/compat/linux/linux_stats.c.orig	Sun Oct 22 07:52:11 2006
+++ src/sys/compat/linux/linux_stats.c	Tue Nov  7 11:59:21 2006
@@ -130,7 +130,7 @@
 	int temp;
 
 	temp = td->td_retval[0];
-	if (kern_open(td, path, UIO_SYSSPACE, O_RDONLY, 0) != 0)
+	if (kern_open(td, path, UIO_SYSSPACE, O_RDONLY | O_NONBLOCK, 0) != 0)
 		return;
 	fd = td->td_retval[0];
 	td->td_retval[0] = temp;

--Boundary-00=_XvLUFuHvM2Pa7el--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200611071201.11899.jkim>