]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE12-vol-fix-nuke-iteration-and-nuke-globals-20040928
authorDerrick Brashear <shadow@dementia.org>
Mon, 18 Oct 2004 07:26:34 +0000 (07:26 +0000)
committerDerrick Brashear <shadow@dementia.org>
Mon, 18 Oct 2004 07:26:34 +0000 (07:26 +0000)
allInodes global dies; don't use ti as an iterator right after freeing it.

(cherry picked from commit 3f2e943d430ea85ece5c1f96f197122a7c47851c)

src/vol/listinodes.c
src/vol/namei_ops.c
src/vol/namei_ops.h
src/vol/ntops.c
src/vol/nuke.c
src/vol/vol-salvage.c

index 67a6f5d3591d5cdb9ecd86b1f7cf6bfc6534bf6c..fa3fd4a68870b042540e878c3fc5ae1a11b06a2c 100644 (file)
@@ -31,10 +31,11 @@ RCSID("$Header$");
  * -1 - Unable to read the inodes.
  * -2 - Unable to completely write temp file. Produces warning message in log.
  */
-ListViceInodes(devname, mountedOn, resultFile, judgeInode, judgeParam, forcep, forceR, wpath)
+ListViceInodes(devname, mountedOn, resultFile, judgeInode, judgeParam, forcep, forceR, wpath, rock)
 char *devname, *mountedOn, *resultFile, *wpath;
 int (*judgeInode)(); 
 int *forcep, forceR;
+void *rock;
 {
     Log("ListViceInodes not implemented for this platform!\n");
     return -1;
@@ -164,9 +165,10 @@ struct dinode *ginode();
 
 
 
-ListViceInodes(devname, mountedOn, resultFile, judgeInode, judgeParam, forcep, forceR, wpath)
+ListViceInodes(devname, mountedOn, resultFile, judgeInode, judgeParam, forcep, forceR, wpath, rock)
 char *devname, *mountedOn, *resultFile, *wpath;
 int (*judgeInode)(); 
+void *rock;
 int *forcep, forceR; {
        FILE *inodeFile = NULL;
        char dev[50], rdev[51];
@@ -300,7 +302,7 @@ int *forcep, forceR; {
                info.u.param[2]  = p->di_vicep3;
                info.u.param[3]  = p->di_vicep4;
 
-               if (judgeInode && (*judgeInode)(&info, judgeParam) == 0)
+               if (judgeInode && (*judgeInode)(&info, judgeParam, rock) == 0)
                        continue;
 
                if (fwrite(&info, sizeof info, 1, inodeFile) != 1) {
@@ -459,10 +461,11 @@ afs_efs_figet(EFS_MOUNT *mp, struct efs_dinode *dinodeBuf, int *last_cgno,
 
 int
 efs_ListViceInodes(devname, mountedOn, resultFile, judgeInode, judgeParam,
-                  forcep, forceR, wpath)
+                  forcep, forceR, wpath, rock)
 char *devname, *mountedOn, *resultFile, *wpath;
 int (*judgeInode)(); 
 int *forcep, forceR;
+void *rock;
 {
        FILE *inodeFile = NULL;
        char dev[50], rdev[51];
@@ -559,7 +562,7 @@ BOMB!!
 Log("Ino=%d, bytes=%d, linkCnt=%d, [%x,%x,%x,%x]\n", inum, p->di_size, p->di_nlink,
        info.u.param[0],info.u.param[1],info.u.param[2],info.u.param[3]);
 #endif
-               if (judgeInode && (*judgeInode)(&info, judgeParam) == 0)
+               if (judgeInode && (*judgeInode)(&info, judgeParam, rock) == 0)
                        continue;
 
                if (fwrite(&info, sizeof info, 1, inodeFile) != 1) {
@@ -806,10 +809,11 @@ int xfs_RenameFiles(char *dir, xfs_Rename_t *renames, int n_renames)
 
 
 xfs_ListViceInodes(devname, mountedOn, resultFile, judgeInode, judgeParam,
-                  forcep, forceR, wpath)
+                  forcep, forceR, wpath, rock)
 char *devname, *mountedOn, *resultFile, *wpath;
 int (*judgeInode)(); 
 int *forcep, forceR;
+void *rock;
 {
     FILE *inodeFile = NULL;
     i_list_inode_t info;
@@ -917,7 +921,7 @@ int *forcep, forceR;
                goto err1_exit;
            }
 
-           if (judgeInode && (*judgeInode)(&info.ili_info, judgeParam) == 0)
+           if (judgeInode && (*judgeInode)(&info.ili_info, judgeParam, rock) == 0)
                continue;
        
            rename = 0;
@@ -1021,10 +1025,11 @@ int *forcep, forceR;
 #endif
 
 ListViceInodes(devname, mountedOn, resultFile, judgeInode, judgeParam, forcep,
-              forceR, wpath)
+              forceR, wpath, rock)
 char *devname, *mountedOn, *resultFile, *wpath;
 int (*judgeInode)(); 
 int *forcep, forceR;
+void *rock;
 {
        FILE *inodeFile = NULL;
        char dev[50], rdev[51];
@@ -1055,7 +1060,7 @@ int *forcep, forceR;
        if (!strcmp("xfs", root_inode.st_fstype)) {
            return xfs_ListViceInodes(devname, mountedOn, resultFile,
                                     judgeInode, judgeParam,
-                                    forcep, forceR, wpath);
+                                    forcep, forceR, wpath, rock);
        }
        else
 #endif
@@ -1063,7 +1068,7 @@ int *forcep, forceR;
          if (root_inode.st_ino == EFS_ROOTINO) {
            return efs_ListViceInodes(devname, mountedOn, resultFile,
                                      judgeInode, judgeParam,
-                                    forcep, forceR, wpath);
+                                    forcep, forceR, wpath, rock);
        }
        else
 #endif
@@ -1099,9 +1104,10 @@ BUFAREA sblk;
 #endif /* AFS_HPUX_ENV */
 
 extern char *afs_rawname();
-int ListViceInodes(devname, mountedOn, resultFile, judgeInode, judgeParam, forcep, forceR, wpath)
+int ListViceInodes(devname, mountedOn, resultFile, judgeInode, judgeParam, forcep, forceR, wpath, rock)
     char *devname, *mountedOn, *resultFile, *wpath;
     int (*judgeInode)(), *forcep, forceR;
+    void *rock;
 {
    union {
 #ifdef AFS_AIX_ENV
@@ -1201,7 +1207,7 @@ int ListViceInodes(devname, mountedOn, resultFile, judgeInode, judgeParam, force
        info.u.param[1] = auxp->aux_param2;
        info.u.param[2] = auxp->aux_param3;
        info.u.param[3] = auxp->aux_param4;
-       if (judgeInode && (*judgeInode)(&info, judgeParam) == 0)
+       if (judgeInode && (*judgeInode)(&info, judgeParam, rock) == 0)
           continue;
        if (fwrite(&info, sizeof info, 1, inodeFile) != 1) {
           Log("Error writing inode file for partition %s\n", partition);
@@ -1401,7 +1407,7 @@ printf("Ino=%d, v1=%x, v2=%x, v3=%x, mode=%x size=%d, lcnt=%d\n", i, p->di_vicep
                    info.inodeNumber = i;
                    info.byteCount = p->di_size;
                    info.linkCount = p->di_nlink;
-                   if (judgeInode && (*judgeInode)(&info, judgeParam) == 0)
+                   if (judgeInode && (*judgeInode)(&info, judgeParam, rock) == 0)
                        continue;
                    if (fwrite(&info, sizeof info, 1, inodeFile) != 1) {
                        Log("Error writing inode file for partition %s\n", partition);
index df6371e6e2a8b1f3699bfe1d5c783d287f08bf4d..236e1cf9691bb145e808736a0b4b94e3f814f867 100644 (file)
@@ -984,8 +984,8 @@ static int namei_ListAFSSubDirs(IHandle_t *dirIH,
                             int (*write_fun)(FILE *, struct ViceInodeInfo *,
                                              char *, char *),
                             FILE *fp,
-                            int (*judgeFun)(struct ViceInodeInfo *, int vid),
-                            int singleVolumeNumber);
+                            int (*judgeFun)(struct ViceInodeInfo *, int vid, void *),
+                            int singleVolumeNumber, void *rock);
 
 
 /* WriteInodeInfo
@@ -1035,9 +1035,9 @@ void VerifyDirPerms(char *path)
  * If the resultFile is NULL, then don't call the write routine.
  */
 int ListViceInodes(char *devname, char *mountedOn, char *resultFile,
-                  int (*judgeInode)(struct ViceInodeInfo *info, int vid),
+                  int (*judgeInode)(struct ViceInodeInfo *info, int vid, void *rock),
                   int singleVolumeNumber, int *forcep,
-                  int forceR, char *wpath)
+                  int forceR, char *wpath, void *rock)
 {
     FILE *fp = (FILE*)-1;
     int ninodes;
@@ -1056,7 +1056,7 @@ int ListViceInodes(char *devname, char *mountedOn, char *resultFile,
     VerifyDirPerms(mountedOn);
 
     ninodes = namei_ListAFSFiles(mountedOn, WriteInodeInfo, fp,
-                          judgeInode, singleVolumeNumber);
+                          judgeInode, singleVolumeNumber, rock);
 
     if (!resultFile)
        return ninodes;
@@ -1109,8 +1109,8 @@ int namei_ListAFSFiles(char *dev,
                    int (*writeFun)(FILE *, struct ViceInodeInfo *, char *,
                                     char *),
                    FILE *fp,
-                   int (*judgeFun)(struct ViceInodeInfo *, int),
-                   int singleVolumeNumber)
+                   int (*judgeFun)(struct ViceInodeInfo *, int, void *rock),
+                   int singleVolumeNumber, void *rock)
 {
     IHandle_t ih;
     namei_t name;
@@ -1129,7 +1129,7 @@ int namei_ListAFSFiles(char *dev,
        ih.ih_vid = singleVolumeNumber;
        namei_HandleToVolDir(&name, &ih);
        ninodes = namei_ListAFSSubDirs(&ih, writeFun, fp,
-                                judgeFun, singleVolumeNumber);
+                                judgeFun, singleVolumeNumber, rock);
        if (ninodes < 0)
            return ninodes;
     }
@@ -1151,7 +1151,7 @@ int namei_ListAFSFiles(char *dev,
                    if (*dp2->d_name == '.') continue;
                    if (!DecodeVolumeName(dp2->d_name, &ih.ih_vid)) {
                        ninodes += namei_ListAFSSubDirs(&ih, writeFun, fp,
-                                                      judgeFun, 0);
+                                                      judgeFun, 0, rock);
                    }
                }
                closedir(dirp2);
@@ -1178,8 +1178,8 @@ static int namei_ListAFSSubDirs(IHandle_t *dirIH,
                             int (*writeFun)(FILE *, struct ViceInodeInfo *,
                                              char *, char *),
                             FILE *fp,
-                            int (*judgeFun)(struct ViceInodeInfo *, int),
-                            int singleVolumeNumber)
+                            int (*judgeFun)(struct ViceInodeInfo *, int, void *),
+                            int singleVolumeNumber, void *rock)
 {
     IHandle_t myIH = *dirIH;
     namei_t name;
@@ -1220,7 +1220,7 @@ static int namei_ListAFSSubDirs(IHandle_t *dirIH,
                linkHandle.fd_fd = open(path2, O_RDONLY, 0666);
                info.linkCount = namei_GetLinkCount(&linkHandle, (Inode)0, 0);
            }
-           if (judgeFun && !(*judgeFun)(&info, singleVolumeNumber))
+           if (judgeFun && !(*judgeFun)(&info, singleVolumeNumber, rock))
                continue;
 
            if ((*writeFun)(fp, &info, path1, dp1->d_name)<0) {
@@ -1279,7 +1279,7 @@ static int namei_ListAFSSubDirs(IHandle_t *dirIH,
                                continue;
                            }
                            if (judgeFun
-                               && !(*judgeFun)(&info, singleVolumeNumber))
+                               && !(*judgeFun)(&info, singleVolumeNumber, rock))
                                continue;
 
                            if ((*writeFun)(fp, &info, path3, dp3->d_name)<0) {
index df55e01e7d5536b8d27487fe3fa5cd6d2ecb96e8..e11cc748913fa7169299e20245160836024f671f 100644 (file)
@@ -46,12 +46,12 @@ int namei_ListAFSFiles(char *dev,
                    int (*write_fun)(FILE *fp, struct ViceInodeInfo *info,
                                     char *dir, char *file),
                    FILE *fp,
-                   int (*judge_fun)(struct ViceInodeInfo *info, int vid),
-                   int singleVolumeNumber);
+                   int (*judge_fun)(struct ViceInodeInfo *info, int vid, void *rock),
+                   int singleVolumeNumber, void *rock);
 int ListViceInodes(char *devname, char *mountedOn, char *resultFile,
-                  int (*judgeInode)(struct ViceInodeInfo *info, int vid),
+                  int (*judgeInode)(struct ViceInodeInfo *info, int vid, void *rock),
                   int singleVolumeNumber, int *forcep,
-                  int forceR, char *wpath);
+                  int forceR, char *wpath, void *rock);
 
 
 #define NAMEI_LCOMP_LEN 32
index 316857c7f570546d4de748f8dce6c9f893cc15ea..6d02c793b78e4b4c607d14845c1f70fc99b0fda1 100644 (file)
@@ -940,7 +940,7 @@ static int WriteInodeInfo(FILE *fp, struct ViceInodeInfo *info, char *dir,
 int ListViceInodes(char *devname, char *mountedOn, char *resultFile,
                   int (*judgeInode)(struct ViceInodeInfo *info, int vid),
                   int singleVolumeNumber, int *forcep,
-                  int forceR, char *wpath)
+                  int forceR, char *wpath, void *rock)
 {
     FILE *fp = (FILE*)-1;
     int ninodes;
@@ -954,7 +954,7 @@ int ListViceInodes(char *devname, char *mountedOn, char *resultFile,
        }
     }
     ninodes = nt_ListAFSFiles(wpath, WriteInodeInfo, fp,
-                          judgeInode, singleVolumeNumber);
+                          judgeInode, singleVolumeNumber, rock);
 
     if (!resultFile)
        return ninodes;
@@ -1008,7 +1008,7 @@ int nt_ListAFSFiles(char *dev,
                                     char *),
                    FILE *fp,
                    int (*judgeFun)(struct ViceInodeInfo *, int),
-                   int singleVolumeNumber)
+                   int singleVolumeNumber, void *rock)
 {
     IHandle_t h;
     char name[MAX_PATH];
@@ -1025,7 +1025,7 @@ int nt_ListAFSFiles(char *dev,
        if (nt_HandleToVolDir(name, &h)<0)
            return -1;
        ninodes = nt_ListAFSSubDirs(&h, writeFun, fp,
-                                judgeFun, singleVolumeNumber);
+                                judgeFun, singleVolumeNumber, rock);
        if (ninodes < 0)
            return ninodes;
     }
@@ -1040,7 +1040,7 @@ int nt_ListAFSFiles(char *dev,
        while (dp = readdir(dirp)) {
            if (!DecodeVolumeName(dp->d_name, &h.ih_vid)) {
                ninodes += nt_ListAFSSubDirs(&h, writeFun, fp,
-                                judgeFun, 0);
+                                judgeFun, 0, rock);
            }
        }
     }
@@ -1062,8 +1062,8 @@ static int nt_ListAFSSubDirs(IHandle_t *dirIH,
                             int (*writeFun)(FILE *, struct ViceInodeInfo *,
                                              char *, char *),
                             FILE *fp,
-                            int (*judgeFun)(struct ViceInodeInfo *, int),
-                            int singleVolumeNumber)
+                            int (*judgeFun)(struct ViceInodeInfo *, int, void *rock),
+                            int singleVolumeNumber, void *rock)
 {
     int i;
     IHandle_t myIH = *dirIH;
@@ -1151,7 +1151,7 @@ static int nt_ListAFSSubDirs(IHandle_t *dirIH,
                    info.u.param[2] = data.ftCreationTime.dwHighDateTime;
                    info.u.param[3] = data.ftCreationTime.dwLowDateTime;
                }
-               if (judgeFun && !(*judgeFun)(&info, singleVolumeNumber))
+               if (judgeFun && !(*judgeFun)(&info, singleVolumeNumber, rock))
                    goto next_file;
                if ((*writeFun)(fp, &info, path, data.cFileName)<0) {
                    nt_close(linkHandle.fd_fd);
index 787252c7d98d474d064244de3affb7997f3f49df..674f7dc8a2b3e09e5024399cda6920a7c2254390 100644 (file)
@@ -56,14 +56,15 @@ struct ilist {
     afs_int32 freePtr;                         /* first free index in this table */
     Inode inode[MAXATONCE];                    /* inode # */
     afs_int32 count[MAXATONCE];                        /* link count */
-} *allInodes = 0;
+};
 
 /* called with a structure specifying info about the inode, and our rock (which
  * is the volume ID.  Returns true if we should keep this inode, otherwise false.
  * Note that ainfo->u.param[0] is always the volume ID, for any vice inode.
  */
-static NukeProc(ainfo, avolid)
+static NukeProc(ainfo, avolid, allInodes)
 struct ViceInodeInfo *ainfo;
+struct ilist *allInodes;
 afs_int32 avolid; {
     struct ilist *ti;
     register afs_int32 i;
@@ -103,7 +104,7 @@ char *aname;
 afs_int32 avolid; {
     /* first process the partition containing this junk */
     struct stat tstat;
-    struct ilist *ti, *ni;
+    struct ilist *ti, *ni, *li=NULL;
     register afs_int32 code;
     char *tfile;
     int i, j, forceSal;
@@ -118,6 +119,7 @@ afs_int32 avolid; {
 #endif
 #endif /* AFS_NAMEI_ENV */
     IHandle_t *fileH;
+    struct ilist *allInodes = 0;
 
     if (avolid == 0) return EINVAL;
     code = stat(aname, &tstat);
@@ -155,9 +157,9 @@ afs_int32 avolid; {
      */
 #ifdef AFS_NAMEI_ENV
     code = ListViceInodes(lastDevComp, aname, NULL, NukeProc, avolid,
-                         &forceSal, 0, wpath);
+                         &forceSal, 0, wpath, allInodes);
 #else
-    code = ListViceInodes(lastDevComp, aname, "/tmp/vNukeXX", NukeProc, avolid, &forceSal, 0, wpath);
+    code = ListViceInodes(lastDevComp, aname, "/tmp/vNukeXX", NukeProc, avolid, &forceSal, 0, wpath, allInodes);
     unlink("/tmp/vNukeXX");    /* clean it up now */
 #endif
     if (code == 0) {
@@ -193,8 +195,10 @@ afs_int32 avolid; {
 #endif /* AFS_NAMEI_ENV */
            }
            ni = ti->next;
-           free(ti);
+           if (li) free(li);
+           li = ti;
        }
+       if (li) free(li);
        code = 0;       /* we really don't care about it except for debugging */
        allInodes = (struct ilist *) 0;
 
@@ -216,8 +220,10 @@ afs_int32 avolid; {
        /* just free things */
        for(ti=allInodes; ti; ti = ni) {
            ni = ti->next;
-           free(ti);
+           if (li) free(li);
+           li = ti;
        }
+       if (li) free(li);
        allInodes = (struct ilist *) 0;
     }
     ReleaseWriteLock(&localLock);
index e0d664d6422d5a19349e0fcbab2ac47844f5c53c..329c210ec232b16f0e83b0ca67ef010541fd360d 100644 (file)
@@ -1414,9 +1414,10 @@ void CountVolumeInodes(register struct ViceInodeInfo *ip, int maxInodes,
     summary->maxUniquifier = maxunique;
 }
 
-int OnlyOneVolume(inodeinfo, singleVolumeNumber)
+int OnlyOneVolume(inodeinfo, singleVolumeNumber, rock)
     struct ViceInodeInfo *inodeinfo;
     VolumeId singleVolumeNumber;
+    void *rock;
 {
     if (inodeinfo->u.vnode.vnodeNumber == INODESPECIAL)
        return (inodeinfo->u.special.parentId == singleVolumeNumber);
@@ -1448,7 +1449,7 @@ int GetInodeSummary(char *path, VolumeId singleVolumeNumber)
     char *tdir;
 
     /* This file used to come from vfsck; cobble it up ourselves now... */
-    if ((err = ListViceInodes(dev, fileSysPath, path, singleVolumeNumber?OnlyOneVolume:0, singleVolumeNumber, &forceSal, forceR, wpath)) < 0) {
+    if ((err = ListViceInodes(dev, fileSysPath, path, singleVolumeNumber?OnlyOneVolume:0, singleVolumeNumber, &forceSal, forceR, wpath, NULL)) < 0) {
        if (err == -2) {
            Log("*** I/O error %d when writing a tmp inode file %s; Not salvaged %s ***\nIncrease space on partition or use '-tmpdir'\n",
                errno, path, dev);