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:
parent
a58633f64e
commit
caef82b1fe
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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",
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user