[SCM] Samba Shared Repository - branch master updated
Andreas Schneider
asn at samba.org
Fri Nov 4 10:07:01 UTC 2022
The branch, master has been updated
via f5d77cb627d s3:winbind: Avoid unnecessary locking in wb_parent_idmap_setup_send()
from b3292b541ec smbget: Adds a rate limiting option --limit-rate in KB/s
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit f5d77cb627d906bbebfbf863130bc5d1e36337c9
Author: Pavel Filipenský <pfilipen at redhat.com>
Date: Tue Jun 21 18:19:16 2022 +0200
s3:winbind: Avoid unnecessary locking in wb_parent_idmap_setup_send()
A function in tevent environment can span over several context loop iterations.
Every iteration 'unschedules' the current code and a different functions can
access not yet fully initialized structures.
A locking is used to avoid this. In tevent, we use tevent queues as a locking
mechanism. Every function trying to access lock protected data, puts itself to
a queue. The function must remove itself from the queue only after the complete
work is done.
A good coding practise is to lock only the smallest code path and not to use the
locking if not needed.
wb_parent_idmap_setup_send() uses queue "wb_parent_idmap_config_queue" for:
- testing if the setup is ready
- setting up all idmap domains
But "testing if the setup is ready" can be coded as an atomic operation without
needing a lock.
Signed-off-by: Pavel Filipenský <pfilipen at redhat.com>
Reviewed-by: Andreas Schneider <asn at samba.org>
Autobuild-User(master): Andreas Schneider <asn at cryptomilk.org>
Autobuild-Date(master): Fri Nov 4 10:06:28 UTC 2022 on sn-devel-184
-----------------------------------------------------------------------
Summary of changes:
source3/winbindd/winbindd.h | 1 +
source3/winbindd/winbindd_idmap.c | 7 +++++++
2 files changed, 8 insertions(+)
Changeset truncated at 500 lines:
diff --git a/source3/winbindd/winbindd.h b/source3/winbindd/winbindd.h
index 093a9fad11e..5044fee0c68 100644
--- a/source3/winbindd/winbindd.h
+++ b/source3/winbindd/winbindd.h
@@ -191,6 +191,7 @@ struct wb_parent_idmap_config_dom {
struct wb_parent_idmap_config {
struct tevent_queue *queue;
uint32_t num_doms;
+ bool initialized;
struct wb_parent_idmap_config_dom *doms;
};
diff --git a/source3/winbindd/winbindd_idmap.c b/source3/winbindd/winbindd_idmap.c
index e6d2c284cf2..75f7d37d86d 100644
--- a/source3/winbindd/winbindd_idmap.c
+++ b/source3/winbindd/winbindd_idmap.c
@@ -131,6 +131,7 @@ static void wb_parent_idmap_setup_cleanup(struct tevent_req *req,
}
state->cfg->num_doms = 0;
+ state->cfg->initialized = false;
TALLOC_FREE(state->cfg->doms);
state->cfg = NULL;
}
@@ -159,6 +160,11 @@ struct tevent_req *wb_parent_idmap_setup_send(TALLOC_CTX *mem_ctx,
.dom_idx = 0,
};
+ if (state->cfg->initialized) {
+ tevent_req_done(req);
+ return tevent_req_post(req, ev);
+ }
+
if (state->cfg->queue == NULL) {
state->cfg->queue = tevent_queue_create(NULL,
"wb_parent_idmap_config_queue");
@@ -330,6 +336,7 @@ static void wb_parent_idmap_setup_lookupname_next(struct tevent_req *req)
* We're done, so start the idmap child
*/
setup_child(NULL, &static_idmap_child, "log.winbindd", "idmap");
+ static_parent_idmap_config.initialized = true;
tevent_req_done(req);
return;
}
--
Samba Shared Repository
More information about the samba-cvs
mailing list