/* the rest of these guys handle remote execution of write * transactions: this is the code executed on the other servers when a * sync site is executing a write transaction. */ afs_int32 SDISK_Begin(struct rx_call *rxcall, struct ubik_tid *atid) { afs_int32 code; if ((code = ubik_CheckAuth(rxcall))) { return code; } DBHOLD(ubik_dbase); urecovery_CheckTid(atid, 1); code = udisk_begin(ubik_dbase, UBIK_WRITETRANS, &ubik_currentTrans); if (!code && ubik_currentTrans) { /* label this trans with the right trans id */ ubik_currentTrans->tid.epoch = atid->epoch; ubik_currentTrans->tid.counter = atid->counter; } DBRELE(ubik_dbase); return code; }
/* the rest of these guys handle remote execution of write * transactions: this is the code executed on the other servers when a * sync site is executing a write transaction. */ afs_int32 SDISK_Begin(struct rx_call *rxcall, struct ubik_tid *atid, afs_int32 index) { afs_int32 code; if ((code = ubik_CheckAuth(rxcall))) { return code; } if (!ubik_dbase[index]) { return ENOENT; } DBHOLD(ubik_dbase[index]); if (urecovery_AllBetter(ubik_dbase[index], 0) == 0) { code = UNOQUORUM; goto out; } urecovery_CheckTid(atid, index); if (ubik_currentTrans[index]) { /* If the thread is not waiting for lock - ok to end it */ #if !defined(UBIK_PAUSE) if (ubik_currentTrans[index]->locktype != LOCKWAIT) { #endif /* UBIK_PAUSE */ udisk_end(ubik_currentTrans[index]); #if !defined(UBIK_PAUSE) } #endif /* UBIK_PAUSE */ ubik_currentTrans[index] = (struct ubik_trans *)0; } code = udisk_begin(ubik_dbase[index], UBIK_WRITETRANS, &ubik_currentTrans[index]); if (!code && ubik_currentTrans[index]) { /* label this trans with the right trans id */ ubik_currentTrans[index]->tid.epoch = atid->epoch; ubik_currentTrans[index]->tid.counter = atid->counter; } out: DBRELE(ubik_dbase[index]); return code; }