fix-indent-bug-with-lock-macros-part-two-20040818
[openafs.git] / src / vol / vol-salvage.c
index 5ed6cbb..f7d931d 100644 (file)
@@ -219,7 +219,6 @@ extern off_t afs_lseek(int FD, off_t O, int F);
 #ifdef AFS_OSF_ENV
 extern void *calloc();
 #endif
-extern char *vol_DevName();
 static char *TimeStamp(time_t clock, int precision);
 
 #define ORPH_IGNORE 0
@@ -397,7 +396,7 @@ typedef struct {
 } childJob_t;
 
 /* Child job this process is running. */
-childJob_t myjob = { SALVAGER_MAGIC, NOT_CHILD };
+childJob_t myjob = { SALVAGER_MAGIC, NOT_CHILD, "" };
 
 int nt_SalvagePartition(char *partName, int jobn);
 int nt_SetupPartitionSalvage(void *datap, int len);
@@ -507,7 +506,7 @@ handleit(struct cmd_syndesc *as)
 {
     register struct cmd_item *ti;
     char pname[100], *temp;
-    afs_int32 seenpart = 0, seenvol = 0, vid = 0, seenany = 0, i;
+    afs_int32 seenpart = 0, seenvol = 0, vid = 0, seenany = 0;
     struct DiskPartition *partP;
 
 #ifdef AFS_SGI_VNODE_GLUE
@@ -519,10 +518,13 @@ handleit(struct cmd_syndesc *as)
 #endif
 
 #ifdef FAST_RESTART
-    for (i = 0; i < CMD_MAXPARMS; i++) {
-       if (as->parms[i].items) {
-           seenany = 1;
-           break;
+    {
+       afs_int32 i;
+       for (i = 0; i < CMD_MAXPARMS; i++) {
+           if (as->parms[i].items) {
+               seenany = 1;
+               break;
+           }
        }
     }
     if (!seenany) {
@@ -862,7 +864,12 @@ ObtainSalvageLock(void)
 #else
     salvageLock =
        afs_open(AFSDIR_SERVER_SLVGLOCK_FILEPATH, O_CREAT | O_RDWR, 0666);
-    assert(salvageLock >= 0);
+    if (salvageLock < 0) {
+       fprintf(stderr,
+               "salvager:  can't open salvage lock file %s, aborting\n",
+               AFSDIR_SERVER_SLVGLOCK_FILEPATH);
+       Exit(1);
+    }
 #ifdef AFS_DARWIN_ENV
     if (flock(salvageLock, LOCK_EX) == -1) {
 #else
@@ -1589,6 +1596,17 @@ GetInodeSummary(char *path, VolumeId singleVolumeNumber)
            unlink(summaryFileName);
            if (!singleVolumeNumber)    /* Remove the FORCESALVAGE file */
                RemoveTheForce(fileSysPath);
+           else {
+               struct VolumeSummary *vsp;
+               int i, j;
+
+               GetVolumeSummary(singleVolumeNumber);
+
+               for (i = 0, vsp = volumeSummaryp; i < nVolumes; i++) {
+                   if (vsp->fileName)
+                       DeleteExtraVolumeHeaderFile(vsp);
+               }
+           }
            Log("%s vice inodes on %s; not salvaged\n",
                singleVolumeNumber ? "No applicable" : "No", dev);
            return -1;
@@ -3032,7 +3050,7 @@ JudgeEntry(struct DirSummary *dir, char *name, VnodeId vnodeNumber,
         * from different directories.
         */
        if (vnodeEssence->parent != dir->vnodeNumber) {
-           if (!vnodeEssence->claimed && !dirOrphaned) {
+           if (!vnodeEssence->claimed && !dirOrphaned && vnodeNumber != 1) {
                /* Vnode does not point back to this directory.
                 * Orphaned dirs cannot claim a file (it may belong to
                 * another non-orphaned dir).
@@ -3047,6 +3065,8 @@ JudgeEntry(struct DirSummary *dir, char *name, VnodeId vnodeNumber,
                if (!Showmode) {
                    if (dirOrphaned) {
                        Log("dir vnode %u: %s/%s parent vnode is %u (vnode %u, unique %u) -- %sdeleted\n", dir->vnodeNumber, (dir->name ? dir->name : "??"), name, vnodeEssence->parent, vnodeNumber, unique, (Testing ? "would have been " : ""));
+                   } else if (vnodeNumber == 1) {
+                       Log("dir vnode %d: %s/%s is invalid (vnode %d, unique %d) -- %sdeleted\n", dir->vnodeNumber, (dir->name ? dir->name : "??"), name, vnodeNumber, unique, (Testing ? "would have been " : ""));
                    } else {
                        Log("dir vnode %u: %s/%s already claimed by directory vnode %u (vnode %u, unique %u) -- %sdeleted\n", dir->vnodeNumber, (dir->name ? dir->name : "??"), name, vnodeEssence->parent, vnodeNumber, unique, (Testing ? "would have been " : ""));
                    }
@@ -3190,11 +3210,21 @@ SalvageDir(char *name, VolumeId rwVid, struct VnodeInfo *dirVnodeInfo,
     if (dirVnodeInfo->inodes[i] == 0)
        return;                 /* Not allocated to a directory */
 
-    parent = CheckVnodeNumber(dirVnodeInfo->vnodes[i].parent);
-    if (parent && parent->salvaged == 0)
-       SalvageDir(name, rwVid, dirVnodeInfo, alinkH,
-                  vnodeIdToBitNumber(dirVnodeInfo->vnodes[i].parent),
-                  rootdir, rootdirfound);
+    if (bitNumberToVnodeNumber(i, vLarge) == 1) {
+       if (dirVnodeInfo->vnodes[i].parent) {
+           Log("Bad parent, vnode 1; %s...\n",
+               (Testing ? "skipping" : "salvaging"));
+           dirVnodeInfo->vnodes[i].parent = 0;
+           dirVnodeInfo->vnodes[i].changed = 1;
+       }
+    } else {
+       parent = CheckVnodeNumber(dirVnodeInfo->vnodes[i].parent);
+       if (parent && parent->salvaged == 0)
+           SalvageDir(name, rwVid, dirVnodeInfo, alinkH,
+                      vnodeIdToBitNumber(dirVnodeInfo->vnodes[i].parent),
+                      rootdir, rootdirfound);
+    }
+
     dir.vnodeNumber = bitNumberToVnodeNumber(i, vLarge);
     dir.unique = dirVnodeInfo->vnodes[i].unique;
     dir.copied = 0;