smbXsrv_tcon: factor fetch-locking of global record into function
authorMichael Adam <obnox@samba.org>
Fri, 26 Feb 2016 23:52:59 +0000 (00:52 +0100)
committerJeremy Allison <jra@samba.org>
Sun, 28 Feb 2016 04:03:22 +0000 (05:03 +0100)
Signed-off-by: Michael Adam <obnox@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/smbd/smbXsrv_tcon.c

index 1d2a141e6b5fdd65fd228b6aef0a3c1301e99fc7..5f10c4997c00fb580bababcc40b1ffa0342ce1ec 100644 (file)
@@ -150,6 +150,27 @@ static NTSTATUS smbXsrv_tcon_local_key_to_id(TDB_DATA key, uint32_t *id)
        return NT_STATUS_OK;
 }
 
+static struct db_record *smbXsrv_tcon_global_fetch_locked(
+                       struct db_context *db,
+                       uint32_t id,
+                       TALLOC_CTX *mem_ctx)
+{
+       TDB_DATA key;
+       uint8_t key_buf[SMBXSRV_TCON_GLOBAL_TDB_KEY_SIZE];
+       struct db_record *rec = NULL;
+
+       key = smbXsrv_tcon_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_tcon_table_init(TALLOC_CTX *mem_ctx,
                                        struct smbXsrv_tcon_table *table,
                                        uint32_t lowest_id,
@@ -473,8 +494,6 @@ static NTSTATUS smbXsrv_tcon_global_allocate(struct db_context *db,
                bool is_free = false;
                bool was_free = false;
                uint32_t id;
-               uint8_t key_buf[SMBXSRV_TCON_GLOBAL_TDB_KEY_SIZE];
-               TDB_DATA key;
 
                if (i >= min_tries && last_free != 0) {
                        id = last_free;
@@ -488,9 +507,8 @@ static NTSTATUS smbXsrv_tcon_global_allocate(struct db_context *db,
                        id--;
                }
 
-               key = smbXsrv_tcon_global_id_to_key(id, key_buf);
-
-               global->db_rec = dbwrap_fetch_locked(db, mem_ctx, key);
+               global->db_rec = smbXsrv_tcon_global_fetch_locked(db, id,
+                                                                 mem_ctx);
                if (global->db_rec == NULL) {
                        talloc_free(global);
                        return NT_STATUS_INSUFFICIENT_RESOURCES;
@@ -820,8 +838,6 @@ NTSTATUS smbXsrv_tcon_update(struct smbXsrv_tcon *tcon)
 {
        struct smbXsrv_tcon_table *table = tcon->table;
        NTSTATUS status;
-       uint8_t key_buf[SMBXSRV_TCON_GLOBAL_TDB_KEY_SIZE];
-       TDB_DATA key;
 
        if (tcon->global->db_rec != NULL) {
                DEBUG(0, ("smbXsrv_tcon_update(0x%08x): "
@@ -830,17 +846,11 @@ NTSTATUS smbXsrv_tcon_update(struct smbXsrv_tcon *tcon)
                return NT_STATUS_INTERNAL_ERROR;
        }
 
-       key = smbXsrv_tcon_global_id_to_key(tcon->global->tcon_global_id,
-                                           key_buf);
-
-       tcon->global->db_rec = dbwrap_fetch_locked(table->global.db_ctx,
-                                                  tcon->global, key);
+       tcon->global->db_rec = smbXsrv_tcon_global_fetch_locked(
+                                               table->global.db_ctx,
+                                               tcon->global->tcon_global_id,
+                                               tcon->global /* TALLOC_CTX */);
        if (tcon->global->db_rec == NULL) {
-               DEBUG(0, ("smbXsrv_tcon_update(0x%08x): "
-                         "Failed to lock global key '%s'\n",
-                         tcon->global->tcon_global_id,
-                         hex_encode_talloc(talloc_tos(), key.dptr,
-                                           key.dsize)));
                return NT_STATUS_INTERNAL_DB_ERROR;
        }
 
@@ -888,22 +898,11 @@ NTSTATUS smbXsrv_tcon_disconnect(struct smbXsrv_tcon *tcon, uint64_t vuid)
        global_rec = tcon->global->db_rec;
        tcon->global->db_rec = NULL;
        if (global_rec == NULL) {
-               uint8_t key_buf[SMBXSRV_TCON_GLOBAL_TDB_KEY_SIZE];
-               TDB_DATA key;
-
-               key = smbXsrv_tcon_global_id_to_key(
+               global_rec = smbXsrv_tcon_global_fetch_locked(
+                                               table->global.db_ctx,
                                                tcon->global->tcon_global_id,
-                                               key_buf);
-
-               global_rec = dbwrap_fetch_locked(table->global.db_ctx,
-                                                tcon->global, key);
+                                               tcon->global /* TALLOC_CTX */);
                if (global_rec == NULL) {
-                       DEBUG(0, ("smbXsrv_tcon_disconnect(0x%08x, '%s'): "
-                                 "Failed to lock global key '%s'\n",
-                                 tcon->global->tcon_global_id,
-                                 tcon->global->share_name,
-                                 hex_encode_talloc(global_rec, key.dptr,
-                                                   key.dsize)));
                        error = NT_STATUS_INTERNAL_ERROR;
                }
        }