* -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;
-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];
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) {
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];
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) {
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;
goto err1_exit;
}
- if (judgeInode && (*judgeInode)(&info.ili_info, judgeParam) == 0)
+ if (judgeInode && (*judgeInode)(&info.ili_info, judgeParam, rock) == 0)
continue;
rename = 0;
#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];
if (!strcmp("xfs", root_inode.st_fstype)) {
return xfs_ListViceInodes(devname, mountedOn, resultFile,
judgeInode, judgeParam,
- forcep, forceR, wpath);
+ forcep, forceR, wpath, rock);
}
else
#endif
if (root_inode.st_ino == EFS_ROOTINO) {
return efs_ListViceInodes(devname, mountedOn, resultFile,
judgeInode, judgeParam,
- forcep, forceR, wpath);
+ forcep, forceR, wpath, rock);
}
else
#endif
#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
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);
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);
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
* 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;
VerifyDirPerms(mountedOn);
ninodes = namei_ListAFSFiles(mountedOn, WriteInodeInfo, fp,
- judgeInode, singleVolumeNumber);
+ judgeInode, singleVolumeNumber, rock);
if (!resultFile)
return ninodes;
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;
ih.ih_vid = singleVolumeNumber;
namei_HandleToVolDir(&name, &ih);
ninodes = namei_ListAFSSubDirs(&ih, writeFun, fp,
- judgeFun, singleVolumeNumber);
+ judgeFun, singleVolumeNumber, rock);
if (ninodes < 0)
return ninodes;
}
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);
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;
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) {
continue;
}
if (judgeFun
- && !(*judgeFun)(&info, singleVolumeNumber))
+ && !(*judgeFun)(&info, singleVolumeNumber, rock))
continue;
if ((*writeFun)(fp, &info, path3, dp3->d_name)<0) {
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
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;
}
}
ninodes = nt_ListAFSFiles(wpath, WriteInodeInfo, fp,
- judgeInode, singleVolumeNumber);
+ judgeInode, singleVolumeNumber, rock);
if (!resultFile)
return ninodes;
char *),
FILE *fp,
int (*judgeFun)(struct ViceInodeInfo *, int),
- int singleVolumeNumber)
+ int singleVolumeNumber, void *rock)
{
IHandle_t h;
char name[MAX_PATH];
if (nt_HandleToVolDir(name, &h)<0)
return -1;
ninodes = nt_ListAFSSubDirs(&h, writeFun, fp,
- judgeFun, singleVolumeNumber);
+ judgeFun, singleVolumeNumber, rock);
if (ninodes < 0)
return ninodes;
}
while (dp = readdir(dirp)) {
if (!DecodeVolumeName(dp->d_name, &h.ih_vid)) {
ninodes += nt_ListAFSSubDirs(&h, writeFun, fp,
- judgeFun, 0);
+ judgeFun, 0, rock);
}
}
}
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;
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);
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;
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;
#endif
#endif /* AFS_NAMEI_ENV */
IHandle_t *fileH;
+ struct ilist *allInodes = 0;
if (avolid == 0) return EINVAL;
code = stat(aname, &tstat);
*/
#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) {
#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;
/* 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);
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);
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);