Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 Jan 1999 12:14:47 -0500 (EST)
From:      Darrell Anderson <anderson@cs.duke.edu>
To:        FreeBSD-gnats-submit@FreeBSD.ORG
Subject:   kern/9679: fix for uninterruptible open in portal file system
Message-ID:  <199901251714.MAA83651@grasshopper.cs.duke.edu>

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

>Number:         9679
>Category:       kern
>Synopsis:       fix for uninterruptible open in portal file system
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Mon Jan 25 09:20:00 PST 1999
>Closed-Date:
>Last-Modified:
>Originator:     Darrell Anderson
>Release:        FreeBSD 4.0-CURRENT i386
>Organization:
Duke University Deptartment of Computer Science
>Environment:

FreeBSD 4.0-CURRENT (MYRI) #2: Mon Jan 25 10:30:24 EST 1999

>Description:

portal open is uninterruptible, ^C, etc, ignored.

>How-To-Repeat:

mkfifo /tmp/fifo
mount_portal /tmp /mnt
cat /mnt/fs/tmp/fifo
^C^C^C^C^C

>Fix:

===================================================================
RCS file: /cvs/src/sys/miscfs/portal/portal_vnops.c,v
retrieving revision 1.35
diff -u -r1.35 portal_vnops.c
--- portal_vnops.c      1999/01/12 11:49:30     1.35
+++ portal_vnops.c      1999/01/25 17:11:51
@@ -61,6 +61,7 @@
 #include <sys/socketvar.h>
 #include <sys/un.h>
 #include <sys/unpcb.h>
+#include <sys/signalvar.h>
 #include <miscfs/portal/portal.h>
 
 static int portal_fileid = PORTAL_ROOTFILEID+1;
@@ -227,6 +228,7 @@
        struct portalmount *fmp;
        struct file *fp;
        struct portal_cred pcred;
+       int signo;
 
        /*
         * Nothing to do when opening the root node.
@@ -287,7 +289,16 @@
                        splx(s);
                        goto bad;
                }
-               (void) tsleep((caddr_t) &so->so_timeo, PSOCK, "portalcon", 5 * hz);
+               (void) tsleep((caddr_t) &so->so_timeo, PCATCH|PSOCK, "portalcon", 5 * hz);
+               /*
+                * check for pending signals, return EINTR if hit.
+                */
+               if ((signo = CURSIG(curproc)) != 0) {
+                       splx(s);
+                       error = EINTR;
+                       postsig(signo);
+                       goto bad;
+               }
        }
        splx(s);
 
@@ -301,7 +312,7 @@
         */
        so->so_rcv.sb_timeo = 0;
        so->so_snd.sb_timeo = 0;
-       so->so_rcv.sb_flags |= SB_NOINTR;
+       /*so->so_rcv.sb_flags |= SB_NOINTR;*/ /* we want signals for read */
        so->so_snd.sb_flags |= SB_NOINTR;
 
 
@@ -334,6 +345,16 @@
                                        &m, &cm, &flags);
                if (error)
                        goto bad;
+               /*
+                * check for pending signals, return EINTR if hit.
+                * don't need to worry about the portal daemon b/c
+                * we close the socket on our way out.
+                */
+               if ((signo = CURSIG(curproc)) != 0) {
+                       error = EINTR;
+                       postsig(signo);
+                       goto bad;
+               }
 
                /*
                 * Grab an error code from the mbuf.

>Release-Note:
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message



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