]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
DEVEL15-salvager-avoid-directory-issues-and-mark-volumes-busy-20080728
authorHartmut Reuter <reuter@rzg.mpg.de>
Mon, 28 Jul 2008 13:58:42 +0000 (13:58 +0000)
committerDerrick Brashear <shadow@dementia.org>
Mon, 28 Jul 2008 13:58:42 +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

(cherry picked from commit 674e94b29c09cf87496d74a01ebeada14413daac)

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

index bc53a2df4956a4bdb148acb483b94bffc4473fbb..8487240cc5d814a6e19c315ddd2396cee39f7235 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 a71b5a3f5b79e32456e03cc5996e5aca2e0bf43e..eed4789d904c19dc7af0b7c43c442902e71ec9ee 100644 (file)
@@ -3820,9 +3820,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)));
 }