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>