/*
* Copyright 2000, International Business Machines Corporation and others.
* All Rights Reserved.
- *
+ *
* This software has been released under the terms of the IBM Public
* License. For details, see the LICENSE file in the top-level source
* directory or online at http://www.openafs.org/dl/license10.html
void *cookie, manyResults * results);
static afs_int32 CheckVolume(volintInfo * volumeinfo, afs_uint32 aserver,
afs_int32 apart, afs_int32 * modentry,
- afs_uint32 * maxvolid);
+ afs_uint32 * maxvolid, struct nvldbentry *aentry);
/*map the partition <partId> into partition name <partName>*/
break;
default:
{
-
- afs_int32 offset;
-
initialize_KA_error_table();
initialize_RXK_error_table();
initialize_KTC_error_table();
initialize_CMD_error_table();
initialize_VL_error_table();
- offset = errcode & ((1 << ERRCODE_RANGE) - 1);
fprintf(STDERR, "%s: %s\n", afs_error_table_name(errcode),
afs_error_message(errcode));
break;
static int uvindex = -1;
/* called by VLDBClient_Init to set the security module to be used in the RPC */
int
-UV_SetSecurity(register struct rx_securityClass *as, afs_int32 aindex)
+UV_SetSecurity(struct rx_securityClass *as, afs_int32 aindex)
{
uvindex = aindex;
uvclass = as;
struct rx_connection *
UV_Bind(afs_uint32 aserver, afs_int32 port)
{
- register struct rx_connection *tc;
+ struct rx_connection *tc;
tc = rx_NewConnection(aserver, htons(port), VOLSERVICE_ID, uvclass,
uvindex);
return tc;
}
-static int
+static int
AFSVolCreateVolume_retry(struct rx_connection *z_conn,
afs_int32 partition, char *name, afs_int32 type,
afs_int32 parent, afs_uint32 *volid, afs_int32 *trans)
return code;
}
-static int
+static int
AFSVolTransCreate_retry(struct rx_connection *z_conn,
- afs_int32 volume, afs_int32 partition,
- afs_int32 flags, afs_int32 * trans)
+ afs_int32 volume, afs_int32 partition,
+ afs_int32 flags, afs_int32 * trans)
{
afs_int32 code;
int retries = 3;
for (i = 0; i < entry->nServers; i++) {
MapPartIdIntoName(entry->serverPartition[i], pname);
fprintf(STDOUT, " server %s partition %s ",
- noresolve ? afs_inet_ntoa_r(entry->serverNumber[i], hoststr) :
+ noresolve ? afs_inet_ntoa_r(entry->serverNumber[i], hoststr) :
hostutil_GetNameByINet(entry->serverNumber[i]), pname);
if (entry->serverFlags[i] & ITSRWVOL)
fprintf(STDOUT, "RW Site ");
int
UV_NukeVolume(afs_uint32 server, afs_int32 partid, afs_uint32 volid)
{
- register struct rx_connection *tconn;
- register afs_int32 code;
+ struct rx_connection *tconn;
+ afs_int32 code;
tconn = UV_Bind(server, AFSCONF_VOLUMEPORT);
if (tconn) {
UV_PartitionInfo64(afs_uint32 server, char *pname,
struct diskPartition64 *partition)
{
- register struct rx_connection *aconn;
+ struct rx_connection *aconn;
afs_int32 code = 0;
aconn = (struct rx_connection *)0;
aconn = UV_Bind(server, AFSCONF_VOLUMEPORT);
code = AFSVolPartitionInfo64(aconn, pname, partition);
if (code == RXGEN_OPCODE) {
- struct diskPartition *dpp =
+ struct diskPartition *dpp =
(struct diskPartition *)malloc(sizeof(struct diskPartition));
code = AFSVolPartitionInfo(aconn, pname, dpp);
if (!code) {
partition->minFree = dpp->minFree;
}
free(dpp);
- }
+ }
if (code) {
fprintf(STDERR, "Could not get information on partition %s\n", pname);
PrintError("", code);
afs_int32 aspare3, afs_int32 aspare4, afs_uint32 * anewid,
afs_uint32 * aroid, afs_uint32 * abkid)
{
- register struct rx_connection *aconn;
+ struct rx_connection *aconn;
afs_int32 tid;
- register afs_int32 code;
+ afs_int32 code;
afs_int32 error;
afs_int32 rcode, vcode;
afs_int32 lastid;
/* set up the vldb entry for this volume */
strncpy(entry.name, aname, VOLSER_OLDMAXVOLNAME);
entry.nServers = 1;
- entry.serverNumber[0] = aserver; /* this should have another
+ entry.serverNumber[0] = aserver; /* this should have another
* level of indirection later */
- entry.serverPartition[0] = apart; /* this should also have
+ 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 */
UV_AddVLDBEntry(afs_uint32 aserver, afs_int32 apart, char *aname,
afs_uint32 aid)
{
- register struct rx_connection *aconn;
+ struct rx_connection *aconn;
afs_int32 error;
afs_int32 vcode;
struct nvldbentry entry, storeEntry; /*the new vldb entry */
/* set up the vldb entry for this volume */
strncpy(entry.name, aname, VOLSER_OLDMAXVOLNAME);
entry.nServers = 1;
- entry.serverNumber[0] = aserver; /* this should have another
+ entry.serverNumber[0] = aserver; /* this should have another
* level of indirection later */
- entry.serverPartition[0] = apart; /* this should also have
+ 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 */
}
/* Delete the volume <volid>on <aserver> <apart>
- * the physical entry gets removed from the vldb only if the ref count
+ * the physical entry gets removed from the vldb only if the ref count
* becomes zero
*/
int
else if (avolid == entry.volumeId[ROVOL]) {
/* Its a read-only volume, modify the VLDB entry. Check that the
* readonly volume is on the server/partition we asked to delete.
- * If flags does not have RO_EIXSTS set, then this may mean the RO
+ * If flags does not have RO_EIXSTS set, then this may mean the RO
* hasn't been released (and could exist in VLDB).
*/
if (!Lp_ROMatch(aserver, apart, &entry)) {
if (islocked) {
code =
ubik_VL_ReleaseLock(cstruct, 0, avolid, -1,
- (LOCKREL_OPCODE | LOCKREL_AFSID |
+ (LOCKREL_OPCODE | LOCKREL_AFSID |
LOCKREL_TIMESTAMP));
if (code) {
EPRINT1(code,
/* Move volume <afromvol> on <afromserver> <afrompart> to <atoserver>
* <atopart>. The operation is almost idempotent. The following
* flags are recognized:
- *
+ *
* RV_NOCLONE - don't use a copy clone
*/
afs_int32 tmp;
afs_uint32 tmpVol;
struct restoreCookie cookie;
- register afs_int32 vcode, code;
+ afs_int32 vcode, code;
struct volser_status tstatus;
struct destServer destination;
}
/* From-info matches the vldb info about volid,
- * its ok start the move operation, the backup volume
- * on the old site is deleted in the process
+ * its ok start the move operation, the backup volume
+ * on the old site is deleted in the process
*/
if (afrompart == atopart) {
same = VLDB_IsSameAddrs(afromserver, atoserver, &error);
}
MapHostToNetwork(&entry);
- /* Delete either the volume on the source location or the target location.
+ /* Delete either the volume on the source location or the target location.
* If the vldb entry still points to the source location, then we know the
- * volume move didn't finish so we remove the volume from the target
+ * volume move didn't finish so we remove the volume from the target
* location. Otherwise, we remove the volume from the source location.
*/
if (Lp_Match(afromserver, afrompart, &entry)) { /* didn't move - delete target volume */
* <atopart>. The new volume is named by <atovolname>. The new volume
* has ID <atovolid> if that is nonzero; otherwise a new ID is allocated
* from the VLDB. the following flags are supported:
- *
+ *
* RV_RDONLY - target volume is RO
* RV_OFFLINE - leave target volume offline
* RV_CPINCR - do incremental dump if target exists
afs_int32 rcode;
afs_int32 fromDate, cloneFromDate;
struct restoreCookie cookie;
- register afs_int32 vcode, code;
+ afs_int32 vcode, code;
afs_uint32 newVol;
afs_int32 volflag;
struct volser_status tstatus;
struct destServer destination;
struct nvldbentry entry, newentry, storeEntry;
- int islocked;
afs_int32 error;
afs_int32 tmp;
afs_uint32 tmpVol;
- int justclone = 0;
- islocked = 0;
fromconn = (struct rx_connection *)0;
toconn = (struct rx_connection *)0;
fromtid = 0;
fromconn = UV_Bind(afromserver, AFSCONF_VOLUMEPORT);
fromtid = totid = 0; /* initialize to uncreated */
-
- /* check if we can shortcut and use a local clone instead of a full copy */
- if (afromserver == atoserver && afrompart == atopart) {
- justclone = 1;
- }
-
/* ***
* clone the read/write volume locally.
* ***/
-/* Make a new backup of volume <avolid> on <aserver> and <apart>
- * if one already exists, update it
+/* Make a new backup of volume <avolid> on <aserver> and <apart>
+ * if one already exists, update it
*/
int
backupID = entry.volumeId[BACKVOL];
if (backupID == INVALID_BID) {
/* Get a backup volume id from the VLDB and update the vldb
- * entry with it.
+ * entry with it.
*/
code = ubik_VL_GetNewVolumeId(cstruct, 0, 1, &backupID);
if (code) {
}
/* Now go ahead and try to clone the RW volume.
- * First start a transaction on the RW volume
+ * First start a transaction on the RW volume
*/
code = AFSVolTransCreate_retry(aconn, avolid, apart, ITBusy, &ttid);
if (code) {
goto bfail;
}
- /* Clone or reclone the volume, depending on whether the backup
+ /* Clone or reclone the volume, depending on whether the backup
* volume exists or not
*/
if (backexists) {
return error;
}
-/* Make a new clone of volume <avolid> on <aserver> and <apart>
+/* Make a new clone of volume <avolid> on <aserver> and <apart>
* using volume ID <acloneid>, or a new ID allocated from the VLDB.
* The new volume is named by <aname>, or by appending ".clone" to
* the existing name if <aname> is NULL. The following flags are
* supported:
- *
+ *
* RV_RDONLY - target volume is RO
* RV_OFFLINE - leave target volume offline
*/
}
/* Now go ahead and try to clone the RW volume.
- * First start a transaction on the RW volume
+ * First start a transaction on the RW volume
*/
code = AFSVolTransCreate_retry(aconn, avolid, apart, ITBusy, &ttid);
if (code) {
goto bfail;
}
- /* Clone or reclone the volume, depending on whether the backup
+ /* Clone or reclone the volume, depending on whether the backup
* volume exists or not
*/
if (backexists) {
#define ONERROR0(ec, es) if (ec) { fprintf(STDERR, (es)); error = (ec); goto rfail; }
#define ERROREXIT(ec) { error = (ec); goto rfail; }
-/* Get a "transaction" on this replica. Create the volume
+/* Get a "transaction" on this replica. Create the volume
* if necessary. Return the time from which a dump should
* be made (0 if it's a new volume)
*/
}
/* Otherwise, the transaction did succeed, so get the creation date of the
- * latest RO volume on the replication site
+ * latest RO volume on the replication site
*/
else {
VPRINT2("Updating existing ro volume %u on %s ...\n", volid,
noresolve ? afs_inet_ntoa_r(vldbEntryPtr->
- serverNumber[index], hoststr) :
+ serverNumber[index], hoststr) :
hostutil_GetNameByINet(vldbEntryPtr->serverNumber[index]));
code = AFSVolGetStatus(*connPtr, *transPtr, &tstatus);
* successfully.
* forceflag: Performs a full release.
*
- * Will create a clone from the RW, then dump the clone out to
+ * 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.
manyResults results;
int rwindex, roindex, roclone, roexists;
afs_uint32 rwcrdate = 0;
- afs_uint32 rwupdate, clcrdate;
+ afs_uint32 clcrdate;
struct rtime {
int validtime;
afs_uint32 uptime;
ONERROR(code, afromvol,
"Failed to get the status of RW volume %u\n");
rwcrdate = volstatus.creationDate;
- rwupdate = volstatus.updateDate;
/* End transaction on RW */
code = AFSVolEndTrans(fromconn, fromtid, &rcode);
"Failed to get the status of the RW volume %u\n");
VDONE;
rwcrdate = volstatus.creationDate;
- rwupdate = volstatus.updateDate;
/* End the transaction on the RW volume */
VPRINT1("Ending cloning transaction on RW volume %u...", afromvol);
ONERROR(tcode, cloneVolId, "Could not bring volume %u on line\n");
/* Sleep so that a client searching for an online volume won't
- * find the clone offline and then the next RO offline while the
+ * find the clone offline and then the next RO offline while the
* release brings the clone online and the next RO offline (race).
* There is a fix in the 3.4 client that does not need this sleep
* anymore, but we don't know what clients we have.
/* Get a Transaction on this replica. Get a new connection if
* necessary. Create the volume if necessary. Return the
* time from which the dump should be made (0 if it's a new
- * volume). Each volume might have a different time.
+ * volume). Each volume might have a different time.
*/
replicas[volcount].server.destHost =
ntohl(entry.serverNumber[vldbindex]);
/* have to clear dest. flags to ensure new vol goes online:
* because the restore (forwarded) operation copied
- * the V_inService(=0) flag over to the destination.
+ * the V_inService(=0) flag over to the destination.
*/
code = AFSVolSetFlags(toconns[m], replicas[m].trans, 0);
if (code) {
/* Dump the volume <afromvol> on <afromserver> and
* <afrompart> to <afilename> starting from <fromdate>.
* DumpFunction does the real work behind the scenes after
- * extracting parameters from the rock
+ * extracting parameters from the rock
*/
int
UV_DumpVolume(afs_uint32 afromvol, afs_uint32 afromserver, afs_int32 afrompart,
fromcall = rx_NewCall(fromconn);
VEPRINT1("Starting volume dump on volume %u...", afromvol);
- if (flags & VOLDUMPV2_OMITDIRS)
+ if (flags & VOLDUMPV2_OMITDIRS)
code = StartAFSVolDumpV2(fromcall, fromtid, fromdate, flags);
else
code = StartAFSVolDump(fromcall, fromtid, fromdate);
VEPRINT1("Dumping volume %u...", afromvol);
code = DumpFunction(fromcall, rock);
- if (code == RXGEN_OPCODE)
+ if (code == RXGEN_OPCODE)
goto error_exit;
EGOTO(error_exit, code, "Error while dumping volume \n");
VEDONE;
error_exit:
if (fromcall) {
code = rx_EndCall(fromcall, rxError);
- if (code && code != RXGEN_OPCODE)
+ if (code && code != RXGEN_OPCODE)
fprintf(STDERR, "Error in rx_EndCall\n");
if (code && !error)
error = code;
}
/* Clone the volume <afromvol> on <afromserver> and
- * <afrompart>, and then dump the clone volume to
+ * <afrompart>, and then dump the clone volume to
* <afilename> starting from <fromdate>.
* DumpFunction does the real work behind the scenes after
- * extracting parameters from the rock
+ * extracting parameters from the rock
*/
int
UV_DumpClonedVolume(afs_uint32 afromvol, afs_uint32 afromserver,
fromcall = rx_NewCall(fromconn);
VEPRINT1("Starting volume dump from cloned volume %u...", clonevol);
- if (flags & VOLDUMPV2_OMITDIRS)
+ if (flags & VOLDUMPV2_OMITDIRS)
code = StartAFSVolDumpV2(fromcall, clonetid, fromdate, flags);
else
code = StartAFSVolDump(fromcall, clonetid, fromdate);
/*
* Restore a volume <tovolid> <tovolname> on <toserver> <topart> from
* the dump file <afilename>. WriteData does all the real work
- * after extracting params from the rock
+ * after extracting params from the rock
*/
int
UV_RestoreVolume2(afs_uint32 toserver, afs_int32 topart, afs_uint32 tovolid,
struct volintInfo vinfo;
char partName[10];
char tovolreal[VOLSER_OLDMAXVOLNAME];
- afs_uint32 pvolid;
+ afs_uint32 pvolid;
afs_int32 temptid, pparentid;
int success;
struct nvldbentry entry, storeEntry;
if (!pparentid) pparentid = pvolid;
/* at this point we have a volume id to use/reuse for the volume to be restored */
strncpy(tovolreal, tovolname, VOLSER_OLDMAXVOLNAME);
-
+
if (strlen(tovolname) > (VOLSER_OLDMAXVOLNAME - 1)) {
EGOTO1(refail, VOLSERBADOP,
"The volume name %s exceeds the maximum limit of (VOLSER_OLDMAXVOLNAME -1 ) bytes\n",
fprintf(STDOUT, " done\n");
fflush(STDOUT);
if (success && (!reuseID || (flags & RV_FULLRST))) {
- /* Volume was restored on the file server, update the
+ /* Volume was restored on the file server, update the
* VLDB to reflect the change.
*/
vcode = VLDB_GetEntryByID(pvolid, voltype, &entry);
tempconn =
UV_Bind(entry.serverNumber[index],
AFSCONF_VOLUMEPORT);
-
+
MapPartIdIntoName(entry.serverPartition[index],
apartName);
VPRINT3
{
afs_int32 vcode;
struct nvldbentry entry, storeEntry;
- int islocked;
vcode = ubik_VL_SetLock(cstruct, 0, volid, RWVOL, VLOP_ADDSITE);
if (vcode) {
PrintError("", vcode);
return (vcode);
}
- islocked = 1;
vcode = VLDB_GetEntryByID(volid, RWVOL, &entry);
if (vcode) {
fprintf(STDERR,
struct rx_connection *aconn;
struct pIDs partIds;
struct partEntries partEnts;
- register int i, j = 0, code;
+ int i, j = 0, code;
*cntp = 0;
aconn = UV_Bind(aserver, AFSCONF_VOLUMEPORT);
return 0;
}
-/*return a list of clones of the volumes specified by volPtrArray. Used by the
+/*return a list of clones of the volumes specified by volPtrArray. Used by the
backup system */
int
UV_GenerateVolumeClones(afs_uint32 aserver, afs_int32 apart,
}
/* CheckVolume()
- * Given a volume we read from a partition, check if it is
+ * Given a volume we read from a partition, check if it is
* represented in the VLDB correctly.
- *
+ *
* The VLDB is looked up by the RW volume id (not its name).
* The RW contains the true name of the volume (BK and RO set
* the name in the VLDB only on creation of the VLDB entry).
* We want rules strict enough that when we check all volumes
* on one partition, it does not need to be done again. IE:
- * two volumes on different partitions won't constantly
+ * two volumes on different partitions won't constantly
* change a VLDB entry away from what the other set.
- * For RW and BK volumes, we will always check the VLDB to see
+ * For RW and BK volumes, we will always check the VLDB to see
* if the two exist on the server/partition. May seem redundant,
* but this is an easy check of the VLDB. IE: if the VLDB entry
* says the BK exists but no BK volume is there, we will detect
*/
static afs_int32
CheckVolume(volintInfo * volumeinfo, afs_uint32 aserver, afs_int32 apart,
- afs_int32 * modentry, afs_uint32 * maxvolid)
+ afs_int32 * modentry, afs_uint32 * maxvolid,
+ struct nvldbentry *aentry)
{
int idx = 0;
int j;
afs_int32 code, error = 0;
struct nvldbentry entry, storeEntry;
char pname[10];
- int pass = 0, islocked = 0, createentry, addvolume, modified, mod, doit = 1;
+ int pass = 0, createentry, addvolume, modified, mod, doit = 1;
afs_uint32 rwvolid;
- char hoststr[16];
+ char hoststr[16];
if (modentry) {
if (*modentry == 1)
(unsigned long)rwvolid);
ERROR_EXIT(code);
}
- islocked = 1;
}
createentry = 0; /* Do we need to create a VLDB entry */
addvolume = 0; /* Add this volume to the VLDB entry */
modified = 0; /* The VLDB entry was modified */
- /* Read the entry from VLDB by its RW volume id */
- code = VLDB_GetEntryByID(rwvolid, RWVOL, &entry);
- if (code) {
- if (code != VL_NOENT) {
- fprintf(STDOUT,
- "Could not retreive the VLDB entry for volume %lu \n",
- (unsigned long)rwvolid);
- ERROR_EXIT(code);
- }
+ if (aentry) {
+ memcpy(&entry, aentry, sizeof(entry));
+ } else {
+ /* Read the entry from VLDB by its RW volume id */
+ code = VLDB_GetEntryByID(rwvolid, RWVOL, &entry);
+ if (code) {
+ if (code != VL_NOENT) {
+ fprintf(STDOUT,
+ "Could not retreive the VLDB entry for volume %lu \n",
+ (unsigned long)rwvolid);
+ ERROR_EXIT(code);
+ }
- memset(&entry, 0, sizeof(entry));
- vsu_ExtractName(entry.name, volumeinfo->name); /* Store name of RW */
+ memset(&entry, 0, sizeof(entry));
+ vsu_ExtractName(entry.name, volumeinfo->name); /* Store name of RW */
- createentry = 1;
- } else {
- MapHostToNetwork(&entry);
+ createentry = 1;
+ } else {
+ MapHostToNetwork(&entry);
+ }
}
if (verbose && (pass == 1)) {
fprintf(STDERR,
" VLDB reports RW volume %lu exists on %s %s\n",
(unsigned long)rwvolid,
- noresolve ?
+ noresolve ?
afs_inet_ntoa_r(entry.serverNumber[idx], hoststr) :
hostutil_GetNameByINet(entry.
serverNumber[idx]),
fprintf(STDERR,
" VLDB reports its RW volume %lu exists on %s %s\n",
(unsigned long)rwvolid,
- noresolve ?
+ noresolve ?
afs_inet_ntoa_r(aserver, hoststr) :
hostutil_GetNameByINet(aserver),
pname);
else if (volumeinfo->type == ROVOL) { /* A RO volume */
if (volumeinfo->volid == entry.volumeId[ROVOL]) {
- /* This is a quick check to see if the RO entry exists in the
+ /* This is a quick check to see if the RO entry exists in the
* VLDB so we avoid the CheckVldbRO() call (which checks if each
* RO volume listed in the VLDB exists).
*/
ERROR_EXIT(code);
}
}
- if (modentry)
- *modentry = modified;
} else if (pass == 2) {
code =
ubik_VL_ReleaseLock(cstruct, 0, rwvolid, RWVOL,
}
}
- if (verbose && doit) {
+ if (modified && modentry) {
+ *modentry = 1;
+ }
+
+ if (aentry) {
+ memcpy(aentry, &entry, sizeof(entry));
+ }
+
+ if (verbose) {
fprintf(STDOUT, "-- status after --\n");
if (modified)
EnumerateEntry(&entry);
struct rx_connection *aconn = 0;
afs_int32 j, k, code, vcode, error = 0;
afs_int32 tverbose;
- afs_int32 mod, modified = 0;
+ afs_int32 mod, modified = 0, deleted = 0;
struct nvldbentry vldbentry;
afs_uint32 volumeid = 0;
volEntries volumeInfo;
struct partList PartList;
- afs_int32 pcnt, rv;
+ afs_int32 pcnt;
afs_uint32 maxvolid = 0;
volumeInfo.volEntries_val = (volintInfo *) 0;
/* Turn verbose logging off and do our own verbose logging */
/* tverbose must be set before we call ERROR_EXIT() */
-
+
tverbose = verbose;
- if (flags & 2)
+ if (flags & 2)
tverbose = 1;
verbose = 0;
fprintf(STDOUT, "\n");
}
- /* Verify that all of the VLDB entries exist on the repective servers
+ /* Verify that all of the VLDB entries exist on the repective servers
* and partitions (this does not require that avolname be a volume ID).
* Equivalent to a syncserv.
*/
mod = 1;
else
mod = 0;
- code = CheckVldb(&vldbentry, &mod);
+ code = CheckVldb(&vldbentry, &mod, &deleted);
if (code) {
fprintf(STDERR, "Could not process VLDB entry for volume %s\n",
vldbentry.name);
/* Found one, sync it with VLDB entry */
code =
CheckVolume(volumeInfo.volEntries_val, aserver,
- PartList.partId[j], &mod, &maxvolid);
+ PartList.partId[j], &mod, &maxvolid, &vldbentry);
if (code)
ERROR_EXIT(code);
if (mod)
/* Check to see if the RW, BK, and RO IDs exist on any
* partitions. We get the volume IDs from the VLDB.
*/
- rv = 1; /* Read the VLDB entry ? */
for (j = 0; j < MAXTYPES; j++) { /* for RW, RO, and BK IDs */
- if (rv) {
- vcode = VLDB_GetEntryByName(avolname, &vldbentry);
- if (vcode) {
- if (vcode == VL_NOENT)
- break;
- fprintf(STDERR,
- "Could not access the VLDB for volume %s\n",
- avolname);
- ERROR_EXIT(vcode);
- }
- rv = 0;
- }
-
if (vldbentry.volumeId[j] == 0)
continue;
/* Found one, sync it with VLDB entry */
code =
CheckVolume(volumeInfo.volEntries_val, aserver,
- PartList.partId[k], &mod, &maxvolid);
+ PartList.partId[k], &mod, &maxvolid, &vldbentry);
if (code)
ERROR_EXIT(code);
if (mod)
- modified++, rv++;
+ modified++;
}
if (volumeInfo.volEntries_val)
/* if (aserver) */
/* If verbose output, print a summary of what changed */
- if (tverbose && !(flags & 2)) {
+ if (tverbose) {
fprintf(STDOUT, "-- status after --\n");
- code = VLDB_GetEntryByName(avolname, &vldbentry);
- if (code && (code != VL_NOENT)) {
- fprintf(STDERR, "Could not access the VLDB for volume %s\n",
- avolname);
- ERROR_EXIT(code);
- }
- if (modified && (code == VL_NOENT)) {
+ if (deleted) {
fprintf(STDOUT, "\n**entry deleted**\n");
} else if (modified) {
- MapHostToNetwork(&vldbentry);
EnumerateEntry(&vldbentry);
} else {
fprintf(STDOUT, "\n**no change**\n");
modified = 1;
else
modified = 0;
- code = CheckVolume(vi, aserver, apart, &modified, &maxvolid);
+ code = CheckVolume(vi, aserver, apart, &modified, &maxvolid, NULL);
if (code) {
PrintError("", code);
failures++;
} /* thru all partitions */
if (flags & 2) {
- VPRINT3("Total entries: %u, Failed to process %d, Would change %d\n",
+ VPRINT3("Total entries: %u, Failed to process %d, Would change %d\n",
tentries, failures, modifications);
} else {
- VPRINT3("Total entries: %u, Failed to process %d, Changed %d\n",
+ VPRINT3("Total entries: %u, Failed to process %d, Changed %d\n",
tentries, failures, modifications);
}
*modified = 0;
/* Check to see if the RO volumes exist and set the RO_EXISTS
- * flag accordingly.
+ * flag accordingly.
*/
for (idx = 0; idx < entry->nServers; idx++) {
if (!(entry->serverFlags[idx] & ITSROVOL)) {
* Ensure that <entry> matches with the info on file servers
*/
afs_int32
-CheckVldb(struct nvldbentry * entry, afs_int32 * modified)
+CheckVldb(struct nvldbentry * entry, afs_int32 * modified, afs_int32 * deleted)
{
afs_int32 code, error = 0;
struct nvldbentry storeEntry;
int pass = 0, doit=1;
if (modified) {
- if (*modified == 1)
+ if (*modified == 1)
doit = 0;
*modified = 0;
}
if (mod)
modentry++;
- /* The VLDB entry has been updated. If it as been modified, then
+ /* The VLDB entry has been updated. If it as been modified, then
* write the entry back out the the VLDB.
*/
if (modentry && doit) {
ERROR_EXIT(code);
}
}
- if (modified)
- *modified = 1;
islocked = 0;
}
- if (verbose && doit) {
+ if (modified && modentry) {
+ *modified = 1;
+ }
+ if (deleted && delentry) {
+ *deleted = 1;
+ }
+
+ if (verbose) {
fprintf(STDOUT, "-- status after --\n");
if (delentry)
fprintf(STDOUT, "\n**entry deleted**\n");
struct nvldbentry *vlentry;
afs_int32 si, nsi, j;
- if (flags & 2)
+ if (flags & 2)
verbose = 1;
aconn = UV_Bind(aserver, AFSCONF_VOLUMEPORT);
modified = 1;
else
modified = 0;
- code = CheckVldb(vlentry, &modified);
+ code = CheckVldb(vlentry, &modified, NULL);
if (code) {
PrintError("", code);
fprintf(STDERR,
VPRINT3("Total entries: %u, Failed to process %d, Would change %d\n",
tentries, failures, modifications);
} else {
- VPRINT3("Total entries: %u, Failed to process %d, Changed %d\n",
+ VPRINT3("Total entries: %u, Failed to process %d, Changed %d\n",
tentries, failures, modifications);
}
return error;
}
-/*rename volume <oldname> to <newname>, changing the names of the related
+/*rename volume <oldname> to <newname>, changing the names of the related
*readonly and backup volumes. This operation is also idempotent.
*salvager is capable of recovering from rename operation stopping halfway.
*to recover run syncserver on the affected machines,it will force renaming to completion. name clashes should have been detected before calling this proc */
goto rvfail;
}
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
+ /*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) {
index = Lp_GetRwIndex(entry);