From 05867443ba1ceaa346deb6e8f9495b79c9a5696e Mon Sep 17 00:00:00 2001 From: Derrick Brashear Date: Mon, 18 Oct 2004 07:26:34 +0000 Subject: [PATCH] STABLE12-vol-fix-nuke-iteration-and-nuke-globals-20040928 allInodes global dies; don't use ti as an iterator right after freeing it. (cherry picked from commit 3f2e943d430ea85ece5c1f96f197122a7c47851c) --- src/vol/listinodes.c | 32 +++++++++++++++++++------------- src/vol/namei_ops.c | 26 +++++++++++++------------- src/vol/namei_ops.h | 8 ++++---- src/vol/ntops.c | 16 ++++++++-------- src/vol/nuke.c | 20 +++++++++++++------- src/vol/vol-salvage.c | 5 +++-- 6 files changed, 60 insertions(+), 47 deletions(-) diff --git a/src/vol/listinodes.c b/src/vol/listinodes.c index 67a6f5d35..fa3fd4a68 100644 --- a/src/vol/listinodes.c +++ b/src/vol/listinodes.c @@ -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); diff --git a/src/vol/namei_ops.c b/src/vol/namei_ops.c index df6371e6e..236e1cf96 100644 --- a/src/vol/namei_ops.c +++ b/src/vol/namei_ops.c @@ -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) { diff --git a/src/vol/namei_ops.h b/src/vol/namei_ops.h index df55e01e7..e11cc7489 100644 --- a/src/vol/namei_ops.h +++ b/src/vol/namei_ops.h @@ -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 diff --git a/src/vol/ntops.c b/src/vol/ntops.c index 316857c7f..6d02c793b 100644 --- a/src/vol/ntops.c +++ b/src/vol/ntops.c @@ -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); diff --git a/src/vol/nuke.c b/src/vol/nuke.c index 787252c7d..674f7dc8a 100644 --- a/src/vol/nuke.c +++ b/src/vol/nuke.c @@ -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); diff --git a/src/vol/vol-salvage.c b/src/vol/vol-salvage.c index e0d664d64..329c210ec 100644 --- a/src/vol/vol-salvage.c +++ b/src/vol/vol-salvage.c @@ -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); -- 2.39.5