From: Volker Lendecke Date: Thu, 21 Nov 2019 14:20:07 +0000 (+0100) Subject: lib: Add g_lock_set_lock_order() X-Git-Tag: ldb-2.2.0~490 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0a043e64b639ff2d29eb052abcd894c5ee185936;p=thirdparty%2Fsamba.git lib: Add g_lock_set_lock_order() Optionally allow a database with g_lock format to participate in the dbwarp lock order check. Will be used once locking.tdb is based upon g_lock.c Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/source3/include/g_lock.h b/source3/include/g_lock.h index b44586d9123..e35ba4b2d31 100644 --- a/source3/include/g_lock.h +++ b/source3/include/g_lock.h @@ -36,6 +36,8 @@ struct g_lock_ctx *g_lock_ctx_init_backend( TALLOC_CTX *mem_ctx, struct messaging_context *msg, struct db_context **backend); +void g_lock_set_lock_order(struct g_lock_ctx *ctx, + enum dbwrap_lock_order lock_order); struct g_lock_ctx *g_lock_ctx_init(TALLOC_CTX *mem_ctx, struct messaging_context *msg); diff --git a/source3/lib/g_lock.c b/source3/lib/g_lock.c index 8789b43feee..65dc3e76f26 100644 --- a/source3/lib/g_lock.c +++ b/source3/lib/g_lock.c @@ -36,6 +36,7 @@ struct g_lock_ctx { struct db_context *db; struct messaging_context *msg; + enum dbwrap_lock_order lock_order; }; struct g_lock { @@ -193,6 +194,7 @@ struct g_lock_ctx *g_lock_ctx_init_backend( return NULL; } result->msg = msg; + result->lock_order = DBWRAP_LOCK_ORDER_NONE; result->db = db_open_watched(result, backend, msg); if (result->db == NULL) { @@ -203,6 +205,12 @@ struct g_lock_ctx *g_lock_ctx_init_backend( return result; } +void g_lock_set_lock_order(struct g_lock_ctx *ctx, + enum dbwrap_lock_order lock_order) +{ + ctx->lock_order = lock_order; +} + struct g_lock_ctx *g_lock_ctx_init(TALLOC_CTX *mem_ctx, struct messaging_context *msg) { @@ -690,7 +698,23 @@ static void g_lock_lock_retry(struct tevent_req *subreq) NTSTATUS g_lock_lock_recv(struct tevent_req *req) { - return tevent_req_simple_recv_ntstatus(req); + struct g_lock_lock_state *state = tevent_req_data( + req, struct g_lock_lock_state); + struct g_lock_ctx *ctx = state->ctx; + NTSTATUS status; + + if (tevent_req_is_nterror(req, &status)) { + return status; + } + + if ((ctx->lock_order != DBWRAP_LOCK_ORDER_NONE) && + ((state->type == G_LOCK_READ) || + (state->type == G_LOCK_WRITE))) { + const char *name = dbwrap_name(ctx->db); + dbwrap_lock_order_lock(name, ctx->lock_order); + } + + return NT_STATUS_OK; } struct g_lock_lock_simple_state { @@ -769,6 +793,10 @@ NTSTATUS g_lock_lock(struct g_lock_ctx *ctx, TDB_DATA key, return status; } if (NT_STATUS_IS_OK(state.status)) { + if (ctx->lock_order != DBWRAP_LOCK_ORDER_NONE) { + const char *name = dbwrap_name(ctx->db); + dbwrap_lock_order_lock(name, ctx->lock_order); + } return NT_STATUS_OK; } if (!NT_STATUS_EQUAL( @@ -889,6 +917,11 @@ NTSTATUS g_lock_unlock(struct g_lock_ctx *ctx, TDB_DATA key) return state.status; } + if (ctx->lock_order != DBWRAP_LOCK_ORDER_NONE) { + const char *name = dbwrap_name(ctx->db); + dbwrap_lock_order_unlock(name, ctx->lock_order); + } + return NT_STATUS_OK; }