!(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));
}
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;
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;
}
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;
}