salvage-zlc-update-20060905
authorChaskiel M Grundman <cg2v@andrew.cmu.edu>
Tue, 5 Sep 2006 15:59:46 +0000 (15:59 +0000)
committerDerrick Brashear <shadow@dementia.org>
Tue, 5 Sep 2006 15:59:46 +0000 (15:59 +0000)
deal with damaged namei volumes better

src/vol/namei_ops.c
src/vol/namei_ops.h
src/vol/vol-salvage.c

index f600555..0f3d5fa 100644 (file)
@@ -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<<index;
-        goto rewrite;
+        if (afs_lseek(h->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);
index 8f615a2..d32f820 100644 (file)
@@ -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"
index ba28ae1..d1589d1 100644 (file)
@@ -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);
                    }
                }
            }