From: Volker Lendecke Date: Wed, 29 Apr 2020 13:35:39 +0000 (+0200) Subject: lib: Add g_lock_writev_data X-Git-Tag: ldb-2.2.0~491 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6fb6a6992d959d2904baf3448a09bb3575ca91f1;p=thirdparty%2Fsamba.git lib: Add g_lock_writev_data Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/source3/include/g_lock.h b/source3/include/g_lock.h index ce811c37a5e..b44586d9123 100644 --- a/source3/include/g_lock.h +++ b/source3/include/g_lock.h @@ -49,6 +49,11 @@ NTSTATUS g_lock_lock(struct g_lock_ctx *ctx, TDB_DATA key, enum g_lock_type lock_type, struct timeval timeout); NTSTATUS g_lock_unlock(struct g_lock_ctx *ctx, TDB_DATA key); +NTSTATUS g_lock_writev_data( + struct g_lock_ctx *ctx, + TDB_DATA key, + const TDB_DATA *dbufs, + size_t num_dbufs); NTSTATUS g_lock_write_data(struct g_lock_ctx *ctx, TDB_DATA key, const uint8_t *buf, size_t buflen); diff --git a/source3/lib/g_lock.c b/source3/lib/g_lock.c index 0481c21c194..8789b43feee 100644 --- a/source3/lib/g_lock.c +++ b/source3/lib/g_lock.c @@ -892,20 +892,20 @@ NTSTATUS g_lock_unlock(struct g_lock_ctx *ctx, TDB_DATA key) return NT_STATUS_OK; } -struct g_lock_write_data_state { +struct g_lock_writev_data_state { TDB_DATA key; struct server_id self; - const uint8_t *data; - size_t datalen; + const TDB_DATA *dbufs; + size_t num_dbufs; NTSTATUS status; }; -static void g_lock_write_data_fn( +static void g_lock_writev_data_fn( struct db_record *rec, TDB_DATA value, void *private_data) { - struct g_lock_write_data_state *state = private_data; + struct g_lock_writev_data_state *state = private_data; struct g_lock lck; bool exclusive; bool ok; @@ -935,29 +935,35 @@ static void g_lock_write_data_fn( } lck.data_seqnum += 1; - lck.data = discard_const_p(uint8_t, state->data); - lck.datalen = state->datalen; - state->status = g_lock_store(rec, &lck, NULL, NULL, 0); + lck.data = NULL; + lck.datalen = 0; + state->status = g_lock_store( + rec, &lck, NULL, state->dbufs, state->num_dbufs); } -NTSTATUS g_lock_write_data(struct g_lock_ctx *ctx, TDB_DATA key, - const uint8_t *buf, size_t buflen) +NTSTATUS g_lock_writev_data( + struct g_lock_ctx *ctx, + TDB_DATA key, + const TDB_DATA *dbufs, + size_t num_dbufs) { - struct g_lock_write_data_state state = { - .key = key, .self = messaging_server_id(ctx->msg), - .data = buf, .datalen = buflen + struct g_lock_writev_data_state state = { + .key = key, + .self = messaging_server_id(ctx->msg), + .dbufs = dbufs, + .num_dbufs = num_dbufs, }; NTSTATUS status; - status = dbwrap_do_locked(ctx->db, key, - g_lock_write_data_fn, &state); + status = dbwrap_do_locked( + ctx->db, key, g_lock_writev_data_fn, &state); if (!NT_STATUS_IS_OK(status)) { DBG_WARNING("dbwrap_do_locked failed: %s\n", nt_errstr(status)); return status; } if (!NT_STATUS_IS_OK(state.status)) { - DBG_WARNING("g_lock_write_data_fn failed: %s\n", + DBG_WARNING("g_lock_writev_data_fn failed: %s\n", nt_errstr(state.status)); return state.status; } @@ -965,6 +971,16 @@ NTSTATUS g_lock_write_data(struct g_lock_ctx *ctx, TDB_DATA key, return NT_STATUS_OK; } +NTSTATUS g_lock_write_data(struct g_lock_ctx *ctx, TDB_DATA key, + const uint8_t *buf, size_t buflen) +{ + TDB_DATA dbuf = { + .dptr = discard_const_p(uint8_t, buf), + .dsize = buflen, + }; + return g_lock_writev_data(ctx, key, &dbuf, 1); +} + struct g_lock_locks_state { int (*fn)(TDB_DATA key, void *private_data); void *private_data;