1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-28 01:58:17 +03:00

lib: Allow additional dbufs in g_lock_store()

Preparation for g_lock_writev_data()

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
This commit is contained in:
Volker Lendecke 2020-04-29 15:28:03 +02:00 committed by Jeremy Allison
parent 3d0cfb82ec
commit 4f2117d687

View File

@ -123,22 +123,40 @@ static void g_lock_del_shared(struct g_lock *lck, size_t i)
static NTSTATUS g_lock_store(
struct db_record *rec,
struct g_lock *lck,
struct server_id *new_shared)
struct server_id *new_shared,
const TDB_DATA *new_dbufs,
size_t num_new_dbufs)
{
uint8_t exclusive[SERVER_ID_BUF_LENGTH];
uint8_t seqnum_buf[sizeof(uint64_t)];
uint8_t sizebuf[sizeof(uint32_t)];
uint8_t new_shared_buf[SERVER_ID_BUF_LENGTH];
struct TDB_DATA dbufs[] = {
{ .dptr = exclusive, .dsize = sizeof(exclusive) },
{ .dptr = seqnum_buf, .dsize = sizeof(seqnum_buf) },
{ .dptr = sizebuf, .dsize = sizeof(sizebuf) },
{ .dptr = lck->shared,
.dsize = lck->num_shared * SERVER_ID_BUF_LENGTH },
{ 0 },
{ .dptr = lck->data, .dsize = lck->datalen }
struct TDB_DATA dbufs[6 + num_new_dbufs];
dbufs[0] = (TDB_DATA) {
.dptr = exclusive, .dsize = sizeof(exclusive),
};
dbufs[1] = (TDB_DATA) {
.dptr = seqnum_buf, .dsize = sizeof(seqnum_buf),
};
dbufs[2] = (TDB_DATA) {
.dptr = sizebuf, .dsize = sizeof(sizebuf),
};
dbufs[3] = (TDB_DATA) {
.dptr = lck->shared,
.dsize = lck->num_shared * SERVER_ID_BUF_LENGTH,
};
dbufs[4] = (TDB_DATA) { 0 };
dbufs[5] = (TDB_DATA) {
.dptr = lck->data, .dsize = lck->datalen,
};
if (num_new_dbufs != 0) {
memcpy(&dbufs[6],
new_dbufs,
num_new_dbufs * sizeof(TDB_DATA));
}
server_id_put(exclusive, lck->exclusive);
SBVAL(seqnum_buf, 0, lck->data_seqnum);
@ -255,7 +273,7 @@ static NTSTATUS g_lock_cleanup_dead(
}
if (modified) {
status = g_lock_store(rec, lck, NULL);
status = g_lock_store(rec, lck, NULL, NULL, 0);
if (!NT_STATUS_IS_OK(status)) {
DBG_DEBUG("g_lock_store() failed: %s\n",
nt_errstr(status));
@ -474,7 +492,7 @@ noexclusive:
lck.exclusive = self;
status = g_lock_store(rec, &lck, NULL);
status = g_lock_store(rec, &lck, NULL, NULL, 0);
if (!NT_STATUS_IS_OK(status)) {
DBG_DEBUG("g_lock_store() failed: %s\n",
nt_errstr(status));
@ -503,7 +521,7 @@ noexclusive:
do_shared:
if (lck.num_shared == 0) {
status = g_lock_store(rec, &lck, &self);
status = g_lock_store(rec, &lck, &self, NULL, 0);
if (!NT_STATUS_IS_OK(status)) {
DBG_DEBUG("g_lock_store() failed: %s\n",
nt_errstr(status));
@ -514,7 +532,7 @@ do_shared:
g_lock_cleanup_shared(&lck);
status = g_lock_store(rec, &lck, &self);
status = g_lock_store(rec, &lck, &self, NULL, 0);
if (!NT_STATUS_IS_OK(status)) {
DBG_DEBUG("g_lock_store() failed: %s\n",
nt_errstr(status));
@ -706,13 +724,13 @@ static void g_lock_lock_simple_fn(
goto not_granted;
}
lck.exclusive = state->me;
state->status = g_lock_store(rec, &lck, NULL);
state->status = g_lock_store(rec, &lck, NULL, NULL, 0);
return;
}
if (state->type == G_LOCK_READ) {
g_lock_cleanup_shared(&lck);
state->status = g_lock_store(rec, &lck, &state->me);
state->status = g_lock_store(rec, &lck, &state->me, NULL, 0);
return;
}
@ -849,7 +867,7 @@ static void g_lock_unlock_fn(
return;
}
state->status = g_lock_store(rec, &lck, NULL);
state->status = g_lock_store(rec, &lck, NULL, NULL, 0);
}
NTSTATUS g_lock_unlock(struct g_lock_ctx *ctx, TDB_DATA key)
@ -919,7 +937,7 @@ 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);
state->status = g_lock_store(rec, &lck, NULL, NULL, 0);
}
NTSTATUS g_lock_write_data(struct g_lock_ctx *ctx, TDB_DATA key,
@ -1264,7 +1282,7 @@ static void g_lock_wake_watchers_fn(
lck.data_seqnum += 1;
status = g_lock_store(rec, &lck, NULL);
status = g_lock_store(rec, &lck, NULL, NULL, 0);
if (!NT_STATUS_IS_OK(status)) {
DBG_WARNING("g_lock_store failed: %s\n", nt_errstr(status));
return;