From: Jim Rees Date: Tue, 5 Nov 2002 22:37:53 +0000 (+0000) Subject: openbsd-20021105 X-Git-Tag: openafs-devel-1_3_50~521 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=6bb19413a9df73e08eeb2f20e433cbd3fdc95cf5 openbsd-20021105 don't panic in osi_NetReceive if soreceive fails don't release root vnode in afs_root (temporary until I track down the refcount screwup) --- diff --git a/src/afs/OBSD/osi_vfsops.c b/src/afs/OBSD/osi_vfsops.c index e73a5c1..3b05ab2 100644 --- a/src/afs/OBSD/osi_vfsops.c +++ b/src/afs/OBSD/osi_vfsops.c @@ -313,11 +313,13 @@ afs_root(struct mount *mp, !(code = afs_CheckInit())) { tvp = afs_GetVCache(&afs_rootFid, &treq, NULL, NULL); if (tvp) { +printf("tvp %x %d\n", tvp, AFSTOV(tvp)->v_usecount); /* There is really no reason to over-hold this bugger--it's held by the root filesystem reference. */ if (afs_globalVp != tvp) { if (afs_globalVp) - AFS_RELE(AFSTOV(afs_globalVp)); +printf("afs_globalVp %x %d\n", afs_globalVp, AFSTOV(afs_globalVp)->v_usecount); +/* AFS_RELE(AFSTOV(afs_globalVp));*/ afs_globalVp = tvp; AFS_HOLD(AFSTOV(afs_globalVp)); } diff --git a/src/rx/OBSD/rx_knet.c b/src/rx/OBSD/rx_knet.c index 65fef1e..a9dc37d 100644 --- a/src/rx/OBSD/rx_knet.c +++ b/src/rx/OBSD/rx_knet.c @@ -20,12 +20,12 @@ int osi_NetReceive(osi_socket asocket, struct sockaddr_in *addr, struct iovec *d struct uio u; int i, code; struct iovec iov[RX_MAXIOVECS]; - struct sockaddr *sa; + struct mbuf *nam = NULL; int haveGlock = ISAFS_GLOCK(); if (nvecs > RX_MAXIOVECS) - osi_Panic("osi_NetReceive: %d: Too many iovecs.\n", nvecs); + osi_Panic("osi_NetReceive: %d: too many iovecs\n", nvecs); for (i = 0 ; i < nvecs ; i++) { iov[i].iov_base = dvec[i].iov_base; @@ -42,13 +42,18 @@ int osi_NetReceive(osi_socket asocket, struct sockaddr_in *addr, struct iovec *d if (haveGlock) AFS_GUNLOCK(); - code = soreceive(asocket, (struct sockaddr_in *) &sa, &u, NULL, NULL, NULL); + code = soreceive(asocket, (addr ? &nam : NULL), &u, NULL, NULL, NULL); if (haveGlock) AFS_GLOCK(); - *alength = *alength - u.uio_resid; - if (sa != NULL && sa->sa_family == AF_INET && addr != NULL) - *addr = *(struct sockaddr_in *)sa; + if (code) + return code; + + *alength -= u.uio_resid; + if (addr && nam) { + memcpy(addr, mtod(nam, caddr_t), nam->m_len); + m_freem(nam); + } return code; } @@ -106,22 +111,19 @@ int osi_NetSend(osi_socket asocket, struct sockaddr_in *addr, u.uio_segflg = UIO_SYSSPACE; u.uio_rw = UIO_WRITE; u.uio_procp = NULL; - if (haveGlock) - AFS_GUNLOCK(); nam = m_get(M_DONTWAIT, MT_SONAME); - if (nam == NULL) { - code = ENOBUFS; - goto bad; - } + if (!nam) + return ENOBUFS; nam->m_len = addr->sin_len = sizeof(struct sockaddr_in); - memcpy(mtod(nam, caddr_t), (caddr_t)addr, addr->sin_len); - code = sosend(asocket, mtod(nam, struct sockaddr_in *), &u, NULL, NULL, 0); - m_freem(nam); + memcpy(mtod(nam, caddr_t), addr, addr->sin_len); -bad: + if (haveGlock) + AFS_GUNLOCK(); + code = sosend(asocket, nam, &u, NULL, NULL, 0); if (haveGlock) AFS_GLOCK(); + m_freem(nam); return code; }