]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
salvager-avoid-directory-issues-and-mark-volumes-busy-20080728
authorHartmut Reuter <reuter@rzg.mpg.de>
Mon, 28 Jul 2008 13:58:30 +0000 (13:58 +0000)
committerDerrick Brashear <shadow@dementia.org>
Mon, 28 Jul 2008 13:58:30 +0000 (13:58 +0000)
LICENSE IPL10
FIXES 107767

avoid corrupting length in vnodeds when salvaging directories.
avoid tag reuse leaving data behind (not verified)
avoid not marking something busy during salvage

src/vol/vol-salvage.c
src/vol/volume.c

index a01a4d43b2a00031a69f7cc0c880ba24c0b32559..c688007632671a7bf9133b27c4166f520bc62ce2 100644 (file)
@@ -1288,7 +1288,8 @@ GetVolumeSummary(VolumeId singleVolumeNumber)
                        || vsp->header.parent == singleVolumeNumber)) {
                    (void)afs_snprintf(nameShouldBe, sizeof nameShouldBe,
                                       VFORMAT, vsp->header.id);
-                   if (singleVolumeNumber)
+                   if (singleVolumeNumber 
+                       && vsp->header.id != singleVolumeNumber)
                        AskOffline(vsp->header.id, fileSysPartition->name);
                    if (strcmp(nameShouldBe, dp->d_name)) {
                        if (!Showmode)
@@ -2315,10 +2316,12 @@ CopyAndSalvage(register struct DirSummary *dir)
     struct VnodeClassInfo *vcp = &VnodeClassInfo[vLarge];
     Inode oldinode, newinode;
     DirHandle newdir;
+    FdHandle_t *fdP;
     afs_int32 code;
     afs_sfsize_t lcode;
     afs_int32 parentUnique = 1;
     struct VnodeEssence *vnodeEssence;
+    afs_size_t length;
 
     if (Testing)
        return;
@@ -2373,7 +2376,8 @@ CopyAndSalvage(register struct DirSummary *dir)
     }
     vnode.cloned = 0;
     VNDISK_SET_INO(&vnode, newinode);
-    VNDISK_SET_LEN(&vnode, Length(&newdir));
+    length = Length(&newdir);
+    VNDISK_SET_LEN(&vnode, length);
     lcode =
        IH_IWRITE(vnodeInfo[vLarge].handle,
                  vnodeIndexOffset(vcp, dir->vnodeNumber), (char *)&vnode,
@@ -2390,6 +2394,10 @@ CopyAndSalvage(register struct DirSummary *dir)
 #else
     vnodeInfo[vLarge].handle->ih_synced = 1;
 #endif
+    /* make sure old directory file is really closed */
+    fdP = IH_OPEN(dir->dirHandle.dirh_handle);
+    FDH_REALLYCLOSE(fdP);
+    
     code = IH_DEC(dir->ds_linkH, oldinode, dir->rwVid);
     assert(code == 0);
     dir->dirHandle = newdir;
index 617e134c8512a0425add1a2f725e1c1dbe05cb88..0e1bdcf884a1b37589582590e82025234b15f30e 100644 (file)
@@ -3814,9 +3814,11 @@ VVolOpLeaveOnline_r(Volume * vp, FSSYNC_VolOp_info * vopinfo)
 int
 VVolOpSetVBusy_r(Volume * vp, FSSYNC_VolOp_info * vopinfo)
 {
-    return (vopinfo->com.command == FSYNC_VOL_NEEDVOLUME &&
+    return ((vopinfo->com.command == FSYNC_VOL_OFF &&
+           vopinfo->com.reason == FSYNC_SALVAGE) ||
+           (vopinfo->com.command == FSYNC_VOL_NEEDVOLUME &&
            (vopinfo->com.reason == V_CLONE ||
-            vopinfo->com.reason == V_DUMP));
+            vopinfo->com.reason == V_DUMP)));
 }