nfs-gc-fix-20070320
authorDouglas Engert <deengert@anl.gov>
Tue, 20 Mar 2007 19:20:24 +0000 (19:20 +0000)
committerDerrick Brashear <shadow@dementia.org>
Tue, 20 Mar 2007 19:20:24 +0000 (19:20 +0000)
FIXES 56459

avoid issue with nfs gc handler and mismatched types

src/afs/afs_nfsclnt.c
src/venus/kdump.c

index b172fd6..59aaa45 100644 (file)
@@ -483,11 +483,10 @@ afs_nfsclient_sysname(register struct nfsclientpag *np, char *inname,
        MReleaseWriteLock(&afs_xnfspag);
     }
     if (inname) {
-       if (np->sysname) {
            for(count=0; count < np->sysnamecount;++count) {
                afs_osi_Free(np->sysname[count], MAXSYSNAME);
+               np->sysname[count] = NULL;
            }
-       }
        for(count=0; count < *num;++count) {
            np->sysname[count]= afs_osi_Alloc(MAXSYSNAME);
        }
@@ -498,8 +497,6 @@ afs_nfsclient_sysname(register struct nfsclientpag *np, char *inname,
            cp += t+1;
        }
        np->sysnamecount = *num;
-    } else if (!np->sysnamecount) {
-       return ENODEV;      /* XXX */
     }
     if (allpags >= 0) {
        /* Don't touch our arguments when called recursively */
@@ -518,6 +515,7 @@ afs_nfsclient_GC(exporter, pag)
 {
     register struct nfsclientpag *np, **tnp, *nnp;
     register afs_int32 i, delflag;
+       int count;
 
 #if defined(AFS_SGIMP_ENV)
     osi_Assert(ISAFS_GLOCK());
@@ -533,8 +531,9 @@ afs_nfsclient_GC(exporter, pag)
            if ((pag == -1) || (!pag && delflag)
                || (pag && (np->refCount == 0) && (np->pag == pag))) {
                *tnp = np->next;
-               if (np->sysname)
-                   afs_osi_Free(np->sysname, MAXSYSNAME);
+               for(count=0; count < np->sysnamecount;++count) {
+                       afs_osi_Free(np->sysname[count], MAXSYSNAME);
+               }
                afs_osi_Free(np, sizeof(struct nfsclientpag));
            } else {
                tnp = &np->next;
index 67c689a..33e6372 100644 (file)
@@ -2515,15 +2515,19 @@ print_nfsclient(kmem, ep, ptr, pnt)
      struct nfsclientpag *ep, *ptr;
 {
     char sysname[100];
+       int count;
 
-    if (ep->sysname) {
-       kread(kmem, (off_t) ep->sysname, sysname, (KDUMP_SIZE_T) 30);
-       Sum_nfssysnames += MAXSYSNAME;
-    }
     if (pnt)
-       printf("%lx: uid=%d, host=%x, pag=%x, @sys=%s, lastt=%d, ref=%d\n",
+       printf("%lx: uid=%d, host=%x, pag=%x, lastt=%d, ref=%d count=%d\n",
               ptr, ep->uid, ep->host, ep->pag,
-              (ep->sysname ? sysname : "nil"), ep->lastcall, ep->refCount);
+              ep->lastcall, ep->refCount, ep->sysnamecount);
+
+       for(count = 0; count < ep->sysnamecount; count++){
+               kread(kmem, (off_t) ep->sysname[count], sysname, (KDUMP_SIZE_T) 30);
+               printf("   %lx: @sys[%d]=%s\n",
+                       ep->sysname[count], count, sysname);
+               Sum_nfssysnames += MAXSYSNAME;
+       }
 }