From: Stefan Metzmacher Date: Mon, 22 Aug 2022 14:53:38 +0000 (+0200) Subject: s3:locking: split out share_mode_data_ltdb_store() X-Git-Tag: talloc-2.4.0~908 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=703a4ff525655c6f99ac24351be7eb898d4ded28;p=thirdparty%2Fsamba.git s3:locking: split out share_mode_data_ltdb_store() 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 Reviewed-by: Jeremy Allison --- diff --git a/source3/locking/share_mode_lock.c b/source3/locking/share_mode_lock.c index a21fd6c5ba6..ba4660b5015 100644 --- a/source3/locking/share_mode_lock.c +++ b/source3/locking/share_mode_lock.c @@ -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, <db); - 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, <db); + 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; }