From 5ac037294ec04f7c74aca37f9f37a445428a14a8 Mon Sep 17 00:00:00 2001 From: Marc Dionne Date: Sat, 29 Jan 2011 13:28:05 -0500 Subject: [PATCH] ubik: DB lock usage in ubik_Flush and ubik_Write ubik_Flush and ubik_Write need to hold the DB lock to use iovec_info or iovec_data Change-Id: Iadc1ff0badc744aa5fdee433bb4b591217e4b453 Reviewed-on: http://gerrit.openafs.org/4263 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Reviewed-by: Derrick Brashear --- src/ubik/ubik.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/ubik/ubik.c b/src/ubik/ubik.c index bd913ecb2..6f81eee75 100644 --- a/src/ubik/ubik.c +++ b/src/ubik/ubik.c @@ -981,11 +981,14 @@ ubik_Flush(struct ubik_trans *transPtr) 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 */ @@ -1036,6 +1039,7 @@ ubik_Write(struct ubik_trans *transPtr, void *vbuffer, 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 = @@ -1051,6 +1055,7 @@ ubik_Write(struct ubik_trans *transPtr, void *vbuffer, 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; } } @@ -1058,12 +1063,14 @@ ubik_Write(struct ubik_trans *transPtr, void *vbuffer, /* 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 */ -- 2.39.5