1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00

smbXsrv_open: factor fetch-locking of global record into function

smbXsrv_open_global_fetch_locked()

Signed-off-by: Michael Adam <obnox@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
This commit is contained in:
Michael Adam 2016-02-26 00:41:24 +01:00 committed by Jeremy Allison
parent f3ea162488
commit 7b8cfa1cbc

View File

@ -151,6 +151,27 @@ static NTSTATUS smbXsrv_open_local_key_to_id(TDB_DATA key, uint32_t *id)
return NT_STATUS_OK; return NT_STATUS_OK;
} }
static struct db_record *smbXsrv_open_global_fetch_locked(
struct db_context *db,
uint32_t id,
TALLOC_CTX *mem_ctx)
{
TDB_DATA key;
uint8_t key_buf[SMBXSRV_OPEN_GLOBAL_TDB_KEY_SIZE];
struct db_record *rec = NULL;
key = smbXsrv_open_global_id_to_key(id, key_buf);
rec = dbwrap_fetch_locked(db, mem_ctx, key);
if (rec == NULL) {
DBG_DEBUG("Failed to lock global id 0x%08x, key '%s'\n", id,
hex_encode_talloc(talloc_tos(), key.dptr, key.dsize));
}
return rec;
}
static NTSTATUS smbXsrv_open_table_init(struct smbXsrv_connection *conn, static NTSTATUS smbXsrv_open_table_init(struct smbXsrv_connection *conn,
uint32_t lowest_id, uint32_t lowest_id,
uint32_t highest_id, uint32_t highest_id,
@ -494,8 +515,6 @@ static NTSTATUS smbXsrv_open_global_allocate(struct db_context *db,
bool is_free = false; bool is_free = false;
bool was_free = false; bool was_free = false;
uint32_t id; uint32_t id;
uint8_t key_buf[SMBXSRV_OPEN_GLOBAL_TDB_KEY_SIZE];
TDB_DATA key;
if (i >= min_tries && last_free != 0) { if (i >= min_tries && last_free != 0) {
id = last_free; id = last_free;
@ -509,9 +528,7 @@ static NTSTATUS smbXsrv_open_global_allocate(struct db_context *db,
id--; id--;
} }
key = smbXsrv_open_global_id_to_key(id, key_buf); global->db_rec = smbXsrv_open_global_fetch_locked(db, id, mem_ctx);
global->db_rec = dbwrap_fetch_locked(db, mem_ctx, key);
if (global->db_rec == NULL) { if (global->db_rec == NULL) {
talloc_free(global); talloc_free(global);
return NT_STATUS_INSUFFICIENT_RESOURCES; return NT_STATUS_INSUFFICIENT_RESOURCES;
@ -717,8 +734,6 @@ static NTSTATUS smbXsrv_open_global_lookup(struct smbXsrv_open_table *table,
TALLOC_CTX *mem_ctx, TALLOC_CTX *mem_ctx,
struct smbXsrv_open_global0 **_global) struct smbXsrv_open_global0 **_global)
{ {
TDB_DATA key;
uint8_t key_buf[SMBXSRV_OPEN_GLOBAL_TDB_KEY_SIZE];
struct db_record *global_rec = NULL; struct db_record *global_rec = NULL;
bool is_free = false; bool is_free = false;
@ -728,15 +743,10 @@ static NTSTATUS smbXsrv_open_global_lookup(struct smbXsrv_open_table *table,
return NT_STATUS_INTERNAL_ERROR; return NT_STATUS_INTERNAL_ERROR;
} }
key = smbXsrv_open_global_id_to_key(open_global_id, key_buf); global_rec = smbXsrv_open_global_fetch_locked(table->global.db_ctx,
global_rec = dbwrap_fetch_locked(table->global.db_ctx, mem_ctx, key);
if (global_rec == NULL) {
DEBUG(0, ("smbXsrv_open_global_lookup(0x%08x): "
"Failed to lock global key '%s'\n",
open_global_id, open_global_id,
hex_encode_talloc(talloc_tos(), key.dptr, mem_ctx);
key.dsize))); if (global_rec == NULL) {
return NT_STATUS_INTERNAL_DB_ERROR; return NT_STATUS_INTERNAL_DB_ERROR;
} }
@ -909,8 +919,6 @@ NTSTATUS smbXsrv_open_update(struct smbXsrv_open *op)
{ {
struct smbXsrv_open_table *table = op->table; struct smbXsrv_open_table *table = op->table;
NTSTATUS status; NTSTATUS status;
uint8_t key_buf[SMBXSRV_OPEN_GLOBAL_TDB_KEY_SIZE];
TDB_DATA key;
if (op->global->db_rec != NULL) { if (op->global->db_rec != NULL) {
DEBUG(0, ("smbXsrv_open_update(0x%08x): " DEBUG(0, ("smbXsrv_open_update(0x%08x): "
@ -919,17 +927,11 @@ NTSTATUS smbXsrv_open_update(struct smbXsrv_open *op)
return NT_STATUS_INTERNAL_ERROR; return NT_STATUS_INTERNAL_ERROR;
} }
key = smbXsrv_open_global_id_to_key(op->global->open_global_id, op->global->db_rec = smbXsrv_open_global_fetch_locked(
key_buf); table->global.db_ctx,
op->global->db_rec = dbwrap_fetch_locked(table->global.db_ctx,
op->global, key);
if (op->global->db_rec == NULL) {
DEBUG(0, ("smbXsrv_open_update(0x%08x): "
"Failed to lock global key '%s'\n",
op->global->open_global_id, op->global->open_global_id,
hex_encode_talloc(talloc_tos(), key.dptr, op->global /* TALLOC_CTX */);
key.dsize))); if (op->global->db_rec == NULL) {
return NT_STATUS_INTERNAL_DB_ERROR; return NT_STATUS_INTERNAL_DB_ERROR;
} }
@ -979,21 +981,11 @@ NTSTATUS smbXsrv_open_close(struct smbXsrv_open *op, NTTIME now)
global_rec = op->global->db_rec; global_rec = op->global->db_rec;
op->global->db_rec = NULL; op->global->db_rec = NULL;
if (global_rec == NULL) { if (global_rec == NULL) {
uint8_t key_buf[SMBXSRV_OPEN_GLOBAL_TDB_KEY_SIZE]; global_rec = smbXsrv_open_global_fetch_locked(
TDB_DATA key; table->global.db_ctx,
key = smbXsrv_open_global_id_to_key(
op->global->open_global_id, op->global->open_global_id,
key_buf); op->global /* TALLOC_CTX */);
global_rec = dbwrap_fetch_locked(table->global.db_ctx,
op->global, key);
if (global_rec == NULL) { if (global_rec == NULL) {
DEBUG(0, ("smbXsrv_open_close(0x%08x): "
"Failed to lock global key '%s'\n",
op->global->open_global_id,
hex_encode_talloc(global_rec, key.dptr,
key.dsize)));
error = NT_STATUS_INTERNAL_ERROR; error = NT_STATUS_INTERNAL_ERROR;
} }
} }
@ -1403,21 +1395,16 @@ NTSTATUS smbXsrv_open_cleanup(uint64_t persistent_id)
NTSTATUS status = NT_STATUS_OK; NTSTATUS status = NT_STATUS_OK;
TALLOC_CTX *frame = talloc_stackframe(); TALLOC_CTX *frame = talloc_stackframe();
struct smbXsrv_open_global0 *op = NULL; struct smbXsrv_open_global0 *op = NULL;
uint8_t key_buf[SMBXSRV_OPEN_GLOBAL_TDB_KEY_SIZE];
TDB_DATA key;
TDB_DATA val; TDB_DATA val;
struct db_record *rec; struct db_record *rec;
bool delete_open = false; bool delete_open = false;
uint32_t global_id = persistent_id & UINT32_MAX; uint32_t global_id = persistent_id & UINT32_MAX;
key = smbXsrv_open_global_id_to_key(global_id, key_buf); rec = smbXsrv_open_global_fetch_locked(smbXsrv_open_global_db_ctx,
rec = dbwrap_fetch_locked(smbXsrv_open_global_db_ctx, frame, key); global_id,
frame);
if (rec == NULL) { if (rec == NULL) {
status = NT_STATUS_NOT_FOUND; status = NT_STATUS_NOT_FOUND;
DEBUG(1, ("smbXsrv_open_cleanup[global: 0x%08x] "
"failed to fetch record from %s - %s\n",
global_id, dbwrap_name(smbXsrv_open_global_db_ctx),
nt_errstr(status)));
goto done; goto done;
} }