From 96c22fdc0d399bb2749bc47316d866120bc02dcf Mon Sep 17 00:00:00 2001 From: Chaskiel M Grundman Date: Sun, 3 Sep 2006 06:50:12 +0000 Subject: [PATCH] salvage-zlc-20060903 make salvager deal with zero link count files --- src/viced/viced.c | 2 -- src/vol/listinodes.c | 2 +- src/vol/namei_ops.c | 49 ++++++++++++++++++++++++++++++++++++------- src/vol/namei_ops.h | 1 + src/vol/vol-salvage.c | 14 ++++++++++++- src/volser/volmain.c | 1 - 6 files changed, 57 insertions(+), 12 deletions(-) diff --git a/src/viced/viced.c b/src/viced/viced.c index 4b00a99bd..85a12a181 100644 --- a/src/viced/viced.c +++ b/src/viced/viced.c @@ -155,8 +155,6 @@ struct afsconf_dir *confDir; /* Configuration dir object */ int restartMode = RESTART_ORDINARY; -int Testing = 0; /* for ListViceInodes */ - /* * Home for the performance statistics. */ diff --git a/src/vol/listinodes.c b/src/vol/listinodes.c index 597ba2cce..c1f86172f 100644 --- a/src/vol/listinodes.c +++ b/src/vol/listinodes.c @@ -135,7 +135,7 @@ extern off_t afs_lseek(int FD, off_t O, int F); #define ROOTINODE 2 static char *partition; -extern int Testing; +int Testing=0; int pfd; #ifdef AFS_AIX32_ENV diff --git a/src/vol/namei_ops.c b/src/vol/namei_ops.c index 8cda06e0a..f600555b4 100644 --- a/src/vol/namei_ops.c +++ b/src/vol/namei_ops.c @@ -70,6 +70,8 @@ extern off_t afs_lseek(int FD, off_t O, int F); /*@printflike@*/ extern void Log(const char *format, ...); extern char *volutil_PartitionName_r(int volid, char *buf, int buflen); +int Testing=0; + afs_sfsize_t namei_iread(IHandle_t * h, afs_foff_t offset, char *buf, afs_fsize_t size) @@ -150,6 +152,8 @@ typedef struct { } 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 GetFreeTag(IHandle_t * ih, int vno); /* namei_HandleToInodeDir @@ -860,13 +864,17 @@ namei_GetLCOffsetAndIndexFromIno(Inode ino, afs_foff_t * offset, int *index) * If lockit is set, lock the file and leave it locked upon a successful * return. */ -int -namei_GetLinkCount(FdHandle_t * h, Inode ino, int lockit) +static int +namei_GetLinkCount2(FdHandle_t * h, Inode ino, int lockit, int fixup) { unsigned short row = 0; afs_foff_t offset; + ssize_t rc; int index; + /* there's no linktable yet. the salvager will create one later */ + if (h->fd_fd == -1 && fixup) + return 1; namei_GetLCOffsetAndIndexFromIno(ino, &offset, &index); if (lockit) { @@ -881,10 +889,25 @@ namei_GetLinkCount(FdHandle_t * h, Inode ino, int lockit) if (afs_lseek(h->fd_fd, offset, SEEK_SET) == -1) goto bad_getLinkByte; - if (read(h->fd_fd, (char *)&row, sizeof(row)) != sizeof(row)) { + rc = read(h->fd_fd, (char *)&row, sizeof(row)); + 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)) { goto bad_getLinkByte; } + if (fixup && !((row >> index) & NAMEI_TAGMASK)) { + row |= 1<> index) & NAMEI_TAGMASK); bad_getLinkByte: @@ -897,6 +920,18 @@ namei_GetLinkCount(FdHandle_t * h, Inode ino, int lockit) return -1; } +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 a free column index for this vnode. */ static int GetFreeTag(IHandle_t * ih, int vno) @@ -1291,9 +1326,9 @@ namei_ListAFSSubDirs(IHandle_t * dirIH, /* Open this handle */ (void)afs_snprintf(path2, sizeof path2, "%s/%s", path1, dp1->d_name); - linkHandle.fd_fd = afs_open(path2, O_RDONLY, 0666); + linkHandle.fd_fd = afs_open(path2, Testing ? O_RDONLY : O_RDWR, 0666); info.linkCount = - namei_GetLinkCount(&linkHandle, (Inode) 0, 0); + namei_GetLinkCount2(&linkHandle, (Inode) 0, 1, !Testing); } if (judgeFun && !(*judgeFun) (&info, singleVolumeNumber, rock)) continue; @@ -1344,8 +1379,8 @@ namei_ListAFSSubDirs(IHandle_t * dirIH, (path3, dp3->d_name, &info, myIH.ih_vid) < 0) continue; info.linkCount = - namei_GetLinkCount(&linkHandle, - info.inodeNumber, 0); + namei_GetLinkCount2(&linkHandle, + info.inodeNumber, 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 9f0df4a92..8f615a2f4 100644 --- a/src/vol/namei_ops.h +++ b/src/vol/namei_ops.h @@ -42,6 +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_ViceREADME(char *partition); #include "nfs.h" #include "viceinode.h" diff --git a/src/vol/vol-salvage.c b/src/vol/vol-salvage.c index 28ec0dfa5..bac02cd9a 100644 --- a/src/vol/vol-salvage.c +++ b/src/vol/vol-salvage.c @@ -222,7 +222,7 @@ static char *TimeStamp(time_t clock, int precision); int debug; /* -d flag */ -int Testing = 0; /* -n flag */ +extern int Testing; /* -n flag */ int ListInodeOption; /* -i flag */ int ShowRootFiles; /* -r flag */ int RebuildDirs; /* -sal flag */ @@ -1452,7 +1452,19 @@ DoSalvageVolumeGroup(register struct InodeSummary *isp, int nVols) if (Testing) { IH_INIT(VGLinkH, fileSysDevice, -1, -1); } else { + int i, j; + struct ViceInodeInfo *ip; CreateLinkTable(isp, ino); + fdP = IH_OPEN(VGLinkH); + /* Sync fake 1 link counts to the link table, now that it exists */ + if (fdP) { + namei_SetNonZLC(fdP, ino); + for (i = 0; i < nVols; i++) { + ip = allInodes + isp[i].index; + for (j = isp[i].nSpecialInodes; j < isp[i].nInodes; j++) + namei_SetNonZLC(fdP, ip[j].inodeNumber); + } + } } } if (fdP) diff --git a/src/volser/volmain.c b/src/volser/volmain.c index 215a90d91..f30ae9cf4 100644 --- a/src/volser/volmain.c +++ b/src/volser/volmain.c @@ -95,7 +95,6 @@ int DoLogging = 0; int lwps = 9; int udpBufSize = 0; /* UDP buffer size for receive */ -int Testing = 0; /* for ListViceInodes */ int rxBind = 0; #define ADDRSPERSITE 16 /* Same global is in rx/rx_user.c */ -- 2.39.5