From: Andrew Deason Date: Wed, 23 Mar 2011 21:12:20 +0000 (-0500) Subject: salvager: Do not AskOnline nonexistent volumes X-Git-Tag: upstream/1.8.0_pre1^2~4012 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=f2c1f2ee48663d00701e7cee52b99151e36b9534;p=packages%2Fo%2Fopenafs.git salvager: Do not AskOnline nonexistent volumes If singleVolumeNumber is not in our volume summary list, then the singleVolumeNumber volume does not exist. So, don't try to bring it back online. Still do try to make sure we don't have the volume checked out, though, so issue an AskDelete, so ensure that it's not checked out and that the fileserver does not think it exists. Change AskDelete so we don't care if we tried to delete a volume that the fileserver thinks already doesn't exist. Change the FSYNC_VOL_DONE handler so it does not complain about already-deleted volumes. Change-Id: I33dd876c0db91a3c8a5210fca329d63bf4b3d212 Reviewed-on: http://gerrit.openafs.org/4295 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- diff --git a/src/vol/fssync-server.c b/src/vol/fssync-server.c index 4126afd8c..d1634420a 100644 --- a/src/vol/fssync-server.c +++ b/src/vol/fssync-server.c @@ -1254,6 +1254,10 @@ FSYNC_com_VolDone(FSSYNC_VolOp_command * vcom, SYNC_response * res) * possibly by putting the vp back on the VLRU. */ code = SYNC_OK; + } else if (V_attachState(vp) == VOL_STATE_DELETED) { + VDeregisterVolOp_r(vp); + res->hdr.reason = FSYNC_UNKNOWN_VOLID; + } else { code = SYNC_DENIED; res->hdr.reason = FSYNC_BAD_STATE; diff --git a/src/vol/vol-salvage.c b/src/vol/vol-salvage.c index 5ce3147da..b1838d859 100644 --- a/src/vol/vol-salvage.c +++ b/src/vol/vol-salvage.c @@ -936,9 +936,11 @@ SalvageFileSys1(struct DiskPartition64 *partP, VolumeId singleVolumeNumber) } if (!foundSVN) { - /* singleVolumeNumber generally should always be in the constructed - * volumeSummary, but just in case it's not... */ - AskOnline(salvinfo, singleVolumeNumber); + /* If singleVolumeNumber is not in our volumeSummary, it means that + * at least one other volume in the VG is on the partition, but the + * RW volume is not. We've already AskOffline'd it by now, though, + * so make sure we don't still have the volume checked out. */ + AskDelete(salvinfo, singleVolumeNumber); } for (j = 0; j < salvinfo->nVolumes; j++) { @@ -4432,10 +4434,12 @@ void AskDelete(struct SalvInfo *salvinfo, VolumeId volumeId) { afs_int32 code, i; + SYNC_response res; for (i = 0; i < 3; i++) { + memset(&res, 0, sizeof(res)); code = FSYNC_VolOp(volumeId, salvinfo->fileSysPartition->name, - FSYNC_VOL_DONE, FSYNC_SALVAGE, NULL); + FSYNC_VOL_DONE, FSYNC_SALVAGE, &res); if (code == SYNC_OK) { break; @@ -4458,6 +4462,11 @@ AskDelete(struct SalvInfo *salvinfo, VolumeId volumeId) #endif } break; + } else if (code == SYNC_FAILED && + (res.hdr.reason == FSYNC_UNKNOWN_VOLID || + res.hdr.reason == FSYNC_WRONG_PART)) { + /* volume is already effectively 'deleted' */ + break; } else if (i < 2) { /* try it again */ Log("AskOnline: request for fileserver to delete volume failed; trying again...\n");