/*
* Copyright 2000, International Business Machines Corporation and others.
* All Rights Reserved.
- *
+ *
* This software has been released under the terms of the IBM Public
* License. For details, see the LICENSE file in the top-level source
* directory or online at http://www.openafs.org/dl/license10.html
/* salvager data structures */
struct InodeSummary { /* Inode summary file--an entry for each
* volume in the inode file for a partition */
- VolId volumeId; /* Volume id */
- VolId RWvolumeId; /* RW volume associated */
+ VolumeId volumeId; /* Volume id */
+ VolumeId RWvolumeId; /* RW volume associated */
int index; /* index into inode file (0, 1, 2 ...) */
int nInodes; /* Number of inodes for this volume */
int nSpecialInodes; /* Number of special inodes, i.e. volume
/* Either a pointer to the original volume
* header summary, or constructed summary
* information */
-} *inodeSummary;
+};
#define readOnly(isp) ((isp)->volumeId != (isp)->RWvolumeId)
struct VolumeSummary { /* Volume summary an entry for each
* volume in a volume directory.
* Assumption: one volume directory per
* partition */
- char *fileName; /* File name on the partition for the volume
- * header */
struct VolumeHeader header;
/* volume number, rw volume number, inode
* numbers of each major component of
* the volume */
IHandle_t *volumeInfoHandle;
+ char deleted; /* did we delete this volume? */
byte wouldNeedCallback; /* set if the file server should issue
* call backs for all the files in this volume when
* the volume goes back on line */
+ byte unused; /* is this volume 'extra'? i.e. not referenced
+ * by anything? */
};
struct VnodeInfo {
IHandle_t *handle; /* Inode containing this index */
- int nVnodes; /* Total number of vnodes in index */
- int nAllocatedVnodes; /* Total number actually used */
+ afs_sfsize_t nVnodes; /* Total number of vnodes in index */
+ afs_sfsize_t nAllocatedVnodes; /* Total number actually used */
int volumeBlockCount; /* Total number of blocks used by volume */
Inode *inodes; /* Directory only */
struct VnodeEssence {
IHandle_t *ds_linkH;
};
+struct SalvInfo;
+
#define ORPH_IGNORE 0
#define ORPH_REMOVE 1
#define ORPH_ATTACH 2
extern int orphans; /* -orphans option */
extern int Showmode;
-#ifndef AFS_NT40_ENV
-extern int useSyslog; /* -syslog flag */
-extern int useSyslogFacility; /* -syslogfacility option */
-#endif
-
#define MAXPARALLEL 32
extern int OKToZap; /* -o flag */
#define ROOTINODE 2 /* Root inode of a 4.2 Unix file system
* partition */
-extern Device fileSysDevice; /* The device number of the current
- * partition being salvaged */
-#ifdef AFS_NT40_ENV
-extern char fileSysPath[8];
-#else
-extern char *fileSysPath; /* The path of the mounted partition currently
- * being salvaged, i.e. the directory
- * containing the volume headers */
-#endif /* AFS_NT40_ENV */
-extern char *fileSysPathName; /* NT needs this to make name pretty in log. */
-extern IHandle_t *VGLinkH; /* Link handle for current volume group. */
-extern int VGLinkH_cnt; /* # of references to lnk handle. */
-extern struct DiskPartition64 *fileSysPartition; /* Partition being salvaged */
-#ifndef AFS_NT40_ENV
-extern char *fileSysDeviceName; /* The block device where the file system
- * being salvaged was mounted */
-extern char *filesysfulldev;
-#endif /* AFS_NT40_ENV */
-extern int VolumeChanged; /* Set by any routine which would change the volume in
- * a way which would require callback is to be broken if the
- * volume was put back on line by an active file server */
-extern VolumeDiskData VolInfo; /* A copy of the last good or salvaged volume header dealt with */
-extern int nVolumesInInodeFile; /* Number of read-write volumes summarized */
-extern int inodeFd; /* File descriptor for inode file */
-
-
-extern struct VnodeInfo vnodeInfo[nVNODECLASSES];
-
-
-extern struct VolumeSummary *volumeSummaryp; /* Holds all the volumes in a part */
-extern int nVolumes; /* Number of volumes (read-write and read-only)
- * in volume summary */
extern char * tmpdir;
-extern FILE *logFile; /* one of {/usr/afs/logs,/vice/file}/SalvageLog */
#ifdef AFS_NT40_ENV
typedef struct {
struct InodeSummary *svgp_inodeSummaryp;
int svgp_count;
+ struct SalvInfo *svgp_salvinfo;
} SVGParms_t;
#endif /* AFS_NT40_ENV */
/* prototypes */
-extern void Exit(int code);
+extern void Exit(int code) AFS_NORETURN;
extern int Fork(void);
extern int Wait(char *prog);
-extern char *ToString(char *s);
-extern void AskOffline(VolumeId volumeId, char * partition);
-extern void AskOnline(VolumeId volumeId, char *partition);
+extern char *ToString(const char *s);
+extern int AskDAFS(void);
+extern void AskOffline(struct SalvInfo *salvinfo, VolumeId volumeId);
+extern void AskOnline(struct SalvInfo *salvinfo, VolumeId volumeId);
+extern void AskDelete(struct SalvInfo *salvinfo, VolumeId volumeId);
extern void CheckLogFile(char * log_path);
-#ifndef AFS_NT40_ENV
-extern void TimeStampLogFile(char * log_path);
-#endif
extern void ClearROInUseBit(struct VolumeSummary *summary);
-extern void CopyAndSalvage(register struct DirSummary *dir);
+extern void CopyAndSalvage(struct SalvInfo *salvinfo, struct DirSummary *dir);
extern int CopyInode(Device device, Inode inode1, Inode inode2, int rwvolume);
-extern void CopyOnWrite(register struct DirSummary *dir);
+extern void CopyOnWrite(struct SalvInfo *salvinfo, struct DirSummary *dir);
extern void CountVolumeInodes(register struct ViceInodeInfo *ip, int maxInodes,
register struct InodeSummary *summary);
-extern void DeleteExtraVolumeHeaderFile(register struct VolumeSummary *vsp);
-extern void DistilVnodeEssence(VolumeId vid, VnodeClass class, Inode ino,
- Unique * maxu);
-extern int GetInodeSummary(char *path, VolumeId singleVolumeNumber);
-extern void GetVolumeSummary(VolumeId singleVolumeNumber);
-extern int JudgeEntry(struct DirSummary *dir, char *name, VnodeId vnodeNumber,
- Unique unique);
-extern void MaybeZapVolume(register struct InodeSummary *isp, char *message,
- int deleteMe, int check);
+extern void DeleteExtraVolumeHeaderFile(struct SalvInfo *salvinfo,
+ struct VolumeSummary *vsp);
+extern void DistilVnodeEssence(struct SalvInfo *salvinfo, VolumeId vid,
+ VnodeClass class, Inode ino, Unique * maxu);
+extern int GetInodeSummary(struct SalvInfo *salvinfo, FD_t inodeFile,
+ VolumeId singleVolumeNumber);
+extern int GetVolumeSummary(struct SalvInfo *salvinfo,
+ VolumeId singleVolumeNumber);
+extern int JudgeEntry(void *dirVal, char *name, afs_int32 vnodeNumber,
+ afs_int32 unique);
+extern void MaybeZapVolume(struct SalvInfo *salvinfo, struct InodeSummary *isp,
+ char *message, int deleteMe, int check);
extern void ObtainSalvageLock(void);
-extern void PrintInodeList(void);
-extern void PrintInodeSummary(void);
-extern void PrintVolumeSummary(void);
-extern int QuickCheck(register struct InodeSummary *isp, int nVols);
+extern void ObtainSharedSalvageLock(void);
+extern void PrintInodeList(struct SalvInfo *salvinfo);
+extern void PrintInodeSummary(struct SalvInfo *salvinfo);
+extern int QuickCheck(struct SalvInfo *salvinfo, struct InodeSummary *isp,
+ int nVols);
extern void RemoveTheForce(char *path);
-extern void SalvageDir(char *name, VolumeId rwVid, struct VnodeInfo *dirVnodeInfo,
- IHandle_t * alinkH, int i, struct DirSummary *rootdir,
- int *rootdirfound);
+extern void SalvageDir(struct SalvInfo *salvinfo, char *name, VolumeId rwVid,
+ struct VnodeInfo *dirVnodeInfo, IHandle_t * alinkH,
+ int i, struct DirSummary *rootdir, int *rootdirfound);
extern void SalvageFileSysParallel(struct DiskPartition64 *partP);
extern void SalvageFileSys(struct DiskPartition64 *partP, VolumeId singleVolumeNumber);
extern void SalvageFileSys1(struct DiskPartition64 *partP,
VolumeId singleVolumeNumber);
-extern int SalvageHeader(register struct stuff *sp, struct InodeSummary *isp,
- int check, int *deleteMe);
-extern int SalvageIndex(Inode ino, VnodeClass class, int RW,
- register struct ViceInodeInfo *ip, int nInodes,
- struct VolumeSummary *volSummary, int check);
-extern int SalvageVnodes(register struct InodeSummary *rwIsp,
- register struct InodeSummary *thisIsp,
- register struct ViceInodeInfo *inodes, int check);
-extern int SalvageVolume(register struct InodeSummary *rwIsp, IHandle_t * alinkH);
-extern void DoSalvageVolumeGroup(register struct InodeSummary *isp, int nVols);
+extern int SalvageHeader(struct SalvInfo *salvinfo, struct afs_inode_info *sp,
+ struct InodeSummary *isp, int check, int *deleteMe);
+extern int SalvageIndex(struct SalvInfo *salvinfo, Inode ino, VnodeClass class,
+ int RW, struct ViceInodeInfo *ip, int nInodes,
+ struct VolumeSummary *volSummary, int check);
+extern int SalvageVnodes(struct SalvInfo *salvinfo, struct InodeSummary *rwIsp,
+ struct InodeSummary *thisIsp,
+ struct ViceInodeInfo *inodes, int check);
+extern int SalvageVolume(struct SalvInfo *salvinfo, struct InodeSummary *rwIsp,
+ IHandle_t * alinkH);
+extern void DoSalvageVolumeGroup(struct SalvInfo *salvinfo,
+ struct InodeSummary *isp, int nVols);
#ifdef AFS_NT40_ENV
-extern void SalvageVolumeGroup(register struct InodeSummary *isp, int nVols);
-#else
-#define SalvageVolumeGroup DoSalvageVolumeGroup
+extern void nt_SalvageVolumeGroup(struct SalvInfo *salvinfo, struct InodeSummary *isp, int nVols);
#endif
-extern int SalvageVolumeHeaderFile(register struct InodeSummary *isp,
- register struct ViceInodeInfo *inodes, int RW,
- int check, int *deleteMe);
-extern void showlog(void);
+extern int SalvageVolumeHeaderFile(struct SalvInfo *salvinfo,
+ struct InodeSummary *isp,
+ struct ViceInodeInfo *inodes, int RW,
+ int check, int *deleteMe);
extern int UseTheForceLuke(char *path);