From 39d3c9b229f204c764b2d24f7172d6b9d855d4e5 Mon Sep 17 00:00:00 2001 From: Hartmut Reuter Date: Mon, 28 Jul 2008 13:59:20 +0000 Subject: [PATCH] STABLE14-salvager-avoid-directory-issues-and-mark-volumes-busy-20080728 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 | 3 ++- src/vol/vol-salvage.c | 12 ++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/vol/fssync.h b/src/vol/fssync.h index 201df6cba..b71b1cd65 100644 --- a/src/vol/fssync.h +++ b/src/vol/fssync.h @@ -33,9 +33,10 @@ /* 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) */ diff --git a/src/vol/vol-salvage.c b/src/vol/vol-salvage.c index 8ef457d77..0f671668b 100644 --- a/src/vol/vol-salvage.c +++ b/src/vol/vol-salvage.c @@ -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; -- 2.39.5