/* Protos for static routines */
-#if 0
-static afs_int32 CheckAndDeleteVolume(struct rx_connection *aconn,
- afs_int32 apart, afs_uint32 okvol,
- afs_uint32 delvol);
-#endif
static int GetTrans(struct nvldbentry *vldbEntryPtr, afs_int32 index,
struct rx_connection **connPtr, afs_int32 * transPtr,
afs_uint32 * crtimePtr, afs_uint32 * uptimePtr,
return code;
}
-#if 0
-/* if <okvol> is allright(indicated by beibg able to
- * start a transaction, delete the <delvol> */
-static afs_int32
-CheckAndDeleteVolume(struct rx_connection *aconn, afs_int32 apart,
- afs_uint32 okvol, afs_uint32 delvol)
-{
- afs_int32 error, code, tid, rcode;
- error = 0;
- code = 0;
-
- if (okvol == 0) {
- code = AFSVolTransCreate_retry(aconn, delvol, apart, ITOffline, &tid);
- if (!error && code)
- error = code;
- code = AFSVolDeleteVolume(aconn, tid);
- if (!error && code)
- error = code;
- code = AFSVolEndTrans(aconn, tid, &rcode);
- if (!code)
- code = rcode;
- if (!error && code)
- error = code;
- return error;
- } else {
- code = AFSVolTransCreate_retry(aconn, okvol, apart, ITOffline, &tid);
- if (!code) {
- code = AFSVolEndTrans(aconn, tid, &rcode);
- if (!code)
- code = rcode;
- if (!error && code)
- error = code;
- code = AFSVolTransCreate_retry(aconn, delvol, apart, ITOffline, &tid);
- if (!error && code)
- error = code;
- code = AFSVolDeleteVolume(aconn, tid);
- if (!error && code)
- error = code;
- code = AFSVolEndTrans(aconn, tid, &rcode);
- if (!code)
- code = rcode;
- if (!error && code)
- error = code;
- } else
- error = code;
- return error;
- }
-}
-
-#endif
-
/* called by EmuerateEntry, show vldb entry in a reasonable format */
void
SubEnumerateEntry(struct nvldbentry *entry)
int isMixed = 0;
char hoststr[16];
-#ifdef notdef
- fprintf(STDOUT, " readWriteID %-10u ", entry->volumeId[RWVOL]);
- if (entry->flags & VLF_RWEXISTS)
- fprintf(STDOUT, " valid \n");
- else
- fprintf(STDOUT, " invalid \n");
- fprintf(STDOUT, " readOnlyID %-10u ", entry->volumeId[ROVOL]);
- if (entry->flags & VLF_ROEXISTS)
- fprintf(STDOUT, " valid \n");
- else
- fprintf(STDOUT, " invalid \n");
- fprintf(STDOUT, " backUpID %-10u ", entry->volumeId[BACKVOL]);
- if (entry->flags & VLF_BACKEXISTS)
- fprintf(STDOUT, " valid \n");
- else
- fprintf(STDOUT, " invalid \n");
- if ((entry->cloneId != 0) && (entry->flags & VLF_ROEXISTS))
- fprintf(STDOUT, " releaseClone %-10u \n", entry->cloneId);
-#else
if (entry->flags & VLF_RWEXISTS)
fprintf(STDOUT, " RWrite: %-10u", entry->volumeId[RWVOL]);
if (entry->flags & VLF_ROEXISTS)
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++) {
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 */
- entry.volumeId[BACKVOL] = *anewid + 2;
-#else
entry.volumeId[ROVOL] = 0;
entry.volumeId[BACKVOL] = 0;
-#endif
entry.cloneId = 0;
/*map into right byte order, before passing to xdr, the stuff has to be in host
* byte order. Xdr converts it into network order */
}
}
+ /* volume must be inaccessible during this process */
+ code = UV_SetVolume(server, partition, volid, ITOffline, VTOutOfService, 0);
+ if (code != 0) {
+ fprintf(STDERR, "Taking RO volume %u offline failed with code %d.\n",
+ volid, code);
+ goto error_exit;
+ }
+
aconn = UV_Bind(server, AFSCONF_VOLUMEPORT);
code = AFSVolConvertROtoRWvolume(aconn, partition, volid);
if (code) {
PrintError("convertROtoRW ", code);
goto error_exit;
}
+
+ /*
+ * Since the inService flag is copied from the RO volume, the new RW copy is
+ * offline. Change the status of this RW volume to online.
+ */
+ code = UV_SetVolume(server, partition, entry->volumeId[RWVOL], ITOffline,
+ 0 /* online */, 0);
+ if (code != 0) {
+ fprintf(STDERR, "Warning: Attempt to set RW volume %u as online failed "
+ "with code %d.\n", entry->volumeId[RWVOL], code);
+ }
+
/* 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) {
}
/* or drop through */
}
-#ifdef notdef
- /* This is tricky. File server is very stupid, and if you mark the volume
- * as VTOutOfService, it may mark the *good* instance (if you're moving
- * between partitions on the same machine) as out of service. Since
- * we're cleaning this code up in DEcorum, we're just going to kludge around
- * it for now by removing this call. */
- /* already out of service, just zap it now */
- code =
- AFSVolSetFlags(fromconn, fromtid, VTDeleteOnSalvage | VTOutOfService);
- if (code) {
- fprintf(STDERR,
- "Failed to set the flags to make the old source volume offline\n");
- goto mfail;
- }
-#endif
if (atoserver != afromserver) {
/* set forwarding pointer for moved volumes */
VPRINT1("Setting forwarding pointer for volume %u ...", afromvol);
noresolve ? afs_inet_ntoa_r(toserver, hoststr) :
hostutil_GetNameByINet(toserver), partName);
fflush(STDOUT);
- code =
- AFSVolCreateVolume(toconn, topart, tovolreal, volsertype, pparentid, &pvolid,
- &totid);
- if (code) {
- if (flags & RV_FULLRST) { /* full restore: delete then create anew */
- code = DoVolDelete(toconn, pvolid, topart, "the previous", 0,
- &tstatus, NULL);
- if (code && code != VNOVOL) {
- error = code;
- goto refail;
- }
- code =
- AFSVolCreateVolume(toconn, topart, tovolreal, volsertype, pparentid,
- &pvolid, &totid);
+ /*
+ * Obtain a transaction and get the status of the target volume. Create a new
+ * volume if the target volume does not already exist.
+ */
+ memset(&tstatus, 0, sizeof(tstatus));
+ if ((flags & RV_FULLRST) != 0) {
+ /* Full restore: Delete existing volume then create anew. */
+ code = DoVolDelete(toconn, pvolid, topart, "the previous", 0, &tstatus, NULL);
+ if (code && code != VNOVOL) {
+ error = code;
+ goto refail;
+ }
+ code = AFSVolCreateVolume(toconn, topart, tovolreal, volsertype, pparentid,
+ &pvolid, &totid);
+ EGOTO1(refail, code, "Could not create new volume %u\n", pvolid);
+ } else {
+ /* Incremental restore: Obtain a transaction on the existing volume. */
+ code = AFSVolTransCreate_retry(toconn, pvolid, topart, ITOffline, &totid);
+ if (code == 0) {
+ code = AFSVolGetStatus(toconn, totid, &tstatus);
+ EGOTO1(refail, code, "Could not get timestamp from volume %u\n", pvolid);
+ } else if (code == VNOVOL) {
+ code = AFSVolCreateVolume(toconn, topart, tovolreal, volsertype,
+ pparentid, &pvolid, &totid);
EGOTO1(refail, code, "Could not create new volume %u\n", pvolid);
} else {
- code =
- AFSVolTransCreate_retry(toconn, pvolid, topart, ITOffline, &totid);
- EGOTO1(refail, code, "Failed to start transaction on %u\n",
- pvolid);
-
- code = AFSVolGetStatus(toconn, totid, &tstatus);
- EGOTO1(refail, code, "Could not get timestamp from volume %u\n",
- pvolid);
-
+ EGOTO1(refail, code, "Failed to start transaction on %u\n", pvolid);
}
- oldCreateDate = tstatus.creationDate;
- oldUpdateDate = tstatus.updateDate;
- oldCloneId = tstatus.cloneID;
- oldBackupId = tstatus.backupID;
- } else {
- oldCreateDate = 0;
- oldUpdateDate = 0;
}
+ oldCreateDate = tstatus.creationDate;
+ oldUpdateDate = tstatus.updateDate;
+ oldCloneId = tstatus.cloneID;
+ oldBackupId = tstatus.backupID;
cookie.parent = pparentid;
cookie.type = voltype;
LOCKREL_OPCODE | LOCKREL_AFSID | LOCKREL_TIMESTAMP);
return (vcode);
}
- VDONE;
+ fprintf(STDOUT, " done\n");
+ fflush(STDOUT);
}
return 0;
}