From 674e94b29c09cf87496d74a01ebeada14413daac Mon Sep 17 00:00:00 2001 From: Hartmut Reuter Date: Mon, 28 Jul 2008 13:58:30 +0000 Subject: [PATCH] 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 --- 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 a01a4d43b..c68800763 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 617e134c8..0e1bdcf88 100644 --- a/src/vol/volume.c +++ b/src/vol/volume.c @@ -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))); } -- 2.39.5