From f2c1f2ee48663d00701e7cee52b99151e36b9534 Mon Sep 17 00:00:00 2001 From: Andrew Deason Date: Wed, 23 Mar 2011 16:12:20 -0500 Subject: [PATCH] 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 --- src/vol/fssync-server.c | 4 ++++ src/vol/vol-salvage.c | 17 +++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/vol/fssync-server.c b/src/vol/fssync-server.c index 4126afd..d163442 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 5ce3147..b1838d8 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"); -- 1.9.4