s3:locking: split out share_mode_data_ltdb_store()
authorStefan Metzmacher <metze@samba.org>
Mon, 22 Aug 2022 14:53:38 +0000 (16:53 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 20 Sep 2022 00:34:35 +0000 (00:34 +0000)
This will allow us to use it in other places too
and we'll avoid to storing multiple times.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=15125

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/locking/share_mode_lock.c

index a21fd6c5ba666963447ac54d75caadf797bd8cfa..ba4660b5015e9ecf551c25bec240885615934364 100644 (file)
@@ -634,37 +634,28 @@ fail:
        return NULL;
 }
 
-/*******************************************************************
- If modified, store the share_mode_data back into the database.
-********************************************************************/
-
-static NTSTATUS share_mode_data_store(struct share_mode_data *d)
+static NTSTATUS share_mode_data_ltdb_store(struct share_mode_data *d,
+                                          TDB_DATA key,
+                                          struct locking_tdb_data *ltdb,
+                                          const TDB_DATA *share_mode_dbufs,
+                                          size_t num_share_mode_dbufs)
 {
-       TDB_DATA key = locking_key(&d->id);
-       struct locking_tdb_data *ltdb = NULL;
        DATA_BLOB blob = { 0 };
        NTSTATUS status;
 
        if (!d->modified) {
-               DBG_DEBUG("not modified\n");
-               return NT_STATUS_OK;
+               DBG_DEBUG("share_mode_data not modified\n");
+               goto store;
        }
 
+       d->unique_content_epoch = generate_unique_u64(d->unique_content_epoch);
+
        if (DEBUGLEVEL >= 10) {
                DBG_DEBUG("\n");
                NDR_PRINT_DEBUG(share_mode_data, d);
        }
 
-       d->unique_content_epoch = generate_unique_u64(d->unique_content_epoch);
-
-       status = locking_tdb_data_fetch(key, d, &ltdb);
-       if (!NT_STATUS_IS_OK(status)) {
-               DBG_ERR("locking_tdb_data_fetch failed: %s\n",
-                       nt_errstr(status));
-               return status;
-       }
-
-       if (ltdb->num_share_entries != 0) {
+       if (ltdb->num_share_entries != 0 || num_share_mode_dbufs != 0) {
                enum ndr_err_code ndr_err;
 
                ndr_err = ndr_push_struct_blob(
@@ -673,9 +664,8 @@ static NTSTATUS share_mode_data_store(struct share_mode_data *d)
                        d,
                        (ndr_push_flags_fn_t)ndr_push_share_mode_data);
                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-                       DBG_DEBUG("ndr_push_share_mode_data failed: %s\n",
+                       DBG_ERR("ndr_push_share_mode_data failed: %s\n",
                                  ndr_errstr(ndr_err));
-                       TALLOC_FREE(ltdb);
                        return ndr_map_error2ntstatus(ndr_err);
                }
        }
@@ -683,9 +673,12 @@ static NTSTATUS share_mode_data_store(struct share_mode_data *d)
        ltdb->share_mode_data_buf = blob.data;
        ltdb->share_mode_data_len = blob.length;
 
-       status = locking_tdb_data_store(key, ltdb, NULL, 0);
+store:
+       status = locking_tdb_data_store(key,
+                                       ltdb,
+                                       share_mode_dbufs,
+                                       num_share_mode_dbufs);
        if (!NT_STATUS_IS_OK(status)) {
-               TALLOC_FREE(ltdb);
                DBG_ERR("locking_tdb_data_store failed: %s\n",
                        nt_errstr(status));
                return status;
@@ -693,7 +686,44 @@ static NTSTATUS share_mode_data_store(struct share_mode_data *d)
 
        d->modified = false;
        d->not_stored = (ltdb->share_mode_data_len == 0);
+
+       return NT_STATUS_OK;
+}
+
+/*******************************************************************
+ If modified, store the share_mode_data back into the database.
+********************************************************************/
+
+static NTSTATUS share_mode_data_store(struct share_mode_data *d)
+{
+       TDB_DATA key = locking_key(&d->id);
+       struct locking_tdb_data *ltdb = NULL;
+       NTSTATUS status;
+
+       if (!d->modified) {
+               DBG_DEBUG("not modified\n");
+               return NT_STATUS_OK;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               DBG_DEBUG("\n");
+               NDR_PRINT_DEBUG(share_mode_data, d);
+       }
+
+       status = locking_tdb_data_fetch(key, d, &ltdb);
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_ERR("locking_tdb_data_fetch failed: %s\n",
+                       nt_errstr(status));
+               return status;
+       }
+
+       status = share_mode_data_ltdb_store(d, key, ltdb, NULL, 0);
        TALLOC_FREE(ltdb);
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_ERR("share_mode_data_ltdb_store failed: %s\n",
+                       nt_errstr(status));
+               return status;
+       }
 
        return NT_STATUS_OK;
 }