[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Mon Feb 13 10:50:01 UTC 2023


The branch, master has been updated
       via  cc4e11d0282 smbd: Remove smbXsrv_open_global0->db_rec
       via  1bd16bc6d45 smbd: Use dbwrap_do_locked() in smb2srv_open_recreate()
       via  fede6b9f465 smbd: rename 'op' into 'global' in smbXsrv_open_cleanup_fn()
       via  ca872ad6ba1 smbd: let smbXsrv_open_cleanup() delete broken records
       via  a69950db4a7 smbd: Use dbwrap_do_locked() in smbXsrv_open_cleanup()
       via  62a66331934 smbd: Use dbwrap_do_locked() in smbXsrv_open_close()
       via  26b29ecbb9d smbd: Use dbwrap_do_locked() in smbXsrv_open_update()
       via  bfede670bd4 smbd: Use dbwrap_do_locked() in smbXsrv_open_global_allocate()
       via  84d22dc5f57 smbd: Make smbXsrv_open_global_allocate() store the record
       via  95e3ad7e437 smbd: Simplify smbXsrv_open_global_store()
       via  fafebc46c8b smbd: Move smbXsrv_open_global_verify_record() down in smbXsrv_open.c
       via  a93d93a97df smbd: Use generate_nonce_buffer() in smbXsrv_open_global_allocate()
      from  e8abe52df2d s3: smbd: Fix log spam. Change a normal error message from DBG_ERR (level 0) to DBG_INFO (level 5).

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit cc4e11d02826526e61e85e1a939c515d01323dcb
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jan 11 11:02:11 2023 +0100

    smbd: Remove smbXsrv_open_global0->db_rec
    
    The only user by now was net serverid wipedbs, and there it was easy to replace
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>
    
    Autobuild-User(master): Stefan Metzmacher <metze at samba.org>
    Autobuild-Date(master): Mon Feb 13 10:49:43 UTC 2023 on atb-devel-224

commit 1bd16bc6d451e810dc215e7638de483a6e2d04a6
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jan 11 10:54:37 2023 +0100

    smbd: Use dbwrap_do_locked() in smb2srv_open_recreate()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit fede6b9f4652588825fdd4b458fcf23250339e79
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Jan 31 12:39:06 2023 +0100

    smbd: rename 'op' into 'global' in smbXsrv_open_cleanup_fn()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit ca872ad6ba1c7f84af5a9be89de5d2973d2cd87e
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Jan 10 12:29:18 2023 +0100

    smbd: let smbXsrv_open_cleanup() delete broken records
    
    Pair-Programmed-With: Stefan Metzmacher <metze at samba.org>
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit a69950db4a7344ee1bec8fc7b66a402597f578a2
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Jan 10 12:29:18 2023 +0100

    smbd: Use dbwrap_do_locked() in smbXsrv_open_cleanup()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 62a66331934b298f9df1e661b61cb4c193d1a5a0
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Jan 10 11:59:07 2023 +0100

    smbd: Use dbwrap_do_locked() in smbXsrv_open_close()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 26b29ecbb9dbc518856cd59629e1d291540e4ba7
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Jan 8 21:04:25 2023 +0100

    smbd: Use dbwrap_do_locked() in smbXsrv_open_update()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit bfede670bd4152d22897ee52a176dd6e620974e6
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jan 26 09:08:27 2023 +0100

    smbd: Use dbwrap_do_locked() in smbXsrv_open_global_allocate()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 84d22dc5f57393baf5a914815eedd9536e398026
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Jan 6 17:12:23 2023 +0100

    smbd: Make smbXsrv_open_global_allocate() store the record
    
    Micro-step towards using dbwrap_do_locked()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 95e3ad7e4378e1d82da8eb745147539a96a28f8c
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jan 5 16:18:37 2023 +0100

    smbd: Simplify smbXsrv_open_global_store()
    
    Avoid the dependency on global->db_rec. This makes the callers more
    verbose, but it makes the data dependencies much more obvious. This
    will enable removing smbXsrv_open_global0->db_rec at some point.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit fafebc46c8bf624736995f3a87819b3c075cb383
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jan 26 08:46:31 2023 +0100

    smbd: Move smbXsrv_open_global_verify_record() down in smbXsrv_open.c
    
    Avoid prototypes
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit a93d93a97df9ffb1c76c9923e147743d6865ff6a
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Jan 6 16:46:11 2023 +0100

    smbd: Use generate_nonce_buffer() in smbXsrv_open_global_allocate()
    
    We don't need anything cryptographic for persistent file handle ids
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/librpc/idl/smbXsrv.idl |   1 -
 source3/smbd/smbXsrv_open.c    | 861 ++++++++++++++++++++++-------------------
 source3/smbd/smbXsrv_open.h    |   4 +-
 source3/utils/net_serverid.c   |   9 +-
 4 files changed, 480 insertions(+), 395 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/librpc/idl/smbXsrv.idl b/source3/librpc/idl/smbXsrv.idl
index e0a751f32de..173bc64db77 100644
--- a/source3/librpc/idl/smbXsrv.idl
+++ b/source3/librpc/idl/smbXsrv.idl
@@ -459,7 +459,6 @@ interface smbXsrv
 	} smbXsrv_open_flags;
 
 	typedef struct {
-		[ignore] db_record 			*db_rec;
 		server_id				server_id;
 		uint32					open_global_id;
 		hyper					open_persistent_id;
diff --git a/source3/smbd/smbXsrv_open.c b/source3/smbd/smbXsrv_open.c
index 585d1ec0838..3975a7e6cff 100644
--- a/source3/smbd/smbXsrv_open.c
+++ b/source3/smbd/smbXsrv_open.c
@@ -34,6 +34,7 @@
 #include "serverid.h"
 #include "source3/include/util_tdb.h"
 #include "lib/util/idtree_random.h"
+#include "lib/util/time_basic.h"
 
 struct smbXsrv_open_table {
 	struct {
@@ -107,26 +108,6 @@ static TDB_DATA smbXsrv_open_global_id_to_key(
 	};
 }
 
-static struct db_record *smbXsrv_open_global_fetch_locked(
-			struct db_context *db,
-			uint32_t id,
-			TALLOC_CTX *mem_ctx)
-{
-	struct smbXsrv_open_global_key_buf key_buf;
-	TDB_DATA key = smbXsrv_open_global_id_to_key(id, &key_buf);
-	struct db_record *rec = NULL;
-
-
-	rec = dbwrap_fetch_locked(db, mem_ctx, key);
-
-	if (rec == NULL) {
-		DBG_DEBUG("Failed to lock global id 0x%08x, key '%s'\n", id,
-			  tdb_data_dbg(key));
-	}
-
-	return rec;
-}
-
 static NTSTATUS smbXsrv_open_table_init(struct smbXsrv_connection *conn,
 					uint32_t lowest_id,
 					uint32_t highest_id,
@@ -225,102 +206,6 @@ static NTSTATUS smbXsrv_open_local_lookup(struct smbXsrv_open_table *table,
 	return NT_STATUS_OK;
 }
 
-static NTSTATUS smbXsrv_open_global_verify_record(
-	TDB_DATA key,
-	TDB_DATA val,
-	TALLOC_CTX *mem_ctx,
-	struct smbXsrv_open_global0 **_global0);
-
-static NTSTATUS smbXsrv_open_global_allocate(
-	struct db_context *db, struct smbXsrv_open_global0 *global)
-{
-	uint32_t i;
-	uint32_t last_free = 0;
-	const uint32_t min_tries = 3;
-
-	/*
-	 * Here we just randomly try the whole 32-bit space
-	 *
-	 * We use just 32-bit, because we want to reuse the
-	 * ID for SRVSVC.
-	 */
-	for (i = 0; i < UINT32_MAX; i++) {
-		struct smbXsrv_open_global_key_buf key_buf;
-		struct smbXsrv_open_global0 *tmp_global0 = NULL;
-		TDB_DATA key, val;
-		uint32_t id;
-		NTSTATUS status;
-
-		if (i >= min_tries && last_free != 0) {
-			id = last_free;
-		} else {
-			id = generate_random();
-		}
-		if (id == 0) {
-			id++;
-		}
-		if (id == UINT32_MAX) {
-			id--;
-		}
-
-		key = smbXsrv_open_global_id_to_key(id, &key_buf);
-
-		global->db_rec = dbwrap_fetch_locked(db, global, key);
-		if (global->db_rec == NULL) {
-			return NT_STATUS_INSUFFICIENT_RESOURCES;
-		}
-		val = dbwrap_record_get_value(global->db_rec);
-
-		status = smbXsrv_open_global_verify_record(
-			key, val, talloc_tos(), &tmp_global0);
-
-		if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) {
-			/*
-			 * Found an empty slot
-			 */
-			global->open_global_id = id;
-			return NT_STATUS_OK;
-		}
-
-		TALLOC_FREE(tmp_global0);
-
-		if (NT_STATUS_EQUAL(status, NT_STATUS_FATAL_APP_EXIT)) {
-			/*
-			 * smbd crashed
-			 */
-			status = dbwrap_record_delete(global->db_rec);
-			if (!NT_STATUS_IS_OK(status)) {
-				DBG_WARNING("dbwrap_record_delete() failed "
-					    "for record %"PRIu32": %s\n",
-					    id,
-					    nt_errstr(status));
-				return NT_STATUS_INTERNAL_DB_CORRUPTION;
-			}
-
-			if ((i < min_tries) && (last_free == 0)) {
-				/*
-				 * Remember "id" as free but also try
-				 * others to not recycle ids too
-				 * quickly.
-				 */
-				last_free = id;
-			}
-		}
-
-		if (!NT_STATUS_IS_OK(status)) {
-			DBG_WARNING("smbXsrv_open_global_verify_record() "
-				    "failed for %s: %s, ignoring\n",
-				    tdb_data_dbg(key),
-				    nt_errstr(status));
-		}
-
-		TALLOC_FREE(global->db_rec);
-	}
-
-	/* should not be reached */
-	return NT_STATUS_INTERNAL_ERROR;
-}
-
 static NTSTATUS smbXsrv_open_global_parse_record(
 	TALLOC_CTX *mem_ctx,
 	TDB_DATA key,
@@ -413,12 +298,15 @@ static NTSTATUS smbXsrv_open_global_verify_record(
 	return NT_STATUS_FATAL_APP_EXIT;
 }
 
-static NTSTATUS smbXsrv_open_global_store(struct smbXsrv_open_global0 *global)
+static NTSTATUS smbXsrv_open_global_store(
+	struct db_record *rec,
+	TDB_DATA key,
+	TDB_DATA oldval,
+	struct smbXsrv_open_global0 *global)
 {
 	struct smbXsrv_open_globalB global_blob;
 	DATA_BLOB blob = data_blob_null;
-	TDB_DATA key;
-	TDB_DATA val;
+	TDB_DATA val = { .dptr = NULL, };
 	NTSTATUS status;
 	enum ndr_err_code ndr_err;
 
@@ -428,15 +316,12 @@ static NTSTATUS smbXsrv_open_global_store(struct smbXsrv_open_global0 *global)
 	 * store the information in the old format.
 	 */
 
-	key = dbwrap_record_get_key(global->db_rec);
-	val = dbwrap_record_get_value(global->db_rec);
-
 	global_blob = (struct smbXsrv_open_globalB) {
 		.version = smbXsrv_version_global_current(),
 	};
 
-	if (val.dsize >= 8) {
-		global_blob.seqnum = IVAL(val.dptr, 4);
+	if (oldval.dsize >= 8) {
+		global_blob.seqnum = IVAL(oldval.dptr, 4);
 	}
 	global_blob.seqnum += 1;
 	global_blob.info.info0 = global;
@@ -447,18 +332,16 @@ static NTSTATUS smbXsrv_open_global_store(struct smbXsrv_open_global0 *global)
 		DBG_WARNING("key '%s' ndr_push - %s\n",
 			    tdb_data_dbg(key),
 			    ndr_map_error2string(ndr_err));
-		TALLOC_FREE(global->db_rec);
 		return ndr_map_error2ntstatus(ndr_err);
 	}
 
 	val = make_tdb_data(blob.data, blob.length);
-	status = dbwrap_record_store(global->db_rec, val, TDB_REPLACE);
+	status = dbwrap_record_store(rec, val, TDB_REPLACE);
 	TALLOC_FREE(blob.data);
 	if (!NT_STATUS_IS_OK(status)) {
 		DBG_WARNING("key '%s' store - %s\n",
 			    tdb_data_dbg(key),
 			    nt_errstr(status));
-		TALLOC_FREE(global->db_rec);
 		return status;
 	}
 
@@ -467,47 +350,152 @@ static NTSTATUS smbXsrv_open_global_store(struct smbXsrv_open_global0 *global)
 		NDR_PRINT_DEBUG(smbXsrv_open_globalB, &global_blob);
 	}
 
-	TALLOC_FREE(global->db_rec);
-
 	return NT_STATUS_OK;
 }
 
-static NTSTATUS smbXsrv_open_global_lookup(struct smbXsrv_open_table *table,
-					   uint32_t open_global_id,
-					   TALLOC_CTX *mem_ctx,
-					   struct smbXsrv_open_global0 **_global)
-{
-	struct smbXsrv_open_global_key_buf key_buf;
-	TDB_DATA key = smbXsrv_open_global_id_to_key(open_global_id, &key_buf);
-	TDB_DATA val;
-	struct db_record *global_rec = NULL;
+struct smbXsrv_open_global_allocate_state {
+	uint32_t id;
+	struct smbXsrv_open_global0 *global;
 	NTSTATUS status;
+};
 
-	*_global = NULL;
+static void smbXsrv_open_global_allocate_fn(
+	struct db_record *rec, TDB_DATA oldval, void *private_data)
+{
+	struct smbXsrv_open_global_allocate_state *state = private_data;
+	struct smbXsrv_open_global0 *global = state->global;
+	struct smbXsrv_open_global0 *tmp_global0 = NULL;
+	TDB_DATA key = dbwrap_record_get_key(rec);
 
-	if (table->global.db_ctx == NULL) {
-		return NT_STATUS_INTERNAL_ERROR;
+	state->status = smbXsrv_open_global_verify_record(
+		key, oldval, talloc_tos(), &tmp_global0);
+
+	if (NT_STATUS_IS_OK(state->status)) {
+		/*
+		 * Found an existing record
+		 */
+		TALLOC_FREE(tmp_global0);
+		state->status = NT_STATUS_RETRY;
+		return;
 	}
 
-	global_rec = dbwrap_fetch_locked(table->global.db_ctx, mem_ctx, key);
-	if (global_rec == NULL) {
-		return NT_STATUS_INTERNAL_DB_ERROR;
+	if (NT_STATUS_EQUAL(state->status, NT_STATUS_NOT_FOUND)) {
+		/*
+		 * Found an empty slot
+		 */
+		global->open_global_id = state->id;
+		global->open_persistent_id = state->id;
+
+		state->status = smbXsrv_open_global_store(
+			rec, key, (TDB_DATA) { .dsize = 0, }, state->global);
+		if (!NT_STATUS_IS_OK(state->status)) {
+			DBG_WARNING("smbXsrv_open_global_store() for "
+				    "id %"PRIu32" failed: %s\n",
+				    state->id,
+				    nt_errstr(state->status));
+		}
+		return;
 	}
-	val = dbwrap_record_get_value(global_rec);
 
-	status = smbXsrv_open_global_verify_record(key, val, mem_ctx, _global);
-	if (NT_STATUS_IS_OK(status)) {
-		(*_global)->db_rec = talloc_move(*_global, &global_rec);
-		return NT_STATUS_OK;
+	if (NT_STATUS_EQUAL(state->status, NT_STATUS_FATAL_APP_EXIT)) {
+		NTSTATUS status;
+
+		TALLOC_FREE(tmp_global0);
+
+		/*
+		 * smbd crashed
+		 */
+		status = dbwrap_record_delete(rec);
+		if (!NT_STATUS_IS_OK(status)) {
+			DBG_WARNING("dbwrap_record_delete() failed "
+				    "for record %"PRIu32": %s\n",
+				    state->id,
+				    nt_errstr(status));
+			state->status = NT_STATUS_INTERNAL_DB_CORRUPTION;
+			return;
+		}
+		return;
 	}
+}
 
-	TALLOC_FREE(global_rec);
+static NTSTATUS smbXsrv_open_global_allocate(
+	struct db_context *db, struct smbXsrv_open_global0 *global)
+{
+	struct smbXsrv_open_global_allocate_state state = {
+		.global = global,
+	};
+	uint32_t i;
+	uint32_t last_free = 0;
+	const uint32_t min_tries = 3;
 
-	if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) {
-		return NT_STATUS_OBJECT_NAME_NOT_FOUND;
+	/*
+	 * Here we just randomly try the whole 32-bit space
+	 *
+	 * We use just 32-bit, because we want to reuse the
+	 * ID for SRVSVC.
+	 */
+	for (i = 0; i < UINT32_MAX; i++) {
+		struct smbXsrv_open_global_key_buf key_buf;
+		TDB_DATA key;
+		NTSTATUS status;
+
+		if (i >= min_tries && last_free != 0) {
+			state.id = last_free;
+		} else {
+			generate_nonce_buffer(
+				(uint8_t *)&state.id, sizeof(state.id));
+			state.id = MAX(state.id, 1);
+			state.id = MIN(state.id, UINT32_MAX-1);
+		}
+
+		key = smbXsrv_open_global_id_to_key(state.id, &key_buf);
+
+		status = dbwrap_do_locked(
+			db, key, smbXsrv_open_global_allocate_fn, &state);
+
+		if (!NT_STATUS_IS_OK(status)) {
+			DBG_WARNING("dbwrap_do_locked() failed: %s\n",
+				    nt_errstr(status));
+			return NT_STATUS_INTERNAL_DB_ERROR;
+		}
+
+		if (NT_STATUS_IS_OK(state.status)) {
+			/*
+			 * Found an empty slot, done.
+			 */
+			DBG_DEBUG("Found slot %"PRIu32"\n", state.id);
+			return NT_STATUS_OK;
+		}
+
+		if (NT_STATUS_EQUAL(state.status, NT_STATUS_FATAL_APP_EXIT)) {
+
+			if ((i < min_tries) && (last_free == 0)) {
+				/*
+				 * Remember "id" as free but also try
+				 * others to not recycle ids too
+				 * quickly.
+				 */
+				last_free = state.id;
+			}
+			continue;
+		}
+
+		if (NT_STATUS_EQUAL(state.status, NT_STATUS_RETRY)) {
+			/*
+			 * Normal collision, try next
+			 */
+			DBG_DEBUG("Found record for id %"PRIu32"\n",
+				  state.id);
+			continue;
+		}
+
+		DBG_WARNING("smbXsrv_open_global_allocate_fn() failed: %s\n",
+			    nt_errstr(state.status));
+		return state.status;
 	}
 
-	return status;
+	/* should not be reached */
+	return NT_STATUS_INTERNAL_ERROR;
 }
 
 static int smbXsrv_open_destructor(struct smbXsrv_open *op)
@@ -582,12 +570,6 @@ NTSTATUS smbXsrv_open_create(struct smbXsrv_connection *conn,
 	memset(global->lock_sequence_array, 0xFF,
 	       sizeof(global->lock_sequence_array));
 
-	status = smbXsrv_open_global_allocate(table->global.db_ctx, global);
-	if (!NT_STATUS_IS_OK(status)) {
-		TALLOC_FREE(op);
-		return status;
-	}
-
 	local_id = idr_get_new_random(
 		table->local.idr,
 		op,
@@ -599,7 +581,6 @@ NTSTATUS smbXsrv_open_create(struct smbXsrv_connection *conn,
 	}
 	op->local_id = local_id;
 
-	global->open_persistent_id = global->open_global_id;
 	global->open_volatile_id = op->local_id;
 
 	global->server_id = messaging_server_id(conn->client->msg_ctx);
@@ -609,20 +590,21 @@ NTSTATUS smbXsrv_open_create(struct smbXsrv_connection *conn,
 		global->client_guid = conn->smb2.client.guid;
 	}
 
-	table->local.num_opens += 1;
-
-	talloc_set_destructor(op, smbXsrv_open_destructor);
-
-	status = smbXsrv_open_global_store(global);
+	status = smbXsrv_open_global_allocate(table->global.db_ctx,
+					      global);
 	if (!NT_STATUS_IS_OK(status)) {
-		DEBUG(0,("smbXsrv_open_create: "
-			 "global_id (0x%08x) store failed - %s\n",
-			 op->global->open_global_id,
-			 nt_errstr(status)));
+		int ret = idr_remove(table->local.idr, local_id);
+		SMB_ASSERT(ret == 0);
+
+		DBG_WARNING("smbXsrv_open_global_allocate() failed: %s\n",
+			    nt_errstr(status));
 		TALLOC_FREE(op);
 		return status;
 	}
 
+	table->local.num_opens += 1;
+	talloc_set_destructor(op, smbXsrv_open_destructor);
+
 	if (CHECK_DEBUGLVL(10)) {
 		struct smbXsrv_openB open_blob = {
 			.version = SMBXSRV_VERSION_0,
@@ -741,33 +723,45 @@ static NTSTATUS smbXsrv_open_clear_replay_cache(struct smbXsrv_open *op)
 	return status;
 }
 
+struct smbXsrv_open_update_state {
+	struct smbXsrv_open_global0 *global;
+	NTSTATUS status;
+};
+
+static void smbXsrv_open_update_fn(
+	struct db_record *rec, TDB_DATA oldval, void *private_data)
+{
+	struct smbXsrv_open_update_state *state = private_data;
+	TDB_DATA key = dbwrap_record_get_key(rec);
+
+	state->status = smbXsrv_open_global_store(
+		rec, key, oldval, state->global);
+}
+
 NTSTATUS smbXsrv_open_update(struct smbXsrv_open *op)
 {
+	struct smbXsrv_open_update_state state = { .global = op->global, };
 	struct smbXsrv_open_table *table = op->table;
+	struct smbXsrv_open_global_key_buf key_buf;
+	TDB_DATA key = smbXsrv_open_global_id_to_key(
+		op->global->open_global_id, &key_buf);
 	NTSTATUS status;
 
-	if (op->global->db_rec != NULL) {
-		DEBUG(0, ("smbXsrv_open_update(0x%08x): "
-			  "Called with db_rec != NULL'\n",
-			  op->global->open_global_id));
-		return NT_STATUS_INTERNAL_ERROR;
-	}
-
-	op->global->db_rec = smbXsrv_open_global_fetch_locked(
-						table->global.db_ctx,
-						op->global->open_global_id,
-						op->global /* TALLOC_CTX */);
-	if (op->global->db_rec == NULL) {
+	status = dbwrap_do_locked(
+		table->global.db_ctx, key, smbXsrv_open_update_fn, &state);
+	if (!NT_STATUS_IS_OK(status)) {
+		DBG_WARNING("global_id (0x%08x) dbwrap_do_locked failed: %s\n",
+			    op->global->open_global_id,
+			    nt_errstr(status));
 		return NT_STATUS_INTERNAL_DB_ERROR;
 	}
 
-	status = smbXsrv_open_global_store(op->global);
-	if (!NT_STATUS_IS_OK(status)) {
-		DEBUG(0,("smbXsrv_open_update: "
-			 "global_id (0x%08x) store failed - %s\n",
-			 op->global->open_global_id,
-			 nt_errstr(status)));
-		return status;
+	if (!NT_STATUS_IS_OK(state.status)) {
+		DBG_WARNING("global_id (0x%08x) smbXsrv_open_global_store "


-- 
Samba Shared Repository



More information about the samba-cvs mailing list