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>
index | next in thread | raw e-mail
>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
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199901251714.MAA83651>
