From 2c103b8fb3a1b36e4c8eda986b8e82199d46e1b9 Mon Sep 17 00:00:00 2001 From: Chaskiel M Grundman Date: Tue, 5 Sep 2006 15:59:46 +0000 Subject: [PATCH] salvage-zlc-update-20060905 deal with damaged namei volumes better --- src/vol/namei_ops.c | 27 +++++++++++++-------------- src/vol/namei_ops.h | 2 +- src/vol/vol-salvage.c | 13 ++----------- 3 files changed, 16 insertions(+), 26 deletions(-) diff --git a/src/vol/namei_ops.c b/src/vol/namei_ops.c index f600555..0f3d5fa 100644 --- a/src/vol/namei_ops.c +++ b/src/vol/namei_ops.c @@ -151,8 +151,7 @@ typedef struct { int ogm_mode; } namei_ogm_t; -int namei_SetLinkCount(FdHandle_t * h, Inode ino, int count, int locked); -static int namei_GetLinkCount2(FdHandle_t * h, Inode ino, int lockit, int fixup); +static int namei_GetLinkCount2(FdHandle_t * h, Inode ino, int lockit, int fixup, int nowrite); static int GetFreeTag(IHandle_t * ih, int vno); @@ -865,13 +864,14 @@ namei_GetLCOffsetAndIndexFromIno(Inode ino, afs_foff_t * offset, int *index) * return. */ static int -namei_GetLinkCount2(FdHandle_t * h, Inode ino, int lockit, int fixup) +namei_GetLinkCount2(FdHandle_t * h, Inode ino, int lockit, int fixup, int nowrite) { unsigned short row = 0; afs_foff_t offset; ssize_t rc; int index; + if (!VALID_INO(ino)) return 0; /* there's no linktable yet. the salvager will create one later */ if (h->fd_fd == -1 && fixup) return 1; @@ -890,13 +890,14 @@ namei_GetLinkCount2(FdHandle_t * h, Inode ino, int lockit, int fixup) goto bad_getLinkByte; rc = read(h->fd_fd, (char *)&row, sizeof(row)); + if ((rc == 0 || !((row >> index) & NAMEI_TAGMASK)) && fixup && nowrite) + return 1; if (rc == 0 && fixup) { struct stat st; if (fstat(h->fd_fd, &st) || st.st_size >= offset+sizeof(row)) goto bad_getLinkByte; FDH_TRUNC(h, offset+sizeof(row)); row = 1 << index; -rewrite: rc = write(h->fd_fd, (char *)&row, sizeof(row)); } if (rc != sizeof(row)) { @@ -905,7 +906,11 @@ rewrite: if (fixup && !((row >> index) & NAMEI_TAGMASK)) { row |= 1<fd_fd, offset, SEEK_SET) == -1) + goto bad_getLinkByte; + rc = write(h->fd_fd, (char *)&row, sizeof(row)); + if (rc != sizeof(row)) + goto bad_getLinkByte; } return (int)((row >> index) & NAMEI_TAGMASK); @@ -923,13 +928,7 @@ rewrite: int namei_GetLinkCount(FdHandle_t * h, Inode ino, int lockit) { - return namei_GetLinkCount2(h, ino, lockit, 0); -} - -void -namei_SetNonZLC(FdHandle_t * h, Inode ino) -{ - (void)namei_GetLinkCount2(h, ino, 0, 1); + return namei_GetLinkCount2(h, ino, lockit, 0, 1); } /* Return a free column index for this vnode. */ @@ -1328,7 +1327,7 @@ namei_ListAFSSubDirs(IHandle_t * dirIH, dp1->d_name); linkHandle.fd_fd = afs_open(path2, Testing ? O_RDONLY : O_RDWR, 0666); info.linkCount = - namei_GetLinkCount2(&linkHandle, (Inode) 0, 1, !Testing); + namei_GetLinkCount2(&linkHandle, (Inode) 0, 1, 1, Testing); } if (judgeFun && !(*judgeFun) (&info, singleVolumeNumber, rock)) continue; @@ -1380,7 +1379,7 @@ namei_ListAFSSubDirs(IHandle_t * dirIH, continue; info.linkCount = namei_GetLinkCount2(&linkHandle, - info.inodeNumber, 1, !Testing); + info.inodeNumber, 1, 1, Testing); if (info.linkCount == 0) { #ifdef DELETE_ZLC Log("Found 0 link count file %s/%s, deleting it.\n", path3, dp3->d_name); diff --git a/src/vol/namei_ops.h b/src/vol/namei_ops.h index 8f615a2..d32f820 100644 --- a/src/vol/namei_ops.h +++ b/src/vol/namei_ops.h @@ -42,7 +42,7 @@ afs_sfsize_t namei_iwrite(IHandle_t * h, afs_foff_t offset, char *buf, extern int namei_dec(IHandle_t * h, Inode ino, int p1); extern int namei_inc(IHandle_t * h, Inode ino, int p1); extern int namei_GetLinkCount(FdHandle_t * h, Inode ino, int lockit); -extern void namei_SetNonZLC(FdHandle_t * h, Inode ino); +extern int namei_SetLinkCount(FdHandle_t * h, Inode ino, int count, int locked); extern int namei_ViceREADME(char *partition); #include "nfs.h" #include "viceinode.h" diff --git a/src/vol/vol-salvage.c b/src/vol/vol-salvage.c index ba28ae1..d1589d1 100644 --- a/src/vol/vol-salvage.c +++ b/src/vol/vol-salvage.c @@ -1330,7 +1330,7 @@ CreateLinkTable(register struct InodeSummary *isp, Inode ino) Abort("Can't open link table for volume %u (error = %d)\n", isp->RWvolumeId, errno); - if (FDH_TRUNC(fdP, 0) < 0) + if (FDH_TRUNC(fdP, sizeof(version) + sizeof(short)) < 0) Abort("Can't truncate link table for volume %u (error = %d)\n", isp->RWvolumeId, errno); @@ -1458,19 +1458,10 @@ DoSalvageVolumeGroup(register struct InodeSummary *isp, int nVols) fdP = IH_OPEN(VGLinkH); /* Sync fake 1 link counts to the link table, now that it exists */ if (fdP) { -#ifdef AFS_NT40_ENV - nt_SetNonZLC(fdP, ino); -#else - namei_SetNonZLC(fdP, ino); -#endif for (i = 0; i < nVols; i++) { ip = allInodes + isp[i].index; for (j = isp[i].nSpecialInodes; j < isp[i].nInodes; j++) { -#ifdef AFS_NT40_ENV - nt_SetNonZLC(fdP, ip[j].inodeNumber); -#else - namei_SetNonZLC(fdP, ip[j].inodeNumber); -#endif + namei_SetLinkCount(fdP, ip[j].inodeNumber, 1, 1); } } } -- 1.9.4