diff options
author | rwatson <rwatson@FreeBSD.org> | 2006-04-23 16:25:30 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2006-04-23 16:25:30 +0000 |
commit | ab21c0f3d0afdc661b63f40ecffdf15536bc630c (patch) | |
tree | 68feaa69414e5f696996ced5b0c66cd055d87706 /sys | |
parent | 8f33c5d4671279b7fb7558b4766a1d7d5dbdee8c (diff) | |
download | FreeBSD-src-ab21c0f3d0afdc661b63f40ecffdf15536bc630c.zip FreeBSD-src-ab21c0f3d0afdc661b63f40ecffdf15536bc630c.tar.gz |
Eliminate unnecessary use of labels in error unwinding cases; result is
the same number or fewer lines of code.
Don't cast using caddr_t.
Remember to unlock the natm lock in some error cases where it was leaked
previously.
Annotate two cases where we'd like to hold the natm subsystem lock over
ioctls into the device driver.
Hold the natm lock longer in natm_usr_connect() so we can copy the npcb
fields while holding the mutex.
MFC after: 3 months
Diffstat (limited to 'sys')
-rw-r--r-- | sys/netnatm/natm.c | 61 |
1 files changed, 26 insertions, 35 deletions
diff --git a/sys/netnatm/natm.c b/sys/netnatm/natm.c index 1f43a4a..76beef4 100644 --- a/sys/netnatm/natm.c +++ b/sys/netnatm/natm.c @@ -102,12 +102,11 @@ natm_usr_attach(struct socket *so, int proto, d_thread_t *p) else error = soreserve(so, natm0_sendspace, natm0_recvspace); if (error) - goto out; + return (error); } - so->so_pcb = (caddr_t) (npcb = npcb_alloc(M_WAITOK)); + so->so_pcb = npcb = npcb_alloc(M_WAITOK); npcb->npcb_socket = so; -out: return (error); } @@ -145,12 +144,12 @@ natm_usr_connect(struct socket *so, struct sockaddr *nam, d_thread_t *p) snatm = (struct sockaddr_natm *)nam; if (snatm->snatm_len != sizeof(*snatm) || (npcb->npcb_flags & NPCB_FREE) == 0) { - error = EINVAL; - goto out; + NATM_UNLOCK(); + return (EINVAL); } if (snatm->snatm_family != AF_NATM) { - error = EAFNOSUPPORT; - goto out; + NATM_UNLOCK(); + return (EAFNOSUPPORT); } snatm->snatm_if[IFNAMSIZ - 1] = '\0'; /* XXX ensure null termination @@ -161,25 +160,26 @@ natm_usr_connect(struct socket *so, struct sockaddr *nam, d_thread_t *p) */ ifp = ifunit(snatm->snatm_if); if (ifp == NULL || (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { - error = ENXIO; - goto out; + NATM_UNLOCK(); + return (ENXIO); } if (ifp->if_output != atm_output) { - error = EAFNOSUPPORT; - goto out; + NATM_UNLOCK(); + return (EAFNOSUPPORT); } /* * register us with the NATM PCB layer */ if (npcb_add(npcb, ifp, snatm->snatm_vci, snatm->snatm_vpi) != npcb) { - error = EADDRINUSE; - goto out; + NATM_UNLOCK(); + return (EADDRINUSE); } - NATM_UNLOCK(); /* - * open the channel + * Open the channel. + * + * XXXRW: Eventually desirable to hold mutex over ioctl? */ bzero(&op, sizeof(op)); op.rxhand = npcb; @@ -189,19 +189,16 @@ natm_usr_connect(struct socket *so, struct sockaddr *nam, d_thread_t *p) op.param.rmtu = op.param.tmtu = ifp->if_mtu; op.param.aal = (proto == PROTO_NATMAAL5) ? ATMIO_AAL_5 : ATMIO_AAL_0; op.param.traffic = ATMIO_TRAFFIC_UBR; + NATM_UNLOCK(); IFF_LOCKGIANT(ifp); if (ifp->if_ioctl == NULL || ifp->if_ioctl(ifp, SIOCATMOPENVCC, (caddr_t)&op) != 0) { IFF_UNLOCKGIANT(ifp); - error = EIO; - goto out; + return (EIO); } IFF_UNLOCKGIANT(ifp); - soisconnected(so); - - out: return (error); } @@ -218,14 +215,16 @@ natm_usr_disconnect(struct socket *so) NATM_LOCK(); if ((npcb->npcb_flags & NPCB_CONNECTED) == 0) { + NATM_UNLOCK(); printf("natm: disconnected check\n"); - error = EIO; - goto out; + return (EIO); } ifp = npcb->npcb_ifp; /* - * disable rx + * Disable rx. + * + * XXXRW: Eventually desirable to hold mutex over ioctl? */ cl.vpi = npcb->npcb_vpi; cl.vci = npcb->npcb_vci; @@ -235,12 +234,7 @@ natm_usr_disconnect(struct socket *so) ifp->if_ioctl(ifp, SIOCATMCLOSEVCC, (caddr_t)&cl); IFF_UNLOCKGIANT(ifp); } - NATM_LOCK(); - soisdisconnected(so); - - out: - NATM_UNLOCK(); return (error); } @@ -265,10 +259,10 @@ natm_usr_send(struct socket *so, int flags, struct mbuf *m, NATM_LOCK(); if (control && control->m_len) { + NATM_UNLOCK(); m_freem(control); m_freem(m); - error = EINVAL; - goto out; + return (EINVAL); } /* @@ -276,18 +270,15 @@ natm_usr_send(struct socket *so, int flags, struct mbuf *m, */ M_PREPEND(m, sizeof(*aph), M_DONTWAIT); if (m == NULL) { + NATM_UNLOCK(); m_freem(control); - error = ENOBUFS; - goto out; + return (ENOBUFS); } aph = mtod(m, struct atm_pseudohdr *); ATM_PH_VPI(aph) = npcb->npcb_vpi; ATM_PH_SETVCI(aph, npcb->npcb_vci); ATM_PH_FLAGS(aph) = (proto == PROTO_NATMAAL5) ? ATM_PH_AAL5 : 0; - error = atm_output(npcb->npcb_ifp, m, NULL, NULL); - - out: NATM_UNLOCK(); return (error); } |