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

index 201df6cba638f49a3bf3717f28e1695b7a12bc6b..b71b1cd65e5ce39cef382c3c909d2976b706a305 100644 (file)
 /* Reasons (these could be communicated to venus or converted to messages) */
 
 #define FSYNC_WHATEVER         0       /* XXXX */
-#define FSYNC_SALVAGE          1       /* volume is being salvaged */
+#define FSYNC_READONLY         1       /* volume is readonly */
 #define FSYNC_MOVE             2       /* volume is being moved */
 #define FSYNC_OPERATOR         3       /* operator forced volume offline */
+#define FSYNC_SALVAGE          4       /* volume is being salvaged */
 
 
 /* Replies (1 byte) */
index 8ef457d7726687a7151e85d3e38c666199bd0a43..0f671668b75020b453a67b8fcb30039034ffed82 100644 (file)
@@ -1788,7 +1788,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);
                    if (strcmp(nameShouldBe, dp->d_name)) {
                        if (!Showmode)
@@ -2812,10 +2813,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;
@@ -2870,7 +2873,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,
@@ -2887,6 +2891,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;