vos: preserve cloneId and backupId when restoring
[openafs.git] / src / volser / vsprocs.c
index 9366dcb..6e8df65 100644 (file)
@@ -549,37 +549,37 @@ SubEnumerateEntry(struct nvldbentry *entry)
 
 #ifdef notdef
     fprintf(STDOUT, "  readWriteID %-10u ", entry->volumeId[RWVOL]);
-    if (entry->flags & RW_EXISTS)
+    if (entry->flags & VLF_RWEXISTS)
        fprintf(STDOUT, " valid \n");
     else
        fprintf(STDOUT, " invalid \n");
     fprintf(STDOUT, "  readOnlyID  %-10u ", entry->volumeId[ROVOL]);
-    if (entry->flags & RO_EXISTS)
+    if (entry->flags & VLF_ROEXISTS)
        fprintf(STDOUT, " valid \n");
     else
        fprintf(STDOUT, " invalid \n");
     fprintf(STDOUT, "  backUpID    %-10u ", entry->volumeId[BACKVOL]);
-    if (entry->flags & BACK_EXISTS)
+    if (entry->flags & VLF_BACKEXISTS)
        fprintf(STDOUT, " valid \n");
     else
        fprintf(STDOUT, " invalid \n");
-    if ((entry->cloneId != 0) && (entry->flags & RO_EXISTS))
+    if ((entry->cloneId != 0) && (entry->flags & VLF_ROEXISTS))
        fprintf(STDOUT, "    releaseClone %-10u \n", entry->cloneId);
 #else
-    if (entry->flags & RW_EXISTS)
+    if (entry->flags & VLF_RWEXISTS)
        fprintf(STDOUT, "    RWrite: %-10u", entry->volumeId[RWVOL]);
-    if (entry->flags & RO_EXISTS)
+    if (entry->flags & VLF_ROEXISTS)
        fprintf(STDOUT, "    ROnly: %-10u", entry->volumeId[ROVOL]);
-    if (entry->flags & BACK_EXISTS)
+    if (entry->flags & VLF_BACKEXISTS)
        fprintf(STDOUT, "    Backup: %-10u", entry->volumeId[BACKVOL]);
-    if ((entry->cloneId != 0) && (entry->flags & RO_EXISTS))
+    if ((entry->cloneId != 0) && (entry->flags & VLF_ROEXISTS))
        fprintf(STDOUT, "    RClone: %-10lu", (unsigned long)entry->cloneId);
     fprintf(STDOUT, "\n");
 #endif
     fprintf(STDOUT, "    number of sites -> %lu\n",
            (unsigned long)entry->nServers);
     for (i = 0; i < entry->nServers; i++) {
-       if (entry->serverFlags[i] & NEW_REPSITE)
+       if (entry->serverFlags[i] & VLSF_NEWREPSITE)
            isMixed = 1;
     }
     for (i = 0; i < entry->nServers; i++) {
@@ -587,18 +587,18 @@ SubEnumerateEntry(struct nvldbentry *entry)
        fprintf(STDOUT, "       server %s partition %s ",
                noresolve ? afs_inet_ntoa_r(entry->serverNumber[i], hoststr) :
                 hostutil_GetNameByINet(entry->serverNumber[i]), pname);
-       if (entry->serverFlags[i] & ITSRWVOL)
+       if (entry->serverFlags[i] & VLSF_RWVOL)
            fprintf(STDOUT, "RW Site ");
        else
            fprintf(STDOUT, "RO Site ");
        if (isMixed) {
-           if (entry->serverFlags[i] & NEW_REPSITE)
+           if (entry->serverFlags[i] & VLSF_NEWREPSITE)
                fprintf(STDOUT," -- New release");
            else
-               if (!(entry->serverFlags[i] & ITSRWVOL))
+               if (!(entry->serverFlags[i] & VLSF_RWVOL))
                    fprintf(STDOUT," -- Old release");
        } else {
-           if (entry->serverFlags[i] & RO_DONTUSE)
+           if (entry->serverFlags[i] & VLSF_DONTUSE)
                fprintf(STDOUT, " -- Not released");
        }
        fprintf(STDOUT, "\n");
@@ -795,8 +795,8 @@ UV_CreateVolume3(afs_uint32 aserver, afs_int32 apart, char *aname,
                                         * level of indirection later */
     entry.serverPartition[0] = apart;  /* this should also have
                                         * another indirection level */
-    entry.flags = RW_EXISTS;   /* this records that rw volume exists */
-    entry.serverFlags[0] = ITSRWVOL;   /*this rep site has rw  vol */
+    entry.flags = VLF_RWEXISTS;        /* this records that rw volume exists */
+    entry.serverFlags[0] = VLSF_RWVOL; /*this rep site has rw  vol */
     entry.volumeId[RWVOL] = *anewid;
     entry.volumeId[ROVOL] = aroid ? *aroid : 0;
     entry.volumeId[BACKVOL] = abkid ? *abkid : 0;
@@ -863,8 +863,8 @@ UV_AddVLDBEntry(afs_uint32 aserver, afs_int32 apart, char *aname,
                                         * level of indirection later */
     entry.serverPartition[0] = apart;  /* this should also have
                                         * another indirection level */
-    entry.flags = RW_EXISTS;   /* this records that rw volume exists */
-    entry.serverFlags[0] = ITSRWVOL;   /*this rep site has rw  vol */
+    entry.flags = VLF_RWEXISTS;        /* this records that rw volume exists */
+    entry.serverFlags[0] = VLSF_RWVOL; /*this rep site has rw  vol */
     entry.volumeId[RWVOL] = aid;
 #ifdef notdef
     entry.volumeId[ROVOL] = anewid + 1;        /* rw,ro, bk id are related in the default case */
@@ -955,14 +955,14 @@ UV_DeleteVolume(afs_uint32 aserver, afs_int32 apart, afs_uint32 avolid)
        /* Its a backup volume, modify the VLDB entry. Check that the
         * backup volume is on the server/partition we asked to delete.
         */
-       if (!(entry.flags & BACK_EXISTS) || !Lp_Match(aserver, apart, &entry)) {
+       if (!(entry.flags & VLF_BACKEXISTS) || !Lp_Match(aserver, apart, &entry)) {
            notinvldb = 2;      /* Not on this server and partition */
            ERROR_EXIT(0);
        }
 
        VPRINT1("Marking the backup volume %u deleted in the VLDB\n", avolid);
 
-       entry.flags &= ~BACK_EXISTS;
+       entry.flags &= ~VLF_BACKEXISTS;
        vtype = BACKVOL;
     }
 
@@ -985,7 +985,7 @@ UV_DeleteVolume(afs_uint32 aserver, afs_int32 apart, afs_uint32 avolid)
        Lp_SetROValue(&entry, aserver, apart, 0, 0);    /* delete the site */
        entry.nServers--;
        if (!Lp_ROMatch(0, 0, &entry))
-           entry.flags &= ~RO_EXISTS;  /* This was the last ro volume */
+           entry.flags &= ~VLF_ROEXISTS;       /* This was the last ro volume */
        vtype = ROVOL;
     }
 
@@ -994,7 +994,7 @@ UV_DeleteVolume(afs_uint32 aserver, afs_int32 apart, afs_uint32 avolid)
         * Check that the readwrite volumes is on the server/partition we
         * asked to delete.
         */
-       if (!(entry.flags & RW_EXISTS) || !Lp_Match(aserver, apart, &entry)) {
+       if (!(entry.flags & VLF_RWEXISTS) || !Lp_Match(aserver, apart, &entry)) {
            notinvldb = 2;      /* Not found on this server and partition */
            ERROR_EXIT(0);
        }
@@ -1014,15 +1014,15 @@ UV_DeleteVolume(afs_uint32 aserver, afs_int32 apart, afs_uint32 avolid)
                    "Marking the readwrite volume %lu%s deleted in the VLDB\n",
                    (unsigned long)avolid,
                    ((entry.
-                     flags & BACK_EXISTS) ? ", and its backup volume," :
+                     flags & VLF_BACKEXISTS) ? ", and its backup volume," :
                     ""));
 
        Lp_SetRWValue(&entry, aserver, apart, 0L, 0L);
        entry.nServers--;
-       entry.flags &= ~(BACK_EXISTS | RW_EXISTS);
+       entry.flags &= ~(VLF_BACKEXISTS | VLF_RWEXISTS);
        vtype = RWVOL;
 
-       if (entry.flags & RO_EXISTS)
+       if (entry.flags & VLF_ROEXISTS)
            fprintf(STDERR, "WARNING: ReadOnly copy(s) may still exist\n");
     }
 
@@ -1032,7 +1032,7 @@ UV_DeleteVolume(afs_uint32 aserver, afs_int32 apart, afs_uint32 avolid)
     }
 
     /* Either delete or replace the VLDB entry */
-    if ((entry.nServers <= 0) || !(entry.flags & (RO_EXISTS | RW_EXISTS))) {
+    if ((entry.nServers <= 0) || !(entry.flags & (VLF_ROEXISTS | VLF_RWEXISTS))) {
        if (verbose)
            fprintf(STDOUT,
                    "Last reference to the VLDB entry for %lu - deleting entry\n",
@@ -1338,6 +1338,159 @@ cfail:
     return error;
 }
 
+/* Convert volume from RO to RW; adjust the VLDB entry to match.
+ * The nvldbentry passed to us has already been MapHostToNetwork'd
+ * by the caller.
+ */
+
+int
+UV_ConvertRO(afs_uint32 server, afs_uint32 partition, afs_uint32 volid,
+               struct nvldbentry *entry)
+{
+    afs_int32 code, i, same;
+    struct nvldbentry checkEntry, storeEntry;
+    afs_int32 vcode;
+    afs_int32 rwindex = 0;
+    afs_uint32 rwserver = 0;
+    afs_int32 roindex = 0;
+    afs_uint32 roserver = 0;
+    struct rx_connection *aconn;
+
+    vcode =
+       ubik_VL_SetLock(cstruct, 0, entry->volumeId[RWVOL], RWVOL,
+                 VLOP_MOVE);
+    if (vcode) {
+       fprintf(STDERR,
+               "Unable to lock volume %lu, code %d\n",
+               (unsigned long)entry->volumeId[RWVOL],vcode);
+       PrintError("", vcode);
+       return -1;
+    }
+
+    /* make sure the VLDB entry hasn't changed since we started */
+    memset(&checkEntry, 0, sizeof(checkEntry));
+    vcode = VLDB_GetEntryByID(volid, -1, &checkEntry);
+    if (vcode) {
+       fprintf(STDERR,
+                "Could not fetch the entry for volume %lu from VLDB\n",
+                (unsigned long)volid);
+       PrintError("convertROtoRW ", vcode);
+       code = vcode;
+       goto error_exit;
+    }
+
+    MapHostToNetwork(&checkEntry);
+    entry->flags &= ~VLOP_ALLOPERS;  /* clear any stale lock operation flags */
+    entry->flags |= VLOP_MOVE;        /* set to match SetLock operation above */
+    if (memcmp(entry, &checkEntry, sizeof(*entry)) != 0) {
+        fprintf(STDERR,
+                "VLDB entry for volume %lu has changed; please reissue the command.\n",
+                (unsigned long)volid);
+        code = -1;
+        goto error_exit;
+    }
+
+    /* extract information from the original entry */
+    for (i = 0; i < entry->nServers; i++) {
+       if (entry->serverFlags[i] & VLSF_RWVOL) {
+           rwindex = i;
+           rwserver = entry->serverNumber[i];
+       /*  rwpartition = entry->serverPartition[i]; */
+           if (roserver)
+               break;
+       } else if ((entry->serverFlags[i] & VLSF_ROVOL) && !roserver) {
+           same = VLDB_IsSameAddrs(server, entry->serverNumber[i], &code);
+           if (code) {
+               fprintf(STDERR,
+                       "Failed to get info about server's %d address(es) from vlserver (err=%d); aborting call!\n",
+                       server, code);
+               code = ENOENT;
+               goto error_exit;
+           }
+           if (same) {
+               roindex = i;
+               roserver = entry->serverNumber[i];
+       /*      ropartition = entry->serverPartition[i]; */
+               if (rwserver)
+                    break;
+           }
+       }
+    }
+
+    aconn = UV_Bind(server, AFSCONF_VOLUMEPORT);
+    code = AFSVolConvertROtoRWvolume(aconn, partition, volid);
+    if (code) {
+       fprintf(STDERR,
+               "Converting RO volume %lu to RW volume failed with code %d\n",
+               (unsigned long)volid, code);
+       PrintError("convertROtoRW ", code);
+       goto error_exit;
+    }
+    /* Update the VLDB to match what we did on disk as much as possible.  */
+    /* If the converted RO was in the VLDB, make it look like the new RW. */
+    if (roserver) {
+       entry->serverFlags[roindex] = VLSF_RWVOL;
+    } else {
+       /* Add a new site entry for the newly created RW.  It's possible
+        * (but unlikely) that we are already at MAXNSERVERS and that this
+        * new site will invalidate the whole VLDB entry;  however,
+        * VLDB_ReplaceEntry will detect this and return VL_BADSERVER,
+        * so we need no extra guard logic here.
+        */
+       afs_int32 newrwindex = entry->nServers;
+       (entry->nServers)++;
+       entry->serverNumber[newrwindex] = server;
+       entry->serverPartition[newrwindex] = partition;
+       entry->serverFlags[newrwindex] = VLSF_RWVOL;
+    }
+    entry->flags |= VLF_RWEXISTS;
+    entry->flags &= ~VLF_BACKEXISTS;
+
+    /* if the old RW was in the VLDB, remove it by decrementing the number */
+    /* of servers, replacing the RW entry with the last entry, and zeroing */
+    /* out the last entry. */
+    if (rwserver) {
+       (entry->nServers)--;
+       if (rwindex != entry->nServers) {
+           entry->serverNumber[rwindex] = entry->serverNumber[entry->nServers];
+           entry->serverPartition[rwindex] =
+               entry->serverPartition[entry->nServers];
+           entry->serverFlags[rwindex] = entry->serverFlags[entry->nServers];
+           entry->serverNumber[entry->nServers] = 0;
+           entry->serverPartition[entry->nServers] = 0;
+           entry->serverFlags[entry->nServers] = 0;
+       }
+    }
+    entry->flags &= ~VLF_ROEXISTS;
+    for (i = 0; i < entry->nServers; i++) {
+       if (entry->serverFlags[i] & VLSF_ROVOL) {
+           if (!(entry->serverFlags[i] & (VLSF_DONTUSE | VLSF_NEWREPSITE)))
+               entry->flags |= VLF_ROEXISTS;
+       }
+    }
+    MapNetworkToHost(entry, &storeEntry);
+    code =
+       VLDB_ReplaceEntry(entry->volumeId[RWVOL], RWVOL, &storeEntry,
+                         (LOCKREL_OPCODE | LOCKREL_AFSID |
+                          LOCKREL_TIMESTAMP));
+    if (code) {
+       fprintf(STDERR,
+               "Warning: volume converted, but vldb update failed with code %d!\n",
+               code);
+    }
+
+  error_exit:
+    vcode = UV_LockRelease(entry->volumeId[RWVOL]);
+    if (vcode) {
+       fprintf(STDERR,
+               "Unable to unlock volume %lu, code %d\n",
+               (unsigned long)entry->volumeId[RWVOL],vcode);
+       PrintError("", vcode);
+    }
+    return code;
+}
+
+
 /* Move volume <afromvol> on <afromserver> <afrompart> to <atoserver>
  * <atopart>.  The operation is almost idempotent.  The following
  * flags are recognized:
@@ -1409,8 +1562,10 @@ UV_MoveVolume2(afs_uint32 afromvol, afs_uint32 afromserver, afs_int32 afrompart,
        fprintf(STDOUT, "First test point - operation not started.\n");
        fprintf(STDOUT, "...test here (y, n)? ");
        fflush(STDOUT);
-       fscanf(stdin, "%c", &in);
-       fscanf(stdin, "%c", &lf);       /* toss away */
+       if (fscanf(stdin, "%c", &in) < 1)
+           in = 0;
+       if (fscanf(stdin, "%c", &lf) < 0)       /* toss away */
+           ; /* don't care */
        if (in == 'y') {
            fprintf(STDOUT, "type control-c\n");
            while (1) {
@@ -1452,7 +1607,7 @@ UV_MoveVolume2(afs_uint32 afromvol, afs_uint32 afromserver, afs_int32 afrompart,
                    (unsigned long)afromvol);
            fprintf(STDERR, "The current site is :");
            for (i = 0; i < entry.nServers; i++) {
-               if (entry.serverFlags[i] == ITSRWVOL) {
+               if (entry.serverFlags[i] == VLSF_RWVOL) {
                    char pname[10];
                    MapPartIdIntoName(entry.serverPartition[i], pname);
                    fprintf(STDERR, " server %s partition %s \n",
@@ -1758,15 +1913,17 @@ UV_MoveVolume2(afs_uint32 afromvol, afs_uint32 afromserver, afs_int32 afrompart,
 
     Lp_SetRWValue(&entry, afromserver, afrompart, atoserver, atopart);
     MapNetworkToHost(&entry, &storeEntry);
-    storeEntry.flags &= ~BACK_EXISTS;
+    storeEntry.flags &= ~VLF_BACKEXISTS;
 
     if (TESTC) {
        fprintf(STDOUT,
                "Second test point - operation in progress but not complete.\n");
        fprintf(STDOUT, "...test here (y, n)? ");
        fflush(STDOUT);
-       fscanf(stdin, "%c", &in);
-       fscanf(stdin, "%c", &lf);       /* toss away */
+       if (fscanf(stdin, "%c", &in) < 1)
+           in = 0;
+       if (fscanf(stdin, "%c", &lf) < 0)       /* toss away */
+           ; /* don't care */
        if (in == 'y') {
            fprintf(STDOUT, "type control-c\n");
            while (1) {
@@ -1798,8 +1955,10 @@ UV_MoveVolume2(afs_uint32 afromvol, afs_uint32 afromserver, afs_int32 afrompart,
                "Third test point - operation complete but no cleanup.\n");
        fprintf(STDOUT, "...test here (y, n)? ");
        fflush(STDOUT);
-       fscanf(stdin, "%c", &in);
-       fscanf(stdin, "%c", &lf);       /* toss away */
+       if (fscanf(stdin, "%c", &in) < 1)
+           in = 0;
+       if (fscanf(stdin, "%c", &lf) < 0)       /* toss away */
+           ; /* don't care */
        if (in == 'y') {
            fprintf(STDOUT, "type control-c\n");
            while (1) {
@@ -1881,8 +2040,10 @@ UV_MoveVolume2(afs_uint32 afromvol, afs_uint32 afromserver, afs_int32 afrompart,
        fprintf(STDOUT, "Fourth test point - operation complete.\n");
        fprintf(STDOUT, "...test here (y, n)? ");
        fflush(STDOUT);
-       fscanf(stdin, "%c", &in);
-       fscanf(stdin, "%c", &lf);       /* toss away */
+       if (fscanf(stdin, "%c", &in) < 1)
+           in = 0;
+       if (fscanf(stdin, "%c", &lf) < 0)       /* toss away */
+           ; /* don't care */
        if (in == 'y') {
            fprintf(STDOUT, "type control-c\n");
            while (1) {
@@ -1896,7 +2057,7 @@ UV_MoveVolume2(afs_uint32 afromvol, afs_uint32 afromserver, afs_int32 afrompart,
 
     /* normal cleanup code */
 
-    if (entry.flags & RO_EXISTS)
+    if (entry.flags & VLF_ROEXISTS)
        fprintf(STDERR, "WARNING : readOnly copies still exist \n");
 
     if (islocked) {
@@ -2489,8 +2650,8 @@ cpincr:
        newentry.nServers = 1;
        newentry.serverNumber[0] = atoserver;
        newentry.serverPartition[0] = atopart;
-       newentry.flags = (flags & RV_RDONLY) ? RO_EXISTS : RW_EXISTS;
-       newentry.serverFlags[0] = (flags & RV_RDONLY) ? ITSROVOL : ITSRWVOL;
+       newentry.flags = (flags & RV_RDONLY) ? VLF_ROEXISTS : VLF_RWEXISTS;
+       newentry.serverFlags[0] = (flags & RV_RDONLY) ? VLSF_ROVOL : VLSF_RWVOL;
        newentry.volumeId[RWVOL] = newVol;
        newentry.volumeId[ROVOL] = (flags & RV_RDONLY) ? newVol : 0;
        newentry.volumeId[BACKVOL] = 0;
@@ -2667,7 +2828,7 @@ UV_BackupVolume(afs_uint32 aserver, afs_int32 apart, afs_uint32 avolid)
     /* These operations require the VLDB be locked since it means the VLDB
      * will change or the vldb is already locked.
      */
-    if (!(entry.flags & BACK_EXISTS) ||        /* backup volume doesnt exist */
+    if (!(entry.flags & VLF_BACKEXISTS) ||     /* backup volume doesnt exist */
        (entry.flags & VLOP_ALLOPERS) ||        /* vldb lock already held */
        (entry.volumeId[BACKVOL] == INVALID_BID)) {     /* no assigned backup volume id */
 
@@ -2725,8 +2886,8 @@ UV_BackupVolume(afs_uint32 aserver, afs_int32 apart, afs_uint32 avolid)
     }
 
     /* Mark vldb as backup exists */
-    if (!(entry.flags & BACK_EXISTS)) {
-       entry.flags |= BACK_EXISTS;
+    if (!(entry.flags & VLF_BACKEXISTS)) {
+       entry.flags |= VLF_BACKEXISTS;
        vldbmod = 1;
     }
 
@@ -2883,7 +3044,7 @@ UV_CloneVolume(afs_uint32 aserver, afs_int32 apart, afs_uint32 avolid,
        type = backupVolume;
 
     code = DoVolClone(aconn, avolid, apart, type, acloneid, "clone",
-                     NULL, ".clone", NULL, NULL, NULL);
+                     NULL, aname, NULL, NULL, NULL);
     if (code) {
        error = code;
        goto bfail;
@@ -3003,7 +3164,7 @@ GetTrans(struct nvldbentry *vldbEntryPtr, afs_int32 index,
                              vldbEntryPtr->serverPartition[index], ITOffline,
                              transPtr);
 
-       if (!code && (origflags[index] & RO_DONTUSE)) {
+       if (!code && (origflags[index] & VLSF_DONTUSE)) {
            /* If RO_DONTUSE is set, this is supposed to be an entirely new
             * site. Don't trust any data on it, since it is possible we
             * have encountered some temporary volume from some other
@@ -3063,11 +3224,6 @@ GetTrans(struct nvldbentry *vldbEntryPtr, afs_int32 index,
            goto fail;
        }
 
-       if (tmpVolId)
-           strcat(volname, ".roclone");
-       else
-           strcat(volname, ".readonly");
-
        if (verbose) {
            fprintf(STDOUT,
                    "Creating new volume %lu on replication site %s: ",
@@ -3301,23 +3457,31 @@ DoVolOnline(struct nvldbentry *vldbEntryPtr, afs_uint32 avolid, int index,
     return code;
 }
 
-/* UV_ReleaseVolume()
- *    Release volume <afromvol> on <afromserver> <afrompart> to all
- *    its RO sites (full release). Unless the previous release was
- *    incomplete: in which case we bring the remaining incomplete
- *    volumes up to date with the volumes that were released
- *    successfully.
- *    forceflag: Performs a full release.
+/**
+ * Release a volume to read-only sites
  *
- *    Will create a clone from the RW, then dump the clone out to
- *    the remaining replicas. If there is more than 1 RO sites,
- *    ensure that the VLDB says at least one RO is available all
- *    the time: Influences when we write back the VLDB entry.
+ * Release volume <afromvol> on <afromserver> <afrompart> to all
+ * its RO sites (full release). Unless the previous release was
+ * incomplete: in which case we bring the remaining incomplete
+ * volumes up to date with the volumes that were released
+ * successfully.
+ *
+ * Will create a clone from the RW, then dump the clone out to
+ * the remaining replicas. If there is more than 1 RO sites,
+ * ensure that the VLDB says at least one RO is available all
+ * the time: Influences when we write back the VLDB entry.
+ *
+ * @param[in] afromvol      volume to be released
+ * @param[in] afromserver   server containing afromvol
+ * @param[in] afrompart     partition containing afromvol
+ * @param[in] flags         bitmap of options
+ *                            REL_COMPLETE  - force a complete release
+ *                            REL_FULLDUMPS - force full dumps
+ *                            REL_STAYUP    - dump to clones to avoid offline time
  */
-
 int
 UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
-                afs_int32 afrompart, int forceflag, int stayUp)
+                afs_int32 afrompart, int flags)
 {
     char vname[64];
     afs_int32 code = 0;
@@ -3359,6 +3523,7 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
     int justnewsites = 0; /* are we just trying to release to new RO sites? */
     int sites = 0; /* number of ro sites */
     int new_sites = 0; /* number of ro sites markes as new */
+    int stayUp = (flags & REL_STAYUP);
 
     typedef enum {
         CR_RECOVER    = 0x0000, /**< not complete: a recovery from a previous failed release */
@@ -3434,20 +3599,20 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
      * vldb flags.
      *
      * The caller can override the vldb flags check using the -force
-     * flag, to force this to be a complete release.
+     * or -force-reclone flag, to force this to be a complete release.
      */
     for (i = 0; i < entry.nServers; i++) {
-       if (entry.serverFlags[i] & ITSROVOL) {
+       if (entry.serverFlags[i] & VLSF_ROVOL) {
            sites++;
-           if (entry.serverFlags[i] & NEW_REPSITE)
+           if (entry.serverFlags[i] & VLSF_NEWREPSITE)
                new_sites++;
-           if (entry.serverFlags[i] & RO_DONTUSE)
+           if (entry.serverFlags[i] & VLSF_DONTUSE)
                notreleased++;
        }
        origflags[i] = entry.serverFlags[i];
     }
 
-    if (forceflag) {
+    if (flags & REL_COMPLETE) {
        complete_release |= CR_FORCED;
     }
 
@@ -3461,7 +3626,8 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
        && !(complete_release & CR_FORCED)) {
        if (notreleased && notreleased != sites) {
            /* we have some new unreleased sites. try to just release to those,
-            * if the RW has not changed. The caller can override with -force. */
+            * if the RW has not changed. The caller can override with -force
+            * or with -force-reclone. */
            justnewsites = 1;
        }
     }
@@ -3479,7 +3645,7 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
        error = 0;
 
        for (e = 0; (e < entry.nServers) && !error; e++) {
-           if ((entry.serverFlags[e] & ITSROVOL)) {
+           if ((entry.serverFlags[e] & VLSF_ROVOL)) {
                if (!(VLDB_IsSameAddrs(entry.serverNumber[e], afromserver,
                                       &error)))
                    break;
@@ -3611,7 +3777,7 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
        }
        /* clean up any previous tmp clone before starting if staying up */
        if (roexists
-           && (!roclone || (entry.serverFlags[roindex] & RO_DONTUSE))) {
+           && (!roclone || (entry.serverFlags[roindex] & VLSF_DONTUSE))) {
            code = DoVolDelete(fromconn,
                               stayUp ? entry.volumeId[ROVOL] : cloneVolId,
                               afrompart, "the", 0, NULL, NULL);
@@ -3627,10 +3793,10 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
                struct rx_connection *conn;
                afs_int32 crdate;
 
-               if (!(entry.serverFlags[vldbindex] & ITSROVOL)) {
+               if (!(entry.serverFlags[vldbindex] & VLSF_ROVOL)) {
                    continue;
                }
-               if ((entry.serverFlags[vldbindex] & RO_DONTUSE)) {
+               if ((entry.serverFlags[vldbindex] & VLSF_DONTUSE)) {
                    continue;
                }
                conn = UV_Bind(entry.serverNumber[vldbindex], AFSCONF_VOLUMEPORT);
@@ -3702,18 +3868,18 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
         */
        for (i = 0; i < entry.nServers; i++) {
            if (justnewsites) {
-               if ((entry.serverFlags[i] & RO_DONTUSE)) {
-                   entry.serverFlags[i] &= ~NEW_REPSITE;
+               if ((entry.serverFlags[i] & VLSF_DONTUSE)) {
+                   entry.serverFlags[i] &= ~VLSF_NEWREPSITE;
                } else {
-                   entry.serverFlags[i] |= NEW_REPSITE;
+                   entry.serverFlags[i] |= VLSF_NEWREPSITE;
                }
            } else {
-               entry.serverFlags[i] &= ~NEW_REPSITE;
-               entry.serverFlags[i] |= RO_DONTUSE;
+               entry.serverFlags[i] &= ~VLSF_NEWREPSITE;
+               entry.serverFlags[i] |= VLSF_DONTUSE;
            }
        }
-       entry.serverFlags[rwindex] |= NEW_REPSITE;
-       entry.serverFlags[rwindex] &= ~RO_DONTUSE;
+       entry.serverFlags[rwindex] |= VLSF_NEWREPSITE;
+       entry.serverFlags[rwindex] &= ~VLSF_DONTUSE;
     }
 
     if (justnewsites && roexists) {
@@ -3745,11 +3911,11 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
            justnewsites = 0;
            /* reset the serverFlags as if 'justnewsites' had never been set */
            for (i = 0; i < entry.nServers; i++) {
-               entry.serverFlags[i] &= ~NEW_REPSITE;
-               entry.serverFlags[i] |= RO_DONTUSE;
+               entry.serverFlags[i] &= ~VLSF_NEWREPSITE;
+               entry.serverFlags[i] |= VLSF_DONTUSE;
            }
-           entry.serverFlags[rwindex] |= NEW_REPSITE;
-           entry.serverFlags[rwindex] &= ~RO_DONTUSE;
+           entry.serverFlags[rwindex] |= VLSF_NEWREPSITE;
+           entry.serverFlags[rwindex] &= ~VLSF_DONTUSE;
        }
 
        rwcrdate = volstatus.creationDate;
@@ -3790,9 +3956,9 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
                sleep(5);
 
            /* Mark the RO clone in the VLDB as a good site (already released) */
-           entry.serverFlags[roindex] |= NEW_REPSITE;
-           entry.serverFlags[roindex] &= ~RO_DONTUSE;
-           entry.flags |= RO_EXISTS;
+           entry.serverFlags[roindex] |= VLSF_NEWREPSITE;
+           entry.serverFlags[roindex] &= ~VLSF_DONTUSE;
+           entry.flags |= VLF_ROEXISTS;
 
            releasecount++;
 
@@ -3866,9 +4032,9 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
 
     /* if we have a clone, treat this as done, for now */
     if (stayUp && !complete_release) {
-       entry.serverFlags[roindex] |= NEW_REPSITE;
-       entry.serverFlags[roindex] &= ~RO_DONTUSE;
-       entry.flags |= RO_EXISTS;
+       entry.serverFlags[roindex] |= VLSF_NEWREPSITE;
+       entry.serverFlags[roindex] &= ~VLSF_DONTUSE;
+       entry.flags |= VLF_ROEXISTS;
 
        releasecount++;
     }
@@ -3891,10 +4057,10 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
 
            if (vldbindex == roindex)
                continue;       /* the clone    */
-           if ((entry.serverFlags[vldbindex] & NEW_REPSITE)
-               && !(entry.serverFlags[vldbindex] & RO_DONTUSE))
+           if ((entry.serverFlags[vldbindex] & VLSF_NEWREPSITE)
+               && !(entry.serverFlags[vldbindex] & VLSF_DONTUSE))
                continue;
-           if (!(entry.serverFlags[vldbindex] & ITSROVOL))
+           if (!(entry.serverFlags[vldbindex] & VLSF_ROVOL))
                continue;       /* not a RO vol */
 
 
@@ -3919,7 +4085,7 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
                continue;
 
            /* Thisdate is the date from which we want to pick up all changes */
-           if (forceflag) {
+           if (flags & REL_FULLDUMPS) {
                /* Do a full dump when forced by the caller. */
                VPRINT("This will be a full dump: forced\n");
                thisdate = 0;
@@ -4066,9 +4232,9 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
                    continue;
                }
 
-               entry.serverFlags[times[m].vldbEntryIndex] |= NEW_REPSITE;
-               entry.serverFlags[times[m].vldbEntryIndex] &= ~RO_DONTUSE;
-               entry.flags |= RO_EXISTS;
+               entry.serverFlags[times[m].vldbEntryIndex] |= VLSF_NEWREPSITE;
+               entry.serverFlags[times[m].vldbEntryIndex] &= ~VLSF_DONTUSE;
+               entry.flags |= VLF_ROEXISTS;
                releasecount++;
            }
        }
@@ -4114,12 +4280,12 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
            }
            if (code) {
                EPRINT(code, "Failed: ");
-               entry.serverFlags[roindex] &= ~NEW_REPSITE;
-               entry.serverFlags[roindex] |= RO_DONTUSE;
+               entry.serverFlags[roindex] &= ~VLSF_NEWREPSITE;
+               entry.serverFlags[roindex] |= VLSF_DONTUSE;
            } else {
-               entry.serverFlags[roindex] |= NEW_REPSITE;
-               entry.serverFlags[roindex] &= ~RO_DONTUSE;
-               entry.flags |= RO_EXISTS;
+               entry.serverFlags[roindex] |= VLSF_NEWREPSITE;
+               entry.serverFlags[roindex] &= ~VLSF_DONTUSE;
+               entry.flags |= VLF_ROEXISTS;
                VDONE;
            }
 
@@ -4160,15 +4326,15 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
 
                if (code) {
                    if (!times[s].crtime) {
-                       entry.serverFlags[vldbindex] |= RO_DONTUSE;
+                       entry.serverFlags[vldbindex] |= VLSF_DONTUSE;
                    }
-                   entry.serverFlags[vldbindex] &= ~NEW_REPSITE;
+                   entry.serverFlags[vldbindex] &= ~VLSF_NEWREPSITE;
                    PrintError("Failed: ",
                               code);
                } else
                    VDONE;
 
-               if (entry.serverFlags[vldbindex] != RO_DONTUSE) {
+               if (entry.serverFlags[vldbindex] != VLSF_DONTUSE) {
                    /* bring it online (mark it InService) */
                    VPRINT1("Bringing readonly online on %s...",
                            noresolve ?
@@ -4183,8 +4349,8 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
                    /* needed to come online for cloning */
                    if (code) {
                        /* technically it's still new, just not online */
-                       entry.serverFlags[s] &= ~NEW_REPSITE;
-                       entry.serverFlags[s] |= RO_DONTUSE;
+                       entry.serverFlags[s] &= ~VLSF_NEWREPSITE;
+                       entry.serverFlags[s] |= VLSF_DONTUSE;
                        if (code != ENOENT) {
                            PrintError("Failed to set correct names and ids: ",
                                       code);
@@ -4244,7 +4410,7 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
 
     /* Figure out if any volume were not released and say so */
     for (failure = 0, i = 0; i < entry.nServers; i++) {
-       if (!(entry.serverFlags[i] & NEW_REPSITE))
+       if (!(entry.serverFlags[i] & VLSF_NEWREPSITE))
            failure++;
     }
     if (failure) {
@@ -4253,7 +4419,7 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
                "The volume %lu could not be released to the following %d sites:\n",
                (unsigned long)afromvol, failure);
        for (i = 0; i < entry.nServers; i++) {
-           if (!(entry.serverFlags[i] & NEW_REPSITE)) {
+           if (!(entry.serverFlags[i] & VLSF_NEWREPSITE)) {
                MapPartIdIntoName(entry.serverPartition[i], pname);
                fprintf(STDERR, "\t%35s %s\n",
                         noresolve ? afs_inet_ntoa_r(entry.serverNumber[i], hoststr) :
@@ -4285,7 +4451,7 @@ UV_ReleaseVolume(afs_uint32 afromvol, afs_uint32 afromserver,
     }
 
     for (i = 0; i < entry.nServers; i++)
-       entry.serverFlags[i] &= ~NEW_REPSITE;
+       entry.serverFlags[i] &= ~VLSF_NEWREPSITE;
 
     /* Update the VLDB */
     VPRINT("updating VLDB ...");
@@ -4394,7 +4560,7 @@ UV_DumpVolume(afs_uint32 afromvol, afs_uint32 afromserver, afs_int32 afrompart,
     struct rx_connection * volatile fromconn = NULL;
     afs_int32 volatile fromtid = 0;
 
-    afs_int32 rxError = 0, rcode = 0;
+    afs_int32 rcode = 0;
     afs_int32 code, error = 0;
     afs_int32 tmp;
     time_t tmv = fromdate;
@@ -4444,7 +4610,7 @@ UV_DumpVolume(afs_uint32 afromvol, afs_uint32 afromserver, afs_int32 afrompart,
 
   error_exit:
     if (fromcall) {
-       code = rx_EndCall(fromcall, rxError);
+       code = rx_EndCall(fromcall, 0);
        if (code && code != RXGEN_OPCODE)
            fprintf(STDERR, "Error in rx_EndCall\n");
        if (code && !error)
@@ -4489,7 +4655,7 @@ UV_DumpClonedVolume(afs_uint32 afromvol, afs_uint32 afromserver,
     afs_uint32 volatile clonevol = 0;
 
     afs_int32 tmp;
-    afs_int32 fromtid = 0, rxError = 0, rcode = 0;
+    afs_int32 fromtid = 0, rcode = 0;
     afs_int32 code = 0, error = 0;
     afs_uint32 tmpVol;
     char vname[64];
@@ -4597,7 +4763,7 @@ UV_DumpClonedVolume(afs_uint32 afromvol, afs_uint32 afromserver,
     }
 
     if (fromcall) {
-       code = rx_EndCall(fromcall, rxError);
+       code = rx_EndCall(fromcall, 0);
        if (code) {
            fprintf(STDERR, "Error in rx_EndCall\n");
            if (!error)
@@ -4639,7 +4805,6 @@ UV_RestoreVolume2(afs_uint32 toserver, afs_int32 topart, afs_uint32 tovolid,
     struct rx_connection *toconn, *tempconn;
     struct rx_call *tocall;
     afs_int32 totid, code, rcode, vcode, terror = 0;
-    afs_int32 rxError = 0;
     struct volser_status tstatus;
     struct volintInfo vinfo;
     char partName[10];
@@ -4653,6 +4818,8 @@ UV_RestoreVolume2(afs_uint32 toserver, afs_int32 topart, afs_uint32 tovolid,
     int reuseID;
     afs_int32 volflag, voltype, volsertype;
     afs_int32 oldCreateDate, oldUpdateDate, newCreateDate, newUpdateDate;
+    VolumeId oldCloneId = 0;
+    VolumeId oldBackupId = 0;
     int index, same, errcode;
     char apartName[10];
     char hoststr[16];
@@ -4689,7 +4856,7 @@ UV_RestoreVolume2(afs_uint32 toserver, afs_int32 topart, afs_uint32 tovolid,
            }
            reuseID = 0;
        } else if (flags & RV_RDONLY) {
-           if (entry.flags & RW_EXISTS) {
+           if (entry.flags & VLF_RWEXISTS) {
                fprintf(STDERR,
                        "Entry for ReadWrite volume %s already exists!\n",
                        entry.name);
@@ -4762,6 +4929,8 @@ UV_RestoreVolume2(afs_uint32 toserver, afs_int32 topart, afs_uint32 tovolid,
        }
        oldCreateDate = tstatus.creationDate;
        oldUpdateDate = tstatus.updateDate;
+       oldCloneId = tstatus.cloneID;
+       oldBackupId = tstatus.backupID;
     } else {
        oldCreateDate = 0;
        oldUpdateDate = 0;
@@ -4785,7 +4954,7 @@ UV_RestoreVolume2(afs_uint32 toserver, afs_int32 topart, afs_uint32 tovolid,
        error = code;
        goto refail;
     }
-    terror = rx_EndCall(tocall, rxError);
+    terror = rx_EndCall(tocall, 0);
     tocall = (struct rx_call *)0;
     if (terror) {
        fprintf(STDERR, "rx_EndCall Failed \n");
@@ -4800,9 +4969,10 @@ UV_RestoreVolume2(afs_uint32 toserver, afs_int32 topart, afs_uint32 tovolid,
        error = code;
        goto refail;
     }
-    code = AFSVolSetIdsTypes(toconn, totid, tovolreal, voltype, pparentid, 0, 0);
+    code = AFSVolSetIdsTypes(toconn, totid, tovolreal, voltype, pparentid,
+                               oldCloneId, oldBackupId);
     if (code) {
-       fprintf(STDERR, "Could not set the right type and ID on %lu\n",
+       fprintf(STDERR, "Could not set the right type and IDs on %lu\n",
                (unsigned long)pvolid);
        error = code;
        goto refail;
@@ -4881,8 +5051,8 @@ UV_RestoreVolume2(afs_uint32 toserver, afs_int32 topart, afs_uint32 tovolid,
            entry.nServers = 1;
            entry.serverNumber[0] = toserver;   /*should be indirect */
            entry.serverPartition[0] = topart;
-           entry.serverFlags[0] = (flags & RV_RDONLY) ? ITSROVOL : ITSRWVOL;
-           entry.flags = (flags & RV_RDONLY) ? RO_EXISTS : RW_EXISTS;
+           entry.serverFlags[0] = (flags & RV_RDONLY) ? VLSF_ROVOL : VLSF_RWVOL;
+           entry.flags = (flags & RV_RDONLY) ? VLF_ROEXISTS : VLF_RWEXISTS;
            if (flags & RV_RDONLY)
                entry.volumeId[ROVOL] = pvolid;
            else if (tstatus.cloneID != 0) {
@@ -4938,7 +5108,7 @@ UV_RestoreVolume2(afs_uint32 toserver, afs_int32 topart, afs_uint32 tovolid,
                entry.serverNumber[entry.nServers] = toserver;
                entry.serverPartition[entry.nServers] = topart;
                entry.serverFlags[entry.nServers] =
-                   (flags & RV_RDONLY) ? ITSROVOL : ITSRWVOL;
+                   (flags & RV_RDONLY) ? VLSF_ROVOL : VLSF_RWVOL;
                entry.nServers++;
            } else {
                /* This volume should be deleted on the old site
@@ -4987,7 +5157,7 @@ UV_RestoreVolume2(afs_uint32 toserver, afs_int32 topart, afs_uint32 tovolid,
                entry.serverPartition[index] = topart;
            }
 
-           entry.flags |= (flags & RV_RDONLY) ? RO_EXISTS : RW_EXISTS;
+           entry.flags |= (flags & RV_RDONLY) ? VLF_ROEXISTS : VLF_RWEXISTS;
            MapNetworkToHost(&entry, &storeEntry);
            vcode =
                VLDB_ReplaceEntry(pvolid, voltype, &storeEntry,
@@ -5009,7 +5179,7 @@ UV_RestoreVolume2(afs_uint32 toserver, afs_int32 topart, afs_uint32 tovolid,
     }
   refail:
     if (tocall) {
-       code = rx_EndCall(tocall, rxError);
+       code = rx_EndCall(tocall, 0);
        if (!error)
            error = code;
     }
@@ -5143,7 +5313,7 @@ UV_AddSite2(afs_uint32 server, afs_int32 part, afs_uint32 volid,
 
     /* See if it's on the same server */
     for (j = 0; j < entry.nServers; j++) {
-       if (entry.serverFlags[j] & ITSROVOL) {
+       if (entry.serverFlags[j] & VLSF_ROVOL) {
            nro++;
            if (VLDB_IsSameAddrs(server, entry.serverNumber[j], &error)) {
                if (error) {
@@ -5193,9 +5363,9 @@ UV_AddSite2(afs_uint32 server, afs_int32 part, afs_uint32 volid,
     entry.serverNumber[entry.nServers] = server;
     entry.serverPartition[entry.nServers] = part;
     if (!valid) {
-       entry.serverFlags[entry.nServers] = (ITSROVOL | RO_DONTUSE);
+       entry.serverFlags[entry.nServers] = (VLSF_ROVOL | VLSF_DONTUSE);
     } else {
-       entry.serverFlags[entry.nServers] = (ITSROVOL);
+       entry.serverFlags[entry.nServers] = (VLSF_ROVOL);
     }
     entry.nServers++;
 
@@ -5269,8 +5439,8 @@ UV_RemoveSite(afs_uint32 server, afs_int32 part, afs_uint32 volid)
     } else {                   /*remove the rep site */
        Lp_SetROValue(&entry, server, part, 0, 0);
        entry.nServers--;
-       if ((entry.nServers == 1) && (entry.flags & RW_EXISTS))
-           entry.flags &= ~RO_EXISTS;
+       if ((entry.nServers == 1) && (entry.flags & VLF_RWEXISTS))
+           entry.flags &= ~VLF_ROEXISTS;
        if (entry.nServers < 1) {       /*this is the last ref */
            VPRINT1("Deleting the VLDB entry for %u ...", volid);
            fflush(STDOUT);
@@ -5851,8 +6021,8 @@ CheckVolume(volintInfo * volumeinfo, afs_uint32 aserver, afs_int32 apart,
        if (createentry) {
            fprintf(STDOUT, "\n**does not exist**\n");
        } else {
-           if ((entry.flags & RW_EXISTS) || (entry.flags & RO_EXISTS)
-               || (entry.flags & BACK_EXISTS))
+           if ((entry.flags & VLF_RWEXISTS) || (entry.flags & VLF_ROEXISTS)
+               || (entry.flags & VLF_BACKEXISTS))
                EnumerateEntry(&entry);
        }
        fprintf(STDOUT, "\n");
@@ -5879,7 +6049,7 @@ CheckVolume(volintInfo * volumeinfo, afs_uint32 aserver, afs_int32 apart,
            } else {            /* RW index found in the VLDB entry. */
                /* Verify if this volume's location matches where the VLDB says it is */
                if (!Lp_Match(aserver, apart, &entry)) {
-                   if (entry.flags & RW_EXISTS) {
+                   if (entry.flags & VLF_RWEXISTS) {
                        /* The RW volume exists elsewhere - report this one a duplicate */
                        if (pass == 1) {
                            MapPartIdIntoName(apart, pname);
@@ -5905,7 +6075,7 @@ CheckVolume(volintInfo * volumeinfo, afs_uint32 aserver, afs_int32 apart,
                        addvolume++;
 
                        /* Check for orphaned BK volume on old partition */
-                       if (entry.flags & BACK_EXISTS) {
+                       if (entry.flags & VLF_BACKEXISTS) {
                            if (pass == 1) {
                                MapPartIdIntoName(entry.serverPartition[idx],
                                                  pname);
@@ -5943,14 +6113,14 @@ CheckVolume(volintInfo * volumeinfo, afs_uint32 aserver, afs_int32 apart,
        }
 
        if (addvolume) {
-           entry.flags |= RW_EXISTS;
+           entry.flags |= VLF_RWEXISTS;
            entry.volumeId[RWVOL] = rwvolid;
            if (!entry.volumeId[BACKVOL])
                entry.volumeId[BACKVOL] = volumeinfo->backupID;
            if (!entry.volumeId[ROVOL])
                entry.volumeId[ROVOL] = volumeinfo->cloneID;
 
-           entry.serverFlags[idx] = ITSRWVOL;
+           entry.serverFlags[idx] = VLSF_RWVOL;
            entry.serverNumber[idx] = aserver;
            entry.serverPartition[idx] = apart;
            strncpy(entry.name, volumeinfo->name, VOLSER_OLDMAXVOLNAME);
@@ -6008,7 +6178,7 @@ CheckVolume(volintInfo * volumeinfo, afs_uint32 aserver, afs_int32 apart,
                    }
                } else {
                    if (volumeinfo->volid != entry.volumeId[BACKVOL]) {
-                       if (!(entry.flags & BACK_EXISTS)) {
+                       if (!(entry.flags & VLF_BACKEXISTS)) {
                            addvolume++;
                        } else if (volumeinfo->volid >
                                   entry.volumeId[BACKVOL]) {
@@ -6051,13 +6221,13 @@ CheckVolume(volintInfo * volumeinfo, afs_uint32 aserver, afs_int32 apart,
            }
        }
        if (addvolume) {
-           entry.flags |= BACK_EXISTS;
+           entry.flags |= VLF_BACKEXISTS;
            entry.volumeId[RWVOL] = rwvolid;
            entry.volumeId[BACKVOL] = volumeinfo->volid;
 
            entry.serverNumber[idx] = aserver;
            entry.serverPartition[idx] = apart;
-           entry.serverFlags[idx] = ITSBACKVOL;
+           entry.serverFlags[idx] = VLSF_RWVOL;
 
            modified++;
        }
@@ -6075,7 +6245,7 @@ CheckVolume(volintInfo * volumeinfo, afs_uint32 aserver, afs_int32 apart,
                entry.nServers++;
                addvolume++;
            } else {
-               if (!(entry.flags & RO_EXISTS)) {
+               if (!(entry.flags & VLF_ROEXISTS)) {
                    addvolume++;
                }
            }
@@ -6089,7 +6259,7 @@ CheckVolume(volintInfo * volumeinfo, afs_uint32 aserver, afs_int32 apart,
            if (mod)
                modified++;
 
-           if (!(entry.flags & RO_EXISTS)) {
+           if (!(entry.flags & VLF_ROEXISTS)) {
                /* No RO exists in the VLDB entry - add this one */
                idx = entry.nServers;
                entry.nServers++;
@@ -6100,7 +6270,7 @@ CheckVolume(volintInfo * volumeinfo, afs_uint32 aserver, afs_int32 apart,
                 * all the RO volumes listed in VLDB entry and add this volume.
                 */
                for (j = 0; j < entry.nServers; j++) {
-                   if (entry.serverFlags[j] & ITSROVOL) {
+                   if (entry.serverFlags[j] & VLSF_ROVOL) {
                        /* Verify this volume exists and print message we are orphaning it */
                        if (pass == 1) {
                            MapPartIdIntoName(apart, pname);
@@ -6159,13 +6329,13 @@ CheckVolume(volintInfo * volumeinfo, afs_uint32 aserver, afs_int32 apart,
        }
 
        if (addvolume) {
-           entry.flags |= RO_EXISTS;
+           entry.flags |= VLF_ROEXISTS;
            entry.volumeId[RWVOL] = rwvolid;
            entry.volumeId[ROVOL] = volumeinfo->volid;
 
            entry.serverNumber[idx] = aserver;
            entry.serverPartition[idx] = apart;
-           entry.serverFlags[idx] = ITSROVOL;
+           entry.serverFlags[idx] = VLSF_ROVOL;
 
            modified++;
        }
@@ -6318,8 +6488,8 @@ UV_SyncVolume(afs_uint32 aserver, afs_int32 apart, char *avolname, int flags)
        if (vcode) {
            fprintf(STDOUT, "\n**does not exist**\n");
        } else {
-           if ((vldbentry.flags & RW_EXISTS) || (vldbentry.flags & RO_EXISTS)
-               || (vldbentry.flags & BACK_EXISTS))
+           if ((vldbentry.flags & VLF_RWEXISTS) || (vldbentry.flags & VLF_ROEXISTS)
+               || (vldbentry.flags & VLF_BACKEXISTS))
                EnumerateEntry(&vldbentry);
        }
        fprintf(STDOUT, "\n");
@@ -6685,12 +6855,12 @@ CheckVldbRWBK(struct nvldbentry * entry, afs_int32 * modified)
        *modified = 0;
     idx = Lp_GetRwIndex(entry);
 
-    /* Check to see if the RW volume exists and set the RW_EXISTS
+    /* Check to see if the RW volume exists and set the VLF_RWEXISTS
      * flag accordingly.
      */
     if (idx == -1) {           /* Did not find a RW entry */
-       if (entry->flags & RW_EXISTS) { /* ... yet entry says RW exists */
-           entry->flags &= ~RW_EXISTS; /* ... so say RW does not exist */
+       if (entry->flags & VLF_RWEXISTS) {      /* ... yet entry says RW exists */
+           entry->flags &= ~VLF_RWEXISTS;      /* ... so say RW does not exist */
            modentry++;
        }
     } else {
@@ -6698,18 +6868,18 @@ CheckVldbRWBK(struct nvldbentry * entry, afs_int32 * modified)
            VolumeExists(entry->serverNumber[idx],
                         entry->serverPartition[idx], entry->volumeId[RWVOL]);
        if (code == 0) {        /* RW volume exists */
-           if (!(entry->flags & RW_EXISTS)) {  /* ... yet entry says RW does not exist */
-               entry->flags |= RW_EXISTS;      /* ... so say RW does exist */
+           if (!(entry->flags & VLF_RWEXISTS)) {       /* ... yet entry says RW does not exist */
+               entry->flags |= VLF_RWEXISTS;   /* ... so say RW does exist */
                modentry++;
            }
        } else if (code == ENODEV) {    /* RW volume does not exist */
-           if (entry->flags & RW_EXISTS) {     /* ... yet entry says RW exists */
-               entry->flags &= ~RW_EXISTS;     /* ... so say RW does not exist */
+           if (entry->flags & VLF_RWEXISTS) {  /* ... yet entry says RW exists */
+               entry->flags &= ~VLF_RWEXISTS;  /* ... so say RW does not exist */
                modentry++;
            }
        } else {
            /* If VLDB says it didn't exist, then ignore error */
-           if (entry->flags & RW_EXISTS) {
+           if (entry->flags & VLF_RWEXISTS) {
                MapPartIdIntoName(entry->serverPartition[idx], pname);
                fprintf(STDERR,
                        "Transaction call failed for RW volume %u on server %s %s\n",
@@ -6723,12 +6893,12 @@ CheckVldbRWBK(struct nvldbentry * entry, afs_int32 * modified)
        }
     }
 
-    /* Check to see if the BK volume exists and set the BACK_EXISTS
+    /* Check to see if the BK volume exists and set the VLF_BACKEXISTS
      * flag accordingly. idx already ponts to the RW entry.
      */
     if (idx == -1) {           /* Did not find a RW entry */
-       if (entry->flags & BACK_EXISTS) {       /* ... yet entry says BK exists */
-           entry->flags &= ~BACK_EXISTS;       /* ... so say BK does not exist */
+       if (entry->flags & VLF_BACKEXISTS) {    /* ... yet entry says BK exists */
+           entry->flags &= ~VLF_BACKEXISTS;    /* ... so say BK does not exist */
            modentry++;
        }
     } else {                   /* Found a RW entry */
@@ -6737,18 +6907,18 @@ CheckVldbRWBK(struct nvldbentry * entry, afs_int32 * modified)
                         entry->serverPartition[idx],
                         entry->volumeId[BACKVOL]);
        if (code == 0) {        /* BK volume exists */
-           if (!(entry->flags & BACK_EXISTS)) {        /* ... yet entry says BK does not exist */
-               entry->flags |= BACK_EXISTS;    /* ... so say BK does exist */
+           if (!(entry->flags & VLF_BACKEXISTS)) {     /* ... yet entry says BK does not exist */
+               entry->flags |= VLF_BACKEXISTS; /* ... so say BK does exist */
                modentry++;
            }
        } else if (code == ENODEV) {    /* BK volume does not exist */
-           if (entry->flags & BACK_EXISTS) {   /* ... yet entry says BK exists */
-               entry->flags &= ~BACK_EXISTS;   /* ... so say BK does not exist */
+           if (entry->flags & VLF_BACKEXISTS) {        /* ... yet entry says BK exists */
+               entry->flags &= ~VLF_BACKEXISTS;        /* ... so say BK does not exist */
                modentry++;
            }
        } else {
            /* If VLDB says it didn't exist, then ignore error */
-           if (entry->flags & BACK_EXISTS) {
+           if (entry->flags & VLF_BACKEXISTS) {
                MapPartIdIntoName(entry->serverPartition[idx], pname);
                fprintf(STDERR,
                        "Transaction call failed for BK volume %u on server %s %s\n",
@@ -6765,8 +6935,8 @@ CheckVldbRWBK(struct nvldbentry * entry, afs_int32 * modified)
     /* If there is an idx but the BK and RW volumes no
      * longer exist, then remove the RW entry.
      */
-    if ((idx != -1) && !(entry->flags & RW_EXISTS)
-       && !(entry->flags & BACK_EXISTS)) {
+    if ((idx != -1) && !(entry->flags & VLF_RWEXISTS)
+       && !(entry->flags & VLF_BACKEXISTS)) {
        Lp_SetRWValue(entry, entry->serverNumber[idx],
                      entry->serverPartition[idx], 0L, 0L);
        entry->nServers--;
@@ -6791,11 +6961,11 @@ CheckVldbRO(struct nvldbentry *entry, afs_int32 * modified)
     if (modified)
        *modified = 0;
 
-    /* Check to see if the RO volumes exist and set the RO_EXISTS
+    /* Check to see if the RO volumes exist and set the VLF_ROEXISTS
      * flag accordingly.
      */
     for (idx = 0; idx < entry->nServers; idx++) {
-       if (!(entry->serverFlags[idx] & ITSROVOL)) {
+       if (!(entry->serverFlags[idx] & VLSF_ROVOL)) {
            continue;           /* not a RO */
        }
 
@@ -6823,13 +6993,13 @@ CheckVldbRO(struct nvldbentry *entry, afs_int32 * modified)
     }
 
     if (foundro) {             /* A RO volume exists */
-       if (!(entry->flags & RO_EXISTS)) {      /* ... yet entry says RW does not exist */
-           entry->flags |= RO_EXISTS;  /* ... so say RW does exist */
+       if (!(entry->flags & VLF_ROEXISTS)) {   /* ... yet entry says RW does not exist */
+           entry->flags |= VLF_ROEXISTS;       /* ... so say RW does exist */
            modentry++;
        }
     } else {                   /* A RO volume does not exist */
-       if (entry->flags & RO_EXISTS) { /* ... yet entry says RO exists */
-           entry->flags &= ~RO_EXISTS; /* ... so say RO does not exist */
+       if (entry->flags & VLF_ROEXISTS) {      /* ... yet entry says RO exists */
+           entry->flags &= ~VLF_ROEXISTS;      /* ... so say RO does not exist */
            modentry++;
        }
     }
@@ -6859,8 +7029,8 @@ CheckVldb(struct nvldbentry * entry, afs_int32 * modified, afs_int32 * deleted)
     if (verbose) {
        fprintf(STDOUT, "_______________________________\n");
        fprintf(STDOUT, "\n-- status before -- \n");
-       if ((entry->flags & RW_EXISTS) || (entry->flags & RO_EXISTS)
-           || (entry->flags & BACK_EXISTS))
+       if ((entry->flags & VLF_RWEXISTS) || (entry->flags & VLF_ROEXISTS)
+           || (entry->flags & VLF_BACKEXISTS))
            EnumerateEntry(entry);
        fprintf(STDOUT, "\n");
     }
@@ -6923,8 +7093,8 @@ CheckVldb(struct nvldbentry * entry, afs_int32 * modified, afs_int32 * deleted)
        if (pass == 1)
            goto retry;
 
-       if (!(entry->flags & RW_EXISTS) && !(entry->flags & BACK_EXISTS)
-           && !(entry->flags & RO_EXISTS) && doit) {
+       if (!(entry->flags & VLF_RWEXISTS) && !(entry->flags & VLF_BACKEXISTS)
+           && !(entry->flags & VLF_ROEXISTS) && doit) {
            /* The RW, BK, nor RO volumes do not exist. Delete the VLDB entry */
            code =
                ubik_VL_DeleteEntry(cstruct, 0, entry->volumeId[RWVOL],
@@ -7134,7 +7304,7 @@ UV_RenameVolume(struct nvldbentry *entry, char oldname[], char newname[])
     VPRINT1("Recorded the new name %s in VLDB\n", newname);
     /*at this stage the intent to rename is recorded in the vldb, as far as the vldb
      * is concerned, oldname is lost */
-    if (entry->flags & RW_EXISTS) {
+    if (entry->flags & VLF_RWEXISTS) {
        index = Lp_GetRwIndex(entry);
        if (index == -1) {      /* there is a serious discrepancy */
            fprintf(STDERR,
@@ -7184,7 +7354,7 @@ UV_RenameVolume(struct nvldbentry *entry, char oldname[], char newname[])
        aconn = (struct rx_connection *)0;
     }
     /*end rw volume processing */
-    if (entry->flags & BACK_EXISTS) {  /*process the backup volume */
+    if (entry->flags & VLF_BACKEXISTS) {       /*process the backup volume */
        index = Lp_GetRwIndex(entry);
        if (index == -1) {      /* there is a serious discrepancy */
            fprintf(STDERR,
@@ -7241,9 +7411,9 @@ UV_RenameVolume(struct nvldbentry *entry, char oldname[], char newname[])
     if (aconn)
        rx_DestroyConnection(aconn);
     aconn = (struct rx_connection *)0;
-    if (entry->flags & RO_EXISTS) {    /*process the ro volumes */
+    if (entry->flags & VLF_ROEXISTS) { /*process the ro volumes */
        for (i = 0; i < entry->nServers; i++) {
-           if (entry->serverFlags[i] & ITSROVOL) {
+           if (entry->serverFlags[i] & VLSF_ROVOL) {
                aconn = UV_Bind(entry->serverNumber[i], AFSCONF_VOLUMEPORT);
                code =
                    AFSVolTransCreate_retry(aconn, entry->volumeId[ROVOL],