static int (*checkSecurityProc)(void *, struct rx_call *) = NULL;
static void *securityRock = NULL;
+struct version_data version_globals;
+
#define CStampVersion 1 /* meaning set ts->version */
static_inline struct rx_connection *
DBRELE(dbase);
return code;
}
+ UBIK_VERSION_LOCK;
if (readAny) {
tt->flags |= TRREADANY;
if (readAny > 1) {
udisk_abort(tt);
ContactQuorum_NoArguments(DISK_Abort, tt, 0); /* force aborts to the others */
udisk_end(tt);
+ UBIK_VERSION_UNLOCK;
DBRELE(dbase);
return code;
}
}
*transPtr = tt;
+ UBIK_VERSION_UNLOCK;
DBRELE(dbase);
return 0;
}
if (transPtr->type != UBIK_WRITETRANS)
return UBADTYPE;
+
+ DBHOLD(transPtr->dbase);
if (!transPtr->iovec_info.iovec_wrt_len
- || !transPtr->iovec_info.iovec_wrt_val)
+ || !transPtr->iovec_info.iovec_wrt_val) {
+ DBRELE(transPtr->dbase);
return 0;
+ }
- DBHOLD(transPtr->dbase);
if (!urecovery_AllBetter(transPtr->dbase, transPtr->flags & TRREADANY))
ERROR_EXIT(UNOQUORUM);
if (!ubeacon_AmSyncSite()) /* only sync site can write */
return 0;
}
+ DBHOLD(transPtr->dbase);
if (!transPtr->iovec_info.iovec_wrt_val) {
transPtr->iovec_info.iovec_wrt_len = 0;
transPtr->iovec_info.iovec_wrt_val =
if (transPtr->iovec_data.iovec_buf_val)
free(transPtr->iovec_data.iovec_buf_val);
transPtr->iovec_data.iovec_buf_val = 0;
+ DBRELE(transPtr->dbase);
return UNOMEM;
}
}
/* If this write won't fit in the structure, then flush it out and start anew */
if ((transPtr->iovec_info.iovec_wrt_len >= IOVEC_MAXWRT)
|| ((length + transPtr->iovec_data.iovec_buf_len) > IOVEC_MAXBUF)) {
+ /* Can't hold the DB lock over ubik_Flush */
+ DBRELE(transPtr->dbase);
code = ubik_Flush(transPtr);
if (code)
return (code);
+ DBHOLD(transPtr->dbase);
}
- DBHOLD(transPtr->dbase);
if (!urecovery_AllBetter(transPtr->dbase, transPtr->flags & TRREADANY))
ERROR_EXIT(UNOQUORUM);
if (!ubeacon_AmSyncSite()) /* only sync site can write */
ubik_GetVersion(struct ubik_trans *atrans,
struct ubik_version *avers)
{
+ DBHOLD(atrans->dbase);
*avers = atrans->dbase->version;
+ DBRELE(atrans->dbase);
return 0;
}