From: Volker Lendecke Date: Mon, 4 Nov 2019 15:03:52 +0000 (+0100) Subject: lib: Add g_lock_wake_watchers() X-Git-Tag: ldb-2.2.0~494 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c38f37147d127672398a4a05fc731d4bb9726947;p=thirdparty%2Fsamba.git lib: Add g_lock_wake_watchers() Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/source3/include/g_lock.h b/source3/include/g_lock.h index 98321b629ec..77f01358705 100644 --- a/source3/include/g_lock.h +++ b/source3/include/g_lock.h @@ -75,5 +75,6 @@ NTSTATUS g_lock_watch_data_recv( struct tevent_req *req, bool *blockerdead, struct server_id *blocker); +void g_lock_wake_watchers(struct g_lock_ctx *ctx, TDB_DATA key); #endif diff --git a/source3/lib/g_lock.c b/source3/lib/g_lock.c index fc6232b7dc5..6898de88bc2 100644 --- a/source3/lib/g_lock.c +++ b/source3/lib/g_lock.c @@ -1241,3 +1241,38 @@ NTSTATUS g_lock_watch_data_recv( return NT_STATUS_OK; } + +static void g_lock_wake_watchers_fn( + struct db_record *rec, + TDB_DATA value, + void *private_data) +{ + struct g_lock lck = { .exclusive.pid = 0 }; + NTSTATUS status; + bool ok; + + ok = g_lock_parse(value.dptr, value.dsize, &lck); + if (!ok) { + DBG_WARNING("g_lock_parse failed\n"); + return; + } + + lck.data_seqnum += 1; + + status = g_lock_store(rec, &lck, NULL); + if (!NT_STATUS_IS_OK(status)) { + DBG_WARNING("g_lock_store failed: %s\n", nt_errstr(status)); + return; + } +} + +void g_lock_wake_watchers(struct g_lock_ctx *ctx, TDB_DATA key) +{ + NTSTATUS status; + + status = dbwrap_do_locked(ctx->db, key, g_lock_wake_watchers_fn, NULL); + if (!NT_STATUS_IS_OK(status)) { + DBG_DEBUG("dbwrap_do_locked returned %s\n", + nt_errstr(status)); + } +}