summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_syscalls.c
diff options
context:
space:
mode:
authortanimura <tanimura@FreeBSD.org>2002-05-31 11:52:35 +0000
committertanimura <tanimura@FreeBSD.org>2002-05-31 11:52:35 +0000
commite6fa9b9e922913444c2e6b2b58bf3de5eaed868d (patch)
tree9d5f24794525313566896ab89aa860515db344a6 /sys/kern/uipc_syscalls.c
parent1ea6cbb8c29088e04528460633798a6c131ca1ba (diff)
downloadFreeBSD-src-e6fa9b9e922913444c2e6b2b58bf3de5eaed868d.zip
FreeBSD-src-e6fa9b9e922913444c2e6b2b58bf3de5eaed868d.tar.gz
Back out my lats commit of locking down a socket, it conflicts with hsu's work.
Requested by: hsu
Diffstat (limited to 'sys/kern/uipc_syscalls.c')
-rw-r--r--sys/kern/uipc_syscalls.c37
1 files changed, 2 insertions, 35 deletions
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index 0c00fe5..f80dcc9 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -245,15 +245,12 @@ accept1(td, uap, compat)
if (error)
goto done2;
s = splnet();
- SOCK_LOCK(head);
if ((head->so_options & SO_ACCEPTCONN) == 0) {
- SOCK_UNLOCK(head);
splx(s);
error = EINVAL;
goto done;
}
if ((head->so_state & SS_NBIO) && TAILQ_EMPTY(&head->so_comp)) {
- SOCK_UNLOCK(head);
splx(s);
error = EWOULDBLOCK;
goto done;
@@ -263,16 +260,13 @@ accept1(td, uap, compat)
head->so_error = ECONNABORTED;
break;
}
- error = msleep((caddr_t)&head->so_timeo,
- SOCK_MTX(head), PSOCK | PCATCH,
+ error = tsleep((caddr_t)&head->so_timeo, PSOCK | PCATCH,
"accept", 0);
if (error) {
- SOCK_UNLOCK(head);
splx(s);
goto done;
}
}
- SOCK_UNLOCK(head);
if (head->so_error) {
error = head->so_error;
head->so_error = 0;
@@ -311,17 +305,13 @@ accept1(td, uap, compat)
/* connection has been removed from the listen queue */
KNOTE(&head->so_rcv.sb_sel.si_note, 0);
- SOCK_LOCK(so);
so->so_state &= ~SS_COMP;
- SOCK_UNLOCK(so);
so->so_head = NULL;
if (head->so_sigio != NULL)
fsetown(fgetown(head->so_sigio), &so->so_sigio);
FILE_LOCK(nfp);
- SOCK_LOCK(so);
soref(so); /* file descriptor reference */
- SOCK_UNLOCK(so);
nfp->f_data = (caddr_t)so; /* nfp has ref count from falloc */
nfp->f_flag = fflag;
nfp->f_ops = &socketops;
@@ -442,30 +432,24 @@ connect(td, uap)
mtx_lock(&Giant);
if ((error = fgetsock(td, uap->s, &so, NULL)) != 0)
goto done2;
- SOCK_LOCK(so);
if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) {
- SOCK_UNLOCK(so);
error = EALREADY;
goto done1;
}
- SOCK_UNLOCK(so);
error = getsockaddr(&sa, uap->name, uap->namelen);
if (error)
goto done1;
error = soconnect(so, sa, td);
if (error)
goto bad;
- SOCK_LOCK(so);
if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) {
- SOCK_UNLOCK(so);
FREE(sa, M_SONAME);
error = EINPROGRESS;
goto done1;
}
s = splnet();
while ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) {
- error = msleep((caddr_t)&so->so_timeo,
- SOCK_MTX(so), PSOCK | PCATCH, "connec", 0);
+ error = tsleep((caddr_t)&so->so_timeo, PSOCK | PCATCH, "connec", 0);
if (error)
break;
}
@@ -473,12 +457,9 @@ connect(td, uap)
error = so->so_error;
so->so_error = 0;
}
- SOCK_UNLOCK(so);
splx(s);
bad:
- SOCK_LOCK(so);
so->so_state &= ~SS_ISCONNECTING;
- SOCK_UNLOCK(so);
FREE(sa, M_SONAME);
if (error == ERESTART)
error = EINTR;
@@ -1431,13 +1412,10 @@ getpeername1(td, uap, compat)
mtx_lock(&Giant);
if ((error = fgetsock(td, uap->fdes, &so, NULL)) != 0)
goto done2;
- SOCK_LOCK(so);
if ((so->so_state & (SS_ISCONNECTED|SS_ISCONFIRMING)) == 0) {
- SOCK_UNLOCK(so);
error = ENOTCONN;
goto done1;
}
- SOCK_UNLOCK(so);
error = copyin((caddr_t)uap->alen, (caddr_t)&len, sizeof (len));
if (error)
goto done1;
@@ -1695,13 +1673,10 @@ sendfile(struct thread *td, struct sendfile_args *uap)
error = EINVAL;
goto done;
}
- SOCK_LOCK(so);
if ((so->so_state & SS_ISCONNECTED) == 0) {
- SOCK_UNLOCK(so);
error = ENOTCONN;
goto done;
}
- SOCK_UNLOCK(so);
if (uap->offset < 0) {
error = EINVAL;
goto done;
@@ -1764,17 +1739,14 @@ retry_lookup:
* Optimize the non-blocking case by looking at the socket space
* before going to the extra work of constituting the sf_buf.
*/
- SOCK_LOCK(so);
if ((so->so_state & SS_NBIO) && sbspace(&so->so_snd) <= 0) {
if (so->so_state & SS_CANTSENDMORE)
error = EPIPE;
else
error = EAGAIN;
- SOCK_UNLOCK(so);
sbunlock(&so->so_snd);
goto done;
}
- SOCK_UNLOCK(so);
/*
* Attempt to look up the page.
*
@@ -1897,7 +1869,6 @@ retry_space:
* blocks before the pru_send (or more accurately, any blocking
* results in a loop back to here to re-check).
*/
- SOCK_LOCK(so);
if ((so->so_state & SS_CANTSENDMORE) || so->so_error) {
if (so->so_state & SS_CANTSENDMORE) {
error = EPIPE;
@@ -1905,7 +1876,6 @@ retry_space:
error = so->so_error;
so->so_error = 0;
}
- SOCK_UNLOCK(so);
m_freem(m);
sbunlock(&so->so_snd);
splx(s);
@@ -1918,14 +1888,12 @@ retry_space:
*/
if (sbspace(&so->so_snd) < so->so_snd.sb_lowat) {
if (so->so_state & SS_NBIO) {
- SOCK_UNLOCK(so);
m_freem(m);
sbunlock(&so->so_snd);
splx(s);
error = EAGAIN;
goto done;
}
- SOCK_UNLOCK(so);
error = sbwait(&so->so_snd);
/*
* An error from sbwait usually indicates that we've
@@ -1940,7 +1908,6 @@ retry_space:
}
goto retry_space;
}
- SOCK_UNLOCK(so);
error = (*so->so_proto->pr_usrreqs->pru_send)(so, 0, m, 0, 0, td);
splx(s);
if (error) {
OpenPOWER on IntegriCloud