From 82e772bed034ea278e7a7a1b4422d75cc14576dd Mon Sep 17 00:00:00 2001 From: Michael Meffie Date: Tue, 12 Jul 2011 08:15:31 -0400 Subject: [PATCH] salvager: check namei linktable header magic Recreate the namei linktable file if the header magic is bad. Change-Id: I1e8c2d101cf1dd1d375a965684d95f6708e8c601 Reviewed-on: http://gerrit.openafs.org/4968 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- src/vol/vol-salvage.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/vol/vol-salvage.c b/src/vol/vol-salvage.c index 0f7f0b91f..78422f4af 100644 --- a/src/vol/vol-salvage.c +++ b/src/vol/vol-salvage.c @@ -1932,6 +1932,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); @@ -2296,7 +2308,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; @@ -2396,7 +2408,7 @@ SalvageHeader(struct SalvInfo *salvinfo, struct afs_inode_info *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) { -- 2.39.5