From ec1f42aa8176328b8ec395dfa2388f8b796ce841 Mon Sep 17 00:00:00 2001 From: Hartmut Reuter Date: Mon, 28 Jul 2008 13:58:42 +0000 Subject: [PATCH] DEVEL15-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/vol-salvage.c | 12 ++++++++++-- src/vol/volume.c | 6 ++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/vol/vol-salvage.c b/src/vol/vol-salvage.c index bc53a2df4..8487240cc 100644 --- a/src/vol/vol-salvage.c +++ b/src/vol/vol-salvage.c @@ -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; diff --git a/src/vol/volume.c b/src/vol/volume.c index a71b5a3f5..eed4789d9 100644 --- a/src/vol/volume.c +++ b/src/vol/volume.c @@ -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))); } -- 2.39.5