Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 Jan 1999 16:00:01 -0800 (PST)
From:      Bruce Evans <bde@zeta.org.au>
To:        freebsd-bugs@FreeBSD.ORG
Subject:   Re: kern/9679: fix for uninterruptible open in portal file system
Message-ID:  <199901260000.QAA21836@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/9679; it has been noted by GNATS.

From: Bruce Evans <bde@zeta.org.au>
To: anderson@cs.duke.edu, FreeBSD-gnats-submit@FreeBSD.ORG
Cc:  
Subject: Re: kern/9679: fix for uninterruptible open in portal file system
Date: Tue, 26 Jan 1999 10:50:16 +1100

 >@@ -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);
 > 
 
 Why not just check the value returned by tsleep()?
 
 >@@ -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;
 > 
 > 
 
 Don't comment out wrong code; remove it.
 
 >@@ -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.
 
 I think this should do what tsleep() would do, which is to return
 either EINTR or ERESTART immediately.  Calling postsig() is unnecessary.
 I'm not sure about the ERESTART handling.  Perhaps the problem should
 be passed to tsleep():
 
 		    if (CURSIG(curproc) != 0) {
 			    error = tsleep(... PCATCH ...);
 			    if (error != 0)
 				    goto bad;
 		    }
 
 Bruce

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?199901260000.QAA21836>