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 */