1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-26 18:50:30 +03:00

dbwrap: Pass "value" to dbwrap_do_locked() callback

I want to reduce dbwrap_record_get_value(). It makes the caller believe it can
make a copy of the TDB_DATA returned and that the value remains constant. It's
not, as you can always do a dbwrap_record_store().

This patch removes one requirement for getting the value out of a
db_record via dbwrap_record_get_value(). You can still make a copy, but from an
API perspective to me it's more obvious that "value" as a parameter to the
callback has a limited lifetime.

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
This commit is contained in:
Volker Lendecke 2019-10-23 11:34:47 +02:00 committed by Jeremy Allison
parent a58633f64e
commit caef82b1fe
10 changed files with 71 additions and 38 deletions

View File

@ -307,7 +307,10 @@ struct dbwrap_store_state {
NTSTATUS status;
};
static void dbwrap_store_fn(struct db_record *rec, void *private_data)
static void dbwrap_store_fn(
struct db_record *rec,
TDB_DATA value,
void *private_data)
{
struct dbwrap_store_state *state = private_data;
state->status = dbwrap_record_store(rec, state->data, state->flags);
@ -331,7 +334,10 @@ struct dbwrap_delete_state {
NTSTATUS status;
};
static void dbwrap_delete_fn(struct db_record *rec, void *private_data)
static void dbwrap_delete_fn(
struct db_record *rec,
TDB_DATA value,
void *private_data)
{
struct dbwrap_delete_state *state = private_data;
state->status = dbwrap_record_delete(rec);
@ -514,6 +520,7 @@ NTSTATUS dbwrap_parse_record_recv(struct tevent_req *req)
NTSTATUS dbwrap_do_locked(struct db_context *db, TDB_DATA key,
void (*fn)(struct db_record *rec,
TDB_DATA value,
void *private_data),
void *private_data)
{
@ -542,7 +549,7 @@ NTSTATUS dbwrap_do_locked(struct db_context *db, TDB_DATA key,
return NT_STATUS_NO_MEMORY;
}
fn(rec, private_data);
fn(rec, rec->value, private_data);
TALLOC_FREE(rec);

View File

@ -81,6 +81,7 @@ struct db_context *dbwrap_record_get_db(struct db_record *rec);
NTSTATUS dbwrap_do_locked(struct db_context *db, TDB_DATA key,
void (*fn)(struct db_record *rec,
TDB_DATA value,
void *private_data),
void *private_data);

View File

@ -70,6 +70,7 @@ struct db_context {
NTSTATUS (*parse_record_recv)(struct tevent_req *req);
NTSTATUS (*do_locked)(struct db_context *db, TDB_DATA key,
void (*fn)(struct db_record *rec,
TDB_DATA value,
void *private_data),
void *private_data);
int (*exists)(struct db_context *db,TDB_DATA key);

View File

@ -184,6 +184,7 @@ static struct db_record *db_tdb_try_fetch_locked(
static NTSTATUS db_tdb_do_locked(struct db_context *db, TDB_DATA key,
void (*fn)(struct db_record *rec,
TDB_DATA value,
void *private_data),
void *private_data)
{
@ -218,7 +219,7 @@ static NTSTATUS db_tdb_do_locked(struct db_context *db, TDB_DATA key,
.private_data = ctx
};
fn(&rec, private_data);
fn(&rec, rec.value, private_data);
tdb_chainunlock(ctx->wtdb->tdb, key);

View File

@ -279,7 +279,9 @@ static struct db_record *dbwrap_watched_fetch_locked(
struct dbwrap_watched_do_locked_state {
TALLOC_CTX *mem_ctx;
struct db_context *db;
void (*fn)(struct db_record *rec, void *private_data);
void (*fn)(struct db_record *rec,
TDB_DATA value,
void *private_data);
void *private_data;
struct db_watched_subrec subrec;
@ -310,17 +312,19 @@ static NTSTATUS dbwrap_watched_do_locked_delete(struct db_record *rec)
return status;
}
static void dbwrap_watched_do_locked_fn(struct db_record *subrec,
void *private_data)
static void dbwrap_watched_do_locked_fn(
struct db_record *subrec,
TDB_DATA subrec_value,
void *private_data)
{
struct dbwrap_watched_do_locked_state *state =
(struct dbwrap_watched_do_locked_state *)private_data;
TDB_DATA subrec_value = dbwrap_record_get_value(subrec);
struct db_record rec;
bool ok;
rec = (struct db_record) {
.db = state->db, .key = dbwrap_record_get_key(subrec),
.db = state->db,
.key = dbwrap_record_get_key(subrec),
.storev = dbwrap_watched_do_locked_storev,
.delete_rec = dbwrap_watched_do_locked_delete,
.private_data = state
@ -349,11 +353,12 @@ static void dbwrap_watched_do_locked_fn(struct db_record *subrec,
rec.value = state->subrec.wrec.data;
}
state->fn(&rec, state->private_data);
state->fn(&rec, state->subrec.wrec.data, state->private_data);
}
static NTSTATUS dbwrap_watched_do_locked(struct db_context *db, TDB_DATA key,
void (*fn)(struct db_record *rec,
TDB_DATA value,
void *private_data),
void *private_data)
{

View File

@ -348,7 +348,10 @@ struct g_lock_lock_fn_state {
NTSTATUS status;
};
static void g_lock_lock_fn(struct db_record *rec, void *private_data)
static void g_lock_lock_fn(
struct db_record *rec,
TDB_DATA value,
void *private_data)
{
struct g_lock_lock_fn_state *state = private_data;
struct server_id blocker = {0};
@ -509,17 +512,16 @@ struct g_lock_unlock_state {
NTSTATUS status;
};
static void g_lock_unlock_fn(struct db_record *rec,
void *private_data)
static void g_lock_unlock_fn(
struct db_record *rec,
TDB_DATA value,
void *private_data)
{
struct g_lock_unlock_state *state = private_data;
TDB_DATA value;
struct g_lock lck;
size_t i;
bool ok;
value = dbwrap_record_get_value(rec);
ok = g_lock_parse(value.dptr, value.dsize, &lck);
if (!ok) {
DBG_DEBUG("g_lock_parse for %s failed\n",
@ -581,17 +583,16 @@ struct g_lock_write_data_state {
NTSTATUS status;
};
static void g_lock_write_data_fn(struct db_record *rec,
void *private_data)
static void g_lock_write_data_fn(
struct db_record *rec,
TDB_DATA value,
void *private_data)
{
struct g_lock_write_data_state *state = private_data;
TDB_DATA value;
struct g_lock lck;
size_t i;
bool ok;
value = dbwrap_record_get_value(rec);
ok = g_lock_parse(value.dptr, value.dsize, &lck);
if (!ok) {
DBG_DEBUG("g_lock_parse for %s failed\n",

View File

@ -97,10 +97,12 @@ struct leases_db_do_locked_state {
NTSTATUS status;
};
static void leases_db_do_locked_fn(struct db_record *rec, void *private_data)
static void leases_db_do_locked_fn(
struct db_record *rec,
TDB_DATA db_value,
void *private_data)
{
struct leases_db_do_locked_state *state = private_data;
TDB_DATA db_value = dbwrap_record_get_value(rec);
DATA_BLOB blob = { .data = db_value.dptr, .length = db_value.dsize };
struct leases_db_value *value = NULL;
enum ndr_err_code ndr_err;

View File

@ -513,11 +513,13 @@ struct add_fd_to_close_entry_state {
};
static void add_fd_to_close_entry_fn(
struct db_record *rec, void *private_data)
struct db_record *rec,
TDB_DATA value,
void *private_data)
{
struct add_fd_to_close_entry_state *state = private_data;
TDB_DATA values[] = {
dbwrap_record_get_value(rec),
value,
{ .dptr = (uint8_t *)&(state->fsp->fh->fd),
.dsize = sizeof(state->fsp->fh->fd) },
};
@ -551,9 +553,10 @@ static void add_fd_to_close_entry(const files_struct *fsp)
}
static void fd_close_posix_fn(
struct db_record *rec, void *private_data)
struct db_record *rec,
TDB_DATA data,
void *private_data)
{
TDB_DATA data = dbwrap_record_get_value(rec);
size_t num_fds, i;
SMB_ASSERT((data.dsize % sizeof(int)) == 0);

View File

@ -720,13 +720,14 @@ struct share_mode_do_locked_state {
void *private_data;
};
static void share_mode_do_locked_fn(struct db_record *rec,
void *private_data)
static void share_mode_do_locked_fn(
struct db_record *rec,
TDB_DATA value,
void *private_data)
{
struct share_mode_do_locked_state *state = private_data;
bool modified_dependent = false;
bool reset_static_share_mode_record = false;
TDB_DATA value = dbwrap_record_get_value(rec);
if (static_share_mode_record == NULL) {
static_share_mode_record = rec;
@ -1415,10 +1416,12 @@ struct set_share_mode_state {
NTSTATUS status;
};
static void set_share_mode_fn(struct db_record *rec, void *private_data)
static void set_share_mode_fn(
struct db_record *rec,
TDB_DATA data,
void *private_data)
{
struct set_share_mode_state *state = private_data;
TDB_DATA data = dbwrap_record_get_value(rec);
size_t idx, num_share_modes;
struct share_mode_entry tmp;
struct share_mode_entry_buf buf;
@ -1651,11 +1654,12 @@ static bool share_mode_for_one_entry(
}
static void share_mode_forall_entries_fn(
struct db_record *rec, void *private_data)
struct db_record *rec,
TDB_DATA data,
void *private_data)
{
struct share_mode_forall_entries_state *state = private_data;
struct share_mode_data *d = state->lck->data;
struct TDB_DATA data = dbwrap_record_get_value(rec);
size_t num_share_modes;
bool writeback = false;
NTSTATUS status;
@ -1757,10 +1761,12 @@ struct share_mode_entry_do_state {
NTSTATUS status;
};
static void share_mode_entry_do_fn(struct db_record *rec, void *private_data)
static void share_mode_entry_do_fn(
struct db_record *rec,
TDB_DATA data,
void *private_data)
{
struct share_mode_entry_do_state *state = private_data;
struct TDB_DATA data = dbwrap_record_get_value(rec);
size_t idx;
bool found = false;
bool modified;

View File

@ -31,7 +31,10 @@ struct do_locked1_state {
NTSTATUS status;
};
static void do_locked1_cb(struct db_record *rec, void *private_data)
static void do_locked1_cb(
struct db_record *rec,
TDB_DATA value,
void *private_data)
{
struct do_locked1_state *state =
(struct do_locked1_state *)private_data;
@ -55,7 +58,10 @@ static void do_locked1_check(TDB_DATA key, TDB_DATA value,
state->status = NT_STATUS_OK;
}
static void do_locked1_del(struct db_record *rec, void *private_data)
static void do_locked1_del(
struct db_record *rec,
TDB_DATA value,
void *private_data)
{
struct do_locked1_state *state =
(struct do_locked1_state *)private_data;