From: Hartmut Reuter Date: Mon, 28 Jul 2008 13:58:42 +0000 (+0000) Subject: DEVEL15-salvager-avoid-directory-issues-and-mark-volumes-busy-20080728 X-Git-Tag: openafs-devel-1_5_51~5 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=ec1f42aa8176328b8ec395dfa2388f8b796ce841;p=packages%2Fo%2Fopenafs.git 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) --- 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))); }