afs_int32 SDISK_Commit(struct rx_call *rxcall, struct ubik_tid *atid, afs_int32 index) { afs_int32 code; struct ubik_dbase *dbase; if ((code = ubik_CheckAuth(rxcall))) { return code; } if (!ubik_dbase[index]) { return ENOENT; } if (!ubik_currentTrans[index]) { return USYNC; } /* * sanity check to make sure only write trans appear here */ if (ubik_currentTrans[index]->type != UBIK_WRITETRANS) { return UBADTYPE; } dbase = ubik_currentTrans[index]->dbase; ObtainWriteLock(&dbase->cache_lock); DBHOLD(dbase); urecovery_CheckTid(atid, index); if (!ubik_currentTrans[index]) { DBRELE(dbase); ReleaseWriteLock(&dbase->cache_lock); return USYNC; } code = udisk_commit(ubik_currentTrans[index]); if (code == 0) { /* sync site should now match */ ubik_dbVersion[index] = ubik_dbase[index]->version; } DBRELE(dbase); ReleaseWriteLock(&dbase->cache_lock); return code; }
afs_int32 SDISK_Commit(struct rx_call *rxcall, struct ubik_tid *atid) { afs_int32 code; if ((code = ubik_CheckAuth(rxcall))) { return code; } ObtainWriteLock(&ubik_dbase->cache_lock); DBHOLD(ubik_dbase); if (!ubik_currentTrans) { code = USYNC; goto done; } /* * sanity check to make sure only write trans appear here */ if (ubik_currentTrans->type != UBIK_WRITETRANS) { code = UBADTYPE; goto done; } urecovery_CheckTid(atid, 0); if (!ubik_currentTrans) { code = USYNC; goto done; } code = udisk_commit(ubik_currentTrans); if (code == 0) { /* sync site should now match */ uvote_set_dbVersion(ubik_dbase->version); } done: DBRELE(ubik_dbase); ReleaseWriteLock(&ubik_dbase->cache_lock); return code; }