]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
salvager: check namei linktable header magic
authorMichael Meffie <mmeffie@sinenomine.net>
Tue, 12 Jul 2011 12:15:31 +0000 (08:15 -0400)
committerDerrick Brashear <shadow@dementia.org>
Wed, 13 Jul 2011 04:28:39 +0000 (21:28 -0700)
Recreate the namei linktable file if the header magic
is bad.

Reviewed-on: http://gerrit.openafs.org/4968
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
(cherry picked from commit 82e772bed034ea278e7a7a1b4422d75cc14576dd)

Change-Id: I7c8b25da015e028f0a642bbfcf7d0d28bbcc16dd
Reviewed-on: http://gerrit.openafs.org/4976
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
src/vol/vol-salvage.c

index 7f99998cbec66a0ec82195f2dda9c59a0dd709c4..c794cfa6545e123d4e7db3351469cb90c6ae82f5 100644 (file)
@@ -1928,6 +1928,18 @@ DoSalvageVolumeGroup(struct SalvInfo *salvinfo, struct InodeSummary *isp, int nV
        IH_INIT(salvinfo->VGLinkH, salvinfo->fileSysDevice, isp->RWvolumeId, ino);
        fdP = IH_OPEN(salvinfo->VGLinkH);
     }
+    if (VALID_INO(ino) && fdP != NULL) {
+       struct versionStamp header;
+       afs_sfsize_t nBytes;
+
+       nBytes = FDH_PREAD(fdP, (char *)&header, sizeof(struct versionStamp), 0);
+       if (nBytes != sizeof(struct versionStamp)
+           || header.magic != LINKTABLEMAGIC) {
+            Log("Bad linktable header for volume %u.\n", isp->RWvolumeId);
+           FDH_REALLYCLOSE(fdP);
+           fdP = NULL;
+       }
+    }
     if (!VALID_INO(ino) || fdP == NULL) {
        Log("%s link table for volume %u.\n",
            Testing ? "Would have recreated" : "Recreating", isp->RWvolumeId);
@@ -2288,7 +2300,7 @@ SalvageVolumeHeaderFile(struct SalvInfo *salvinfo, struct InodeSummary *isp,
        if (stuff[i].inodeType == VI_LINKTABLE) {
            /* Gross hack: SalvageHeader does a bcmp on the volume header.
             * And we may have recreated the link table earlier, so set the
-            * RW header as well.
+            * RW header as well. The header magic was already checked.
             */
            if (VALID_INO(salvinfo->VGLinkH->ih_ino)) {
                *stuff[i].inode = salvinfo->VGLinkH->ih_ino;
@@ -2384,7 +2396,7 @@ SalvageHeader(struct SalvInfo *salvinfo, struct stuff *sp,
        return 0;
 #ifndef AFS_NAMEI_ENV
     if (sp->inodeType == VI_LINKTABLE)
-       return 0;
+       return 0; /* header magic was already checked */
 #endif
     if (*(sp->inode) == 0) {
        if (check) {