salvager: Do not AskOnline nonexistent volumes
authorAndrew Deason <adeason@sinenomine.net>
Wed, 23 Mar 2011 21:12:20 +0000 (16:12 -0500)
committerDerrick Brashear <shadow@dementia.org>
Thu, 24 Mar 2011 16:21:29 +0000 (09:21 -0700)
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 <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>

src/vol/fssync-server.c
src/vol/vol-salvage.c

index 4126afd..d163442 100644 (file)
@@ -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;
index 5ce3147..b1838d8 100644 (file)
@@ -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");