openbsd-20021105
authorJim Rees <rees@umich.edu>
Tue, 5 Nov 2002 22:37:53 +0000 (22:37 +0000)
committerJim Rees <rees@umich.edu>
Tue, 5 Nov 2002 22:37:53 +0000 (22:37 +0000)
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)

src/afs/OBSD/osi_vfsops.c
src/rx/OBSD/rx_knet.c

index e73a5c1..3b05ab2 100644 (file)
@@ -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));
            }
index 65fef1e..a9dc37d 100644 (file)
@@ -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;
 }