From nobody@FreeBSD.org  Fri Dec  4 22:35:14 2009
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 803611065696
	for <freebsd-gnats-submit@FreeBSD.org>; Fri,  4 Dec 2009 22:35:14 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21])
	by mx1.freebsd.org (Postfix) with ESMTP id 6F93B8FC21
	for <freebsd-gnats-submit@FreeBSD.org>; Fri,  4 Dec 2009 22:35:14 +0000 (UTC)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.14.3/8.14.3) with ESMTP id nB4MZEEp047491
	for <freebsd-gnats-submit@FreeBSD.org>; Fri, 4 Dec 2009 22:35:14 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.14.3/8.14.3/Submit) id nB4MZEjV047490;
	Fri, 4 Dec 2009 22:35:14 GMT
	(envelope-from nobody)
Message-Id: <200912042235.nB4MZEjV047490@www.freebsd.org>
Date: Fri, 4 Dec 2009 22:35:14 GMT
From: Dominik Ernst <dernst@gmx.de>
To: freebsd-gnats-submit@FreeBSD.org
Subject: fsync() on FIFO causes panic() on zfs
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         141177
>Category:       kern
>Synopsis:       [zfs] fsync() on FIFO causes panic() on zfs
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    freebsd-fs
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Dec 04 22:40:02 UTC 2009
>Closed-Date:    Sat Mar 20 00:24:41 UTC 2010
>Last-Modified:  Sat Mar 20 00:24:41 UTC 2010
>Originator:     Dominik Ernst
>Release:        8.0-RELEASE
>Organization:
>Environment:
FreeBSD traal 8.0-RELEASE FreeBSD 8.0-RELEASE #0: Sun Nov 29 01:42:39 UTC 2009     root@:/usr/obj/usr/src/sys/GENERIC  amd64
>Description:
Having created a FIFO on a zfs filesystem with someone reading on it, causes a panic() if you write() and fsync() on it. Seems zfs related since I could not reproduce it with a FIFO on a UFS filesystem.

Reproduced it so far on two different machines running 8.0/amd64 and once in VirtualBox using stock kernel and base system for 8.0/i386. 
>How-To-Repeat:
mkfifo /mnt/zfs/testpipe
tail -f /mnt/zfs/testpipe &

cc test.c -o test
./test


with ./test.c being something like this:
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>

int main(void) {
        char fifo[] = "/mnt/zfs/testpipe";
        int fd;

        fd = open(fifo, O_WRONLY);
        if(fd < 0) {
                perror("open");
                return 1;
        }

        write(fd, "asdf\n", sizeof(char)*5);
        fsync(fd);

        close(fd);


        return 0;
}

alternatively vim from ports can be used too, typing something like this on an opened file:
:w >> /mnt/zfs/testpipe
>Fix:


>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->freebsd-fs 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Fri Dec 4 23:07:15 UTC 2009 
Responsible-Changed-Why:  
Over to maintainer(s). 

http://www.freebsd.org/cgi/query-pr.cgi?pr=141177 

From: Kostik Belousov <kostikbel@gmail.com>
To: Dominik Ernst <dernst@gmx.de>
Cc: bug-followup@freebsd.org
Subject: Re: kern/141177: [zfs] fsync() on FIFO causes panic() on zfs
Date: Sat, 5 Dec 2009 01:41:31 +0200

 ZFS explicitely puts VOP_PANIC as fsync vop for fifos. I think
 the following patch fixes it.
 
 diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
 index 7608d76..4f61f5f 100644
 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
 +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
 @@ -5009,7 +5009,7 @@ struct vop_vector zfs_vnodeops = {
  
  struct vop_vector zfs_fifoops = {
  	.vop_default =		&fifo_specops,
 -	.vop_fsync =		VOP_PANIC,
 +	.vop_fsync =		zfs_freebsd_fsync,
  	.vop_access =		zfs_freebsd_access,
  	.vop_getattr =		zfs_freebsd_getattr,
  	.vop_inactive =		zfs_freebsd_inactive,

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/141177: commit references a PR
Date: Sat,  5 Dec 2009 20:36:54 +0000 (UTC)

 Author: kib
 Date: Sat Dec  5 20:36:42 2009
 New Revision: 200162
 URL: http://svn.freebsd.org/changeset/base/200162
 
 Log:
   Change VOP_FSYNC for zfs vnode from VOP_PANIC to zfs_freebsd_fsync(),
   both to not panic when fsync(2) is called for fifo on zfs
   filedescriptor, and to actually fsync fifo inode to permanent storage.
   
   PR:	kern/141177
   Reviewed by:	pjd
   MFC after:	1 week
 
 Modified:
   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
 
 Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
 ==============================================================================
 --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	Sat Dec  5 20:26:55 2009	(r200161)
 +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	Sat Dec  5 20:36:42 2009	(r200162)
 @@ -5009,7 +5009,7 @@ struct vop_vector zfs_vnodeops = {
  
  struct vop_vector zfs_fifoops = {
  	.vop_default =		&fifo_specops,
 -	.vop_fsync =		VOP_PANIC,
 +	.vop_fsync =		zfs_freebsd_fsync,
  	.vop_access =		zfs_freebsd_access,
  	.vop_getattr =		zfs_freebsd_getattr,
  	.vop_inactive =		zfs_freebsd_inactive,
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 

From: Dominik Ernst <dernst@gmx.de>
To: Kostik Belousov <kostikbel@gmail.com>
Cc: bug-followup@freebsd.org
Subject: Re: kern/141177: [zfs] fsync() on FIFO causes panic() on zfs
Date: Sun, 6 Dec 2009 12:20:55 +0100

 Thanks that seems to work as far as i can tell.
 
 
 On Sat, 5 Dec 2009 01:41:31 +0200
 Kostik Belousov <kostikbel@gmail.com> wrote:
 
 > ZFS explicitely puts VOP_PANIC as fsync vop for fifos. I think
 > the following patch fixes it.
 > 
 > diff --git
 > a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
 > b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c index
 > 7608d76..4f61f5f 100644 ---
 > a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c +++
 > b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c @@
 > -5009,7 +5009,7 @@ struct vop_vector zfs_vnodeops = { struct
 > vop_vector zfs_fifoops = { .vop_default =
 > &fifo_specops,
 > -	.vop_fsync =		VOP_PANIC,
 > +	.vop_fsync =		zfs_freebsd_fsync,
 >  	.vop_access =		zfs_freebsd_access,
 >  	.vop_getattr =		zfs_freebsd_getattr,
 >  	.vop_inactive =		zfs_freebsd_inactive,
 > 
 
State-Changed-From-To: open->closed 
State-Changed-By: pjd 
State-Changed-When: sob 20 mar 2010 00:24:09 UTC 
State-Changed-Why:  
Problem fixed. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=141177 
>Unformatted:
