autofs-5.1.8 - add soucre parameter to module functions From: Ian Kent There's a unnecessarily complicated method used to pass the map source to module read map and lookup mount functions. This also confuses coverity which constantly complains about unmatched locking. Just add a parameter to those functions to simplify it and elliminate the coverity false positives not to mention slightly less overhead by the lock removal. Signed-off-by: Ian Kent --- CHANGELOG | 1 + daemon/lookup.c | 10 +------ daemon/master.c | 57 ---------------------------------------- include/automount.h | 16 ++++++----- include/master.h | 4 --- modules/lookup_dir.c | 8 +----- modules/lookup_file.c | 29 +++++--------------- modules/lookup_hesiod.c | 15 +++-------- modules/lookup_hosts.c | 36 +++++++------------------ modules/lookup_ldap.c | 35 ++++++++----------------- modules/lookup_multi.c | 24 ++++------------- modules/lookup_nisplus.c | 27 +++++-------------- modules/lookup_program.c | 29 ++++++-------------- modules/lookup_sss.c | 64 +++++++++++---------------------------------- modules/lookup_userhome.c | 16 +++-------- modules/lookup_yp.c | 35 ++++++++----------------- modules/parse_amd.c | 16 ++++------- modules/parse_hesiod.c | 8 ++---- modules/parse_sun.c | 15 ++++------- 19 files changed, 112 insertions(+), 333 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index ebd02b8c..998fe63f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -87,6 +87,7 @@ - dont take parent source lock at mount shutdown. - fix possible use after free in handle_mounts_exit(). - make submount cleanup the same as top level mounts. +- add soucre parameter to module functions. 19/10/2021 autofs-5.1.8 - add xdr_exports(). diff --git a/daemon/lookup.c b/daemon/lookup.c index 0bfbaa5f..a3f660af 100644 --- a/daemon/lookup.c +++ b/daemon/lookup.c @@ -363,13 +363,10 @@ static int do_read_map(struct autofs_point *ap, struct map_source *map, time_t a map_module_unlock(map); } - master_source_current_wait(ap->entry); - ap->entry->current = map; - pthread_cleanup_push(map_module_lock_cleanup, map); map_module_readlock(map); lookup = map->lookup; - status = lookup->lookup_read_map(ap, age, lookup->context); + status = lookup->lookup_read_map(ap, map, age, lookup->context); pthread_cleanup_pop(1); if (status != NSS_STATUS_SUCCESS) @@ -831,12 +828,9 @@ int do_lookup_mount(struct autofs_point *ap, struct map_source *map, const char map_module_unlock(map); } - master_source_current_wait(ap->entry); - ap->entry->current = map; - map_module_readlock(map); lookup = map->lookup; - status = lookup->lookup_mount(ap, name, name_len, lookup->context); + status = lookup->lookup_mount(ap, map, name, name_len, lookup->context); map_module_unlock(map); return status; diff --git a/daemon/master.c b/daemon/master.c index 77dc7694..d23954ee 100644 --- a/daemon/master.c +++ b/daemon/master.c @@ -688,47 +688,6 @@ void master_source_lock_cleanup(void *arg) return; } -void master_source_current_wait(struct master_mapent *entry) -{ - int status; - - status = pthread_mutex_lock(&entry->current_mutex); - if (status) { - logmsg("entry current source lock failed"); - fatal(status); - } - - while (entry->current != NULL) { - status = pthread_cond_wait( - &entry->current_cond, &entry->current_mutex); - if (status) { - logmsg("entry current source condition wait failed"); - fatal(status); - } - } - - return; -} - -void master_source_current_signal(struct master_mapent *entry) -{ - int status; - - status = pthread_cond_signal(&entry->current_cond); - if (status) { - logmsg("entry current source condition signal failed"); - fatal(status); - } - - status = pthread_mutex_unlock(&entry->current_mutex); - if (status) { - logmsg("entry current source unlock failed"); - fatal(status); - } - - return; -} - struct master_mapent *master_find_mapent(struct master *master, const char *path) { struct list_head *head, *p; @@ -851,14 +810,6 @@ struct master_mapent *master_new_mapent(struct master *master, const char *path, if (status) fatal(status); - status = pthread_mutex_init(&entry->current_mutex, NULL); - if (status) - fatal(status); - - status = pthread_cond_init(&entry->current_cond, NULL); - if (status) - fatal(status); - INIT_LIST_HEAD(&entry->list); return entry; @@ -926,14 +877,6 @@ void master_free_mapent(struct master_mapent *entry) if (status) fatal(status); - status = pthread_mutex_destroy(&entry->current_mutex); - if (status) - fatal(status); - - status = pthread_cond_destroy(&entry->current_cond); - if (status) - fatal(status); - free(entry); return; diff --git a/include/automount.h b/include/automount.h index d6ca1ce5..77ff0c70 100644 --- a/include/automount.h +++ b/include/automount.h @@ -287,15 +287,15 @@ int lookup_source_close_ioctlfd(struct autofs_point *ap, const char *key); int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **context); int lookup_reinit(const char *mapfmt, int argc, const char *const *argv, void **context); int lookup_read_master(struct master *master, time_t age, void *context); -int lookup_read_map(struct autofs_point *, time_t, void *context); -int lookup_mount(struct autofs_point *, const char *, int, void *); +int lookup_read_map(struct autofs_point *ap, struct map_source *map, time_t age, void *context); +int lookup_mount(struct autofs_point *, struct map_source *map, const char *name, int name_len, void *context); int lookup_done(void *); #endif typedef int (*lookup_init_t) (const char *, int, const char *const *, void **); typedef int (*lookup_reinit_t) (const char *, int, const char *const *, void **); typedef int (*lookup_read_master_t) (struct master *master, time_t, void *); -typedef int (*lookup_read_map_t) (struct autofs_point *, time_t, void *); -typedef int (*lookup_mount_t) (struct autofs_point *, const char *, int, void *); +typedef int (*lookup_read_map_t) (struct autofs_point *, struct map_source *, time_t, void *); +typedef int (*lookup_mount_t) (struct autofs_point *, struct map_source *, const char *, int, void *); typedef int (*lookup_done_t) (void *); struct lookup_mod { @@ -324,13 +324,15 @@ int close_lookup(struct lookup_mod *); #ifdef MODULE_PARSE int parse_init(int argc, const char *const *argv, void **context); int parse_reinit(int argc, const char *const *argv, void **context); -int parse_mount(struct autofs_point *ap, const char *name, - int name_len, const char *mapent, void *context); +int parse_mount(struct autofs_point *ap, struct map_source *map, + const char *name, int name_len, const char *mapent, + void *context); int parse_done(void *); #endif typedef int (*parse_init_t) (int, const char *const *, void **); typedef int (*parse_reinit_t) (int, const char *const *, void **); -typedef int (*parse_mount_t) (struct autofs_point *, const char *, int, const char *, void *); +typedef int (*parse_mount_t) (struct autofs_point *, struct map_source *, + const char *, int, const char *, void *); typedef int (*parse_done_t) (void *); struct parse_mod { diff --git a/include/master.h b/include/master.h index 0bdef42e..38070bfc 100644 --- a/include/master.h +++ b/include/master.h @@ -49,8 +49,6 @@ struct master_mapent { time_t age; struct master *master; pthread_rwlock_t source_lock; - pthread_mutex_t current_mutex; - pthread_cond_t current_cond; struct map_source *current; struct map_source *maps; struct autofs_point *ap; @@ -106,8 +104,6 @@ void master_source_writelock(struct master_mapent *); void master_source_readlock(struct master_mapent *); void master_source_unlock(struct master_mapent *); void master_source_lock_cleanup(void *); -void master_source_current_wait(struct master_mapent *); -void master_source_current_signal(struct master_mapent *); struct master_mapent *master_find_mapent(struct master *, const char *); struct autofs_point *master_find_mapent_by_devid(struct master *master, dev_t devid); struct master_mapent *master_new_mapent(struct master *, const char *, time_t); diff --git a/modules/lookup_dir.c b/modules/lookup_dir.c index ab1d82fb..55091b85 100644 --- a/modules/lookup_dir.c +++ b/modules/lookup_dir.c @@ -225,17 +225,13 @@ int lookup_read_master(struct master *master, time_t age, void *context) return NSS_STATUS_SUCCESS; } -int lookup_read_map(struct autofs_point *ap, time_t age, void *context) +int lookup_read_map(struct autofs_point *ap, struct map_source *map, time_t age, void *context) { - ap->entry->current = NULL; - master_source_current_signal(ap->entry); return NSS_STATUS_UNKNOWN; } -int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *context) +int lookup_mount(struct autofs_point *ap, struct map_source *map, const char *name, int name_len, void *context) { - ap->entry->current = NULL; - master_source_current_signal(ap->entry); return NSS_STATUS_UNKNOWN; } diff --git a/modules/lookup_file.c b/modules/lookup_file.c index 6afc5587..99f2e21b 100644 --- a/modules/lookup_file.c +++ b/modules/lookup_file.c @@ -689,23 +689,17 @@ prepare_plus_include(struct autofs_point *ap, return new; } -int lookup_read_map(struct autofs_point *ap, time_t age, void *context) +int lookup_read_map(struct autofs_point *ap, struct map_source *map, time_t age, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; - struct map_source *source; - struct mapent_cache *mc; + struct map_source *source = map; + struct mapent_cache *mc = source->mc; char key[KEY_MAX_LEN + 1]; char mapent[MAPENT_MAX_LEN + 1]; FILE *f; unsigned int k_len, m_len; int entry; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - - mc = source->mc; - if (source->recurse) return NSS_STATUS_TRYAGAIN; @@ -1128,11 +1122,11 @@ static int map_update_needed(struct autofs_point *ap, return ret; } -int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *context) +int lookup_mount(struct autofs_point *ap, struct map_source *map, const char *name, int name_len, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; - struct map_source *source; - struct mapent_cache *mc; + struct map_source *source = map; + struct mapent_cache *mc = source->mc; struct mapent *me; char key[KEY_MAX_LEN + 1]; int key_len; @@ -1143,12 +1137,6 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * int status = 0; int ret = 1; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - - mc = source->mc; - if (source->recurse) return NSS_STATUS_UNAVAIL; @@ -1282,10 +1270,7 @@ do_cache_lookup: free(lkp_key); - master_source_current_wait(ap->entry); - ap->entry->current = source; - - ret = ctxt->parse->parse_mount(ap, key, key_len, + ret = ctxt->parse->parse_mount(ap, source, key, key_len, mapent, ctxt->parse->context); if (ret) { /* Don't update negative cache when re-connecting */ diff --git a/modules/lookup_hesiod.c b/modules/lookup_hesiod.c index 54cf278c..a8328f9a 100644 --- a/modules/lookup_hesiod.c +++ b/modules/lookup_hesiod.c @@ -160,11 +160,8 @@ int lookup_read_master(struct master *master, time_t age, void *context) return NSS_STATUS_UNKNOWN; } -int lookup_read_map(struct autofs_point *ap, time_t age, void *context) +int lookup_read_map(struct autofs_point *ap, struct map_source *map, time_t age, void *context) { - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - return NSS_STATUS_UNKNOWN; } @@ -360,11 +357,11 @@ done: return ret; } -int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *context) +int lookup_mount(struct autofs_point *ap, struct map_source *map, const char *name, int name_len, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; char buf[MAX_ERR_BUF]; - struct map_source *source; + struct map_source *source = map; struct mapent *me; char key[KEY_MAX_LEN + 1]; size_t key_len; @@ -373,10 +370,6 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * char *mapent; int rv; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - debug(ap->logopt, MODPREFIX "looking up root=\"%s\", name=\"%s\"", ap->path, name); @@ -468,7 +461,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * free(lkp_key); - rv = ctxt->parser->parse_mount(ap, key, key_len, + rv = ctxt->parser->parse_mount(ap, source, key, key_len, mapent, ctxt->parser->context); free(mapent); diff --git a/modules/lookup_hosts.c b/modules/lookup_hosts.c index 9ee76fdc..bc5f1724 100644 --- a/modules/lookup_hosts.c +++ b/modules/lookup_hosts.c @@ -182,10 +182,7 @@ static int do_parse_mount(struct autofs_point *ap, struct map_source *source, { int ret; - master_source_current_wait(ap->entry); - ap->entry->current = source; - - ret = ctxt->parse->parse_mount(ap, name, name_len, + ret = ctxt->parse->parse_mount(ap, source, name, name_len, mapent, ctxt->parse->context); if (ret) { struct mapent_cache *mc = source->mc; @@ -312,11 +309,10 @@ next: debug(ap->logopt, MODPREFIX "attempt to update exports for %s", entries->key); - master_source_current_wait(ap->entry); - ap->entry->current = source; ap->flags |= MOUNT_FLAG_REMOUNT; - ret = ctxt->parse->parse_mount(ap, entries->key, strlen(entries->key), - entries->entry, ctxt->parse->context); + ret = ctxt->parse->parse_mount(ap, source, entries->key, + strlen(entries->key), entries->entry, + ctxt->parse->context); if (ret) warn(ap->logopt, MODPREFIX "failed to parse mount %s", entries->entry); @@ -326,20 +322,14 @@ next: pthread_cleanup_pop(1); } -int lookup_read_map(struct autofs_point *ap, time_t age, void *context) +int lookup_read_map(struct autofs_point *ap, struct map_source *map, time_t age, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; - struct map_source *source; - struct mapent_cache *mc; + struct map_source *source = map; + struct mapent_cache *mc = source->mc; struct hostent *host; int status; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - - mc = source->mc; - debug(ap->logopt, MODPREFIX "read hosts map"); /* @@ -381,23 +371,17 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context) return NSS_STATUS_SUCCESS; } -int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *context) +int lookup_mount(struct autofs_point *ap, struct map_source *map, const char *name, int name_len, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; - struct map_source *source; - struct mapent_cache *mc; + struct map_source *source = map; + struct mapent_cache *mc = source->mc; struct mapent *me; char *mapent = NULL; int mapent_len; time_t now = monotonic_time(NULL); int ret; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - - mc = source->mc; - /* Check if we recorded a mount fail for this key anywhere */ me = lookup_source_mapent(ap, name, LKP_DISTINCT); if (me) { diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c index 6b93a389..6af14163 100644 --- a/modules/lookup_ldap.c +++ b/modules/lookup_ldap.c @@ -83,6 +83,8 @@ struct ldap_search_params { static int decode_percent_hack(const char *, char **); +pthread_mutex_t defaults_mutex = PTHREAD_MUTEX_INITIALIZER; + #ifdef WITH_SASL static int set_env(unsigned logopt, const char *name, const char *val) { @@ -3135,17 +3137,13 @@ static int read_one_map(struct autofs_point *ap, return NSS_STATUS_SUCCESS; } -int lookup_read_map(struct autofs_point *ap, time_t age, void *context) +int lookup_read_map(struct autofs_point *ap, struct map_source *map, time_t age, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; - struct map_source *source; + struct map_source *source = map; int rv = LDAP_SUCCESS; int ret, cur_state; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state); ret = read_one_map(ap, source, ctxt, age, &rv); if (ret != NSS_STATUS_SUCCESS) { @@ -3758,7 +3756,7 @@ static int check_map_indirect(struct autofs_point *ap, pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state); - status = pthread_mutex_lock(&ap->entry->current_mutex); + status = pthread_mutex_lock(&defaults_mutex); if (status) fatal(status); if (is_amd_format) { @@ -3780,7 +3778,7 @@ static int check_map_indirect(struct autofs_point *ap, ctxt->check_defaults = 0; } } - status = pthread_mutex_unlock(&ap->entry->current_mutex); + status = pthread_mutex_unlock(&defaults_mutex); if (status) fatal(status); @@ -3827,12 +3825,12 @@ static int check_map_indirect(struct autofs_point *ap, } cache_unlock(mc); - status = pthread_mutex_lock(&ap->entry->current_mutex); + status = pthread_mutex_lock(&defaults_mutex); if (status) fatal(status); if (t_last_read > ap->exp_runfreq && ret & CHE_UPDATED) source->stale = 1; - status = pthread_mutex_unlock(&ap->entry->current_mutex); + status = pthread_mutex_unlock(&defaults_mutex); if (status) fatal(status); } @@ -3848,11 +3846,11 @@ static int check_map_indirect(struct autofs_point *ap, return NSS_STATUS_SUCCESS; } -int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *context) +int lookup_mount(struct autofs_point *ap, struct map_source *map, const char *name, int name_len, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; - struct map_source *source; - struct mapent_cache *mc; + struct map_source *source = map; + struct mapent_cache *mc = source->mc; struct mapent *me; char key[KEY_MAX_LEN + 1]; int key_len; @@ -3863,12 +3861,6 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * int status = 0; int ret = 1; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - - mc = source->mc; - debug(ap->logopt, MODPREFIX "looking up %s", name); if (!(source->flags & MAP_FLAG_FORMAT_AMD)) { @@ -3997,10 +3989,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * free(lkp_key); - master_source_current_wait(ap->entry); - ap->entry->current = source; - - ret = ctxt->parse->parse_mount(ap, key, key_len, + ret = ctxt->parse->parse_mount(ap, source, key, key_len, mapent, ctxt->parse->context); if (ret) { /* Don't update negative cache when re-connecting */ diff --git a/modules/lookup_multi.c b/modules/lookup_multi.c index cf109de9..23a1b8a2 100644 --- a/modules/lookup_multi.c +++ b/modules/lookup_multi.c @@ -525,20 +525,14 @@ int lookup_read_master(struct master *master, time_t age, void *context) return NSS_STATUS_UNKNOWN; } -int lookup_read_map(struct autofs_point *ap, time_t age, void *context) +int lookup_read_map(struct autofs_point *ap, struct map_source *map, time_t age, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; - struct map_source *source; + struct map_source *source = map; int i, ret, at_least_1 = 0; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - for (i = 0; i < ctxt->n; i++) { - master_source_current_wait(ap->entry); - ap->entry->current = source; - ret = ctxt->m[i].mod->lookup_read_map(ap, age, + ret = ctxt->m[i].mod->lookup_read_map(ap, source, age, ctxt->m[i].mod->context); if (ret & LKP_FAIL || ret == LKP_NOTSUP) continue; @@ -552,20 +546,14 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context) return NSS_STATUS_SUCCESS; } -int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *context) +int lookup_mount(struct autofs_point *ap, struct map_source *map, const char *name, int name_len, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; - struct map_source *source; + struct map_source *source = map; int i; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - for (i = 0; i < ctxt->n; i++) { - master_source_current_wait(ap->entry); - ap->entry->current = source; - if (ctxt->m[i].mod->lookup_mount(ap, name, name_len, + if (ctxt->m[i].mod->lookup_mount(ap, source, name, name_len, ctxt->m[i].mod->context) == 0) return NSS_STATUS_SUCCESS; } diff --git a/modules/lookup_nisplus.c b/modules/lookup_nisplus.c index 6e9a85d1..335113be 100644 --- a/modules/lookup_nisplus.c +++ b/modules/lookup_nisplus.c @@ -220,11 +220,11 @@ int lookup_read_master(struct master *master, time_t age, void *context) return NSS_STATUS_SUCCESS; } -int lookup_read_map(struct autofs_point *ap, time_t age, void *context) +int lookup_read_map(struct autofs_point *ap, struct map_source *map, time_t age, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; - struct map_source *source; - struct mapent_cache *mc; + struct map_source *source = map; + struct mapent_cache *mc = source->mc; char *tablename; nis_result *result; nis_object *this; @@ -233,10 +233,6 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context) char buf[MAX_ERR_BUF]; int cur_state; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - /* * If we don't need to create directories (or don't need * to read an amd cache:=all map) then there's no use @@ -670,11 +666,11 @@ static int check_map_indirect(struct autofs_point *ap, return NSS_STATUS_SUCCESS; } -int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *context) +int lookup_mount(struct autofs_point *ap, struct map_source *map, const char *name, int name_len, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; - struct map_source *source; - struct mapent_cache *mc; + struct map_source *source = map; + struct mapent_cache *mc = source->mc; char key[KEY_MAX_LEN + 1]; int key_len; char *lkp_key; @@ -685,12 +681,6 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * int status; int ret = 1; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - - mc = source->mc; - debug(ap->logopt, MODPREFIX "looking up %s", name); if (!(source->flags & MAP_FLAG_FORMAT_AMD)) { @@ -821,10 +811,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * free(lkp_key); - master_source_current_wait(ap->entry); - ap->entry->current = source; - - ret = ctxt->parse->parse_mount(ap, key, key_len, + ret = ctxt->parse->parse_mount(ap, source, key, key_len, mapent, ctxt->parse->context); if (ret) { free(mapent); diff --git a/modules/lookup_program.c b/modules/lookup_program.c index b5eb1117..fd90fb87 100644 --- a/modules/lookup_program.c +++ b/modules/lookup_program.c @@ -166,11 +166,8 @@ int lookup_read_master(struct master *master, time_t age, void *context) return NSS_STATUS_UNKNOWN; } -int lookup_read_map(struct autofs_point *ap, time_t age, void *context) +int lookup_read_map(struct autofs_point *ap, struct map_source *map, time_t age, void *context) { - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - return NSS_STATUS_UNKNOWN; } @@ -585,21 +582,15 @@ static int match_key(struct autofs_point *ap, return ret; } -int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *context) +int lookup_mount(struct autofs_point *ap, struct map_source *map, const char *name, int name_len, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; - struct map_source *source; - struct mapent_cache *mc; + struct map_source *source = map; + struct mapent_cache *mc = source->mc; char *mapent = NULL; struct mapent *me; int ret = 1; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - - mc = source->mc; - /* Check if we recorded a mount fail for this key anywhere */ me = lookup_source_mapent(ap, name, LKP_DISTINCT); if (me) { @@ -649,10 +640,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * strcpy(ent, me->mapent); } cache_unlock(mc); - master_source_current_wait(ap->entry); - ap->entry->current = source; - ret = ctxt->parse->parse_mount(ap, name, - name_len, ent, ctxt->parse->context); + ret = ctxt->parse->parse_mount(ap, source, + name, name_len, ent, + ctxt->parse->context); if (ent) free(ent); goto out_free; @@ -684,10 +674,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * debug(ap->logopt, MODPREFIX "%s -> %s", name, mapent); - master_source_current_wait(ap->entry); - ap->entry->current = source; - - ret = ctxt->parse->parse_mount(ap, name, name_len, + ret = ctxt->parse->parse_mount(ap, source, name, name_len, mapent, ctxt->parse->context); out_free: if (mapent) diff --git a/modules/lookup_sss.c b/modules/lookup_sss.c index 43545b0c..7eb7e783 100644 --- a/modules/lookup_sss.c +++ b/modules/lookup_sss.c @@ -771,23 +771,17 @@ int lookup_read_master(struct master *master, time_t age, void *context) return NSS_STATUS_SUCCESS; } -int lookup_read_map(struct autofs_point *ap, time_t age, void *context) +int lookup_read_map(struct autofs_point *ap, struct map_source *map, time_t age, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; - struct map_source *source; - struct mapent_cache *mc; + struct map_source *source = map; + struct mapent_cache *mc = source->mc; void *sss_ctxt = NULL; char *key; char *value = NULL; char *s_key; int count, ret; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - - mc = source->mc; - /* * If we don't need to create directories (or don't need * to read an amd cache:=all map) then there's no use @@ -873,11 +867,10 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context) return NSS_STATUS_SUCCESS; } -static int lookup_one(struct autofs_point *ap, - char *qKey, int qKey_len, struct lookup_context *ctxt) +static int lookup_one(struct autofs_point *ap, struct map_source *source, + char *qKey, int qKey_len, struct lookup_context *ctxt) { - struct map_source *source; - struct mapent_cache *mc; + struct mapent_cache *mc = source->mc; struct mapent *we; void *sss_ctxt = NULL; time_t age = monotonic_time(NULL); @@ -885,12 +878,6 @@ static int lookup_one(struct autofs_point *ap, char *s_key; int err, ret; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - - mc = source->mc; - ret = setautomntent(ap->logopt, ctxt, &sss_ctxt, SSS_LOOKUP_KEY); if (ret) return ret; @@ -983,24 +970,14 @@ wild: } static int check_map_indirect(struct autofs_point *ap, - char *key, int key_len, + struct map_source *source, char *key, int key_len, struct lookup_context *ctxt) { - struct map_source *source; - struct mapent_cache *mc; + struct mapent_cache *mc = source->mc; int ret, cur_state; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - - mc = source->mc; - - master_source_current_wait(ap->entry); - ap->entry->current = source; - pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state); - ret = lookup_one(ap, key, key_len, ctxt); + ret = lookup_one(ap, source, key, key_len, ctxt); if (ret == NSS_STATUS_NOTFOUND) { pthread_setcancelstate(cur_state, NULL); return ret; @@ -1026,11 +1003,11 @@ static int check_map_indirect(struct autofs_point *ap, return NSS_STATUS_SUCCESS; } -int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *context) +int lookup_mount(struct autofs_point *ap, struct map_source *map, const char *name, int name_len, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; - struct map_source *source; - struct mapent_cache *mc; + struct map_source *source = map; + struct mapent_cache *mc = source->mc; struct mapent *me; char key[KEY_MAX_LEN + 1]; int key_len; @@ -1038,12 +1015,6 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * char mapent_buf[MAPENT_MAX_LEN + 1]; int ret; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - - mc = source->mc; - debug(ap->logopt, MODPREFIX "looking up %s", name); key_len = snprintf(key, KEY_MAX_LEN + 1, "%s", name); @@ -1078,10 +1049,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * if (!lkp_key) return NSS_STATUS_UNKNOWN; - master_source_current_wait(ap->entry); - ap->entry->current = source; - - status = check_map_indirect(ap, lkp_key, strlen(lkp_key), ctxt); + status = check_map_indirect(ap, source, lkp_key, strlen(lkp_key), ctxt); free(lkp_key); if (status) return status; @@ -1128,11 +1096,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * if (!mapent) return NSS_STATUS_TRYAGAIN; - master_source_current_wait(ap->entry); - ap->entry->current = source; - debug(ap->logopt, MODPREFIX "%s -> %s", key, mapent); - ret = ctxt->parse->parse_mount(ap, key, key_len, + + ret = ctxt->parse->parse_mount(ap, source, key, key_len, mapent, ctxt->parse->context); if (ret) { /* Don't update negative cache when re-connecting */ diff --git a/modules/lookup_userhome.c b/modules/lookup_userhome.c index 8117640f..80bf04eb 100644 --- a/modules/lookup_userhome.c +++ b/modules/lookup_userhome.c @@ -46,27 +46,19 @@ int lookup_read_master(struct master *master, time_t age, void *context) return NSS_STATUS_UNKNOWN; } -int lookup_read_map(struct autofs_point *ap, time_t age, void *context) +int lookup_read_map(struct autofs_point *ap, struct map_source *map, time_t age, void *context) { - ap->entry->current = NULL; - master_source_current_signal(ap->entry); return NSS_STATUS_UNKNOWN; } -int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *context) +int lookup_mount(struct autofs_point *ap, struct map_source *map, const char *name, int name_len, void *context) { - struct map_source *source; - struct mapent_cache *mc; + struct map_source *source = map; + struct mapent_cache *mc = source->mc; struct passwd *pw; char buf[MAX_ERR_BUF]; int ret; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - - mc = source->mc; - debug(ap->logopt, MODPREFIX "looking up %s", name); /* Get the equivalent username */ diff --git a/modules/lookup_yp.c b/modules/lookup_yp.c index d2a4b5a5..40ca31a8 100644 --- a/modules/lookup_yp.c +++ b/modules/lookup_yp.c @@ -59,6 +59,8 @@ struct callback_data { int lookup_version = AUTOFS_LOOKUP_VERSION; /* Required by protocol */ +static pthread_mutex_t defaults_mutex = PTHREAD_MUTEX_INITIALIZER; + static unsigned int get_map_order(const char *domain, const char *map) { char key[] = "YP_LAST_MODIFIED"; @@ -392,20 +394,16 @@ int yp_all_callback(int status, char *ypkey, int ypkeylen, return 0; } -int lookup_read_map(struct autofs_point *ap, time_t age, void *context) +int lookup_read_map(struct autofs_point *ap, struct map_source *map, time_t age, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; struct ypall_callback ypcb; struct callback_data ypcb_data; unsigned int logopt = ap->logopt; - struct map_source *source; + struct map_source *source = map; char *mapname; int err; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - /* * If we don't need to create directories (or don't need * to read an amd cache:=all map) then there's no use @@ -457,9 +455,9 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context) } source->age = age; - pthread_mutex_lock(&ap->entry->current_mutex); + pthread_mutex_lock(&defaults_mutex); ctxt->check_defaults = 0; - pthread_mutex_unlock(&ap->entry->current_mutex); + pthread_mutex_unlock(&defaults_mutex); return NSS_STATUS_SUCCESS; } @@ -685,7 +683,7 @@ static int check_map_indirect(struct autofs_point *ap, mc = source->mc; /* Only read map if it has been modified */ - pthread_mutex_lock(&ap->entry->current_mutex); + pthread_mutex_lock(&defaults_mutex); map_order = get_map_order(ctxt->domainname, ctxt->mapname); if (map_order > ctxt->order) { ctxt->order = map_order; @@ -702,7 +700,7 @@ static int check_map_indirect(struct autofs_point *ap, } else ctxt->check_defaults = 0; } - pthread_mutex_unlock(&ap->entry->current_mutex); + pthread_mutex_unlock(&defaults_mutex); /* check map and if change is detected re-read map */ ret = match_key(ap, source, key, key_len, ctxt); @@ -782,11 +780,11 @@ static int check_map_indirect(struct autofs_point *ap, return NSS_STATUS_SUCCESS; } -int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *context) +int lookup_mount(struct autofs_point *ap, struct map_source *map, const char *name, int name_len, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; - struct map_source *source; - struct mapent_cache *mc; + struct map_source *source = map; + struct mapent_cache *mc = source->mc; char key[KEY_MAX_LEN + 1]; int key_len; char *lkp_key; @@ -797,12 +795,6 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * int status = 0; int ret = 1; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - - mc = source->mc; - debug(ap->logopt, MODPREFIX "looking up %s", name); if (!(source->flags & MAP_FLAG_FORMAT_AMD)) { @@ -939,10 +931,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * free(lkp_key); - master_source_current_wait(ap->entry); - ap->entry->current = source; - - ret = ctxt->parse->parse_mount(ap, key, key_len, + ret = ctxt->parse->parse_mount(ap, source, key, key_len, mapent, ctxt->parse->context); free(mapent); if (ret) { diff --git a/modules/parse_amd.c b/modules/parse_amd.c index 1a46ae0d..fb6b1b76 100644 --- a/modules/parse_amd.c +++ b/modules/parse_amd.c @@ -1390,12 +1390,9 @@ static int do_host_mount(struct autofs_point *ap, const char *name, cache_push_mapent(me, NULL); cache_unlock(source->mc); - master_source_current_wait(ap->entry); - ap->entry->current = instance; - map_module_readlock(instance); lookup = instance->lookup; - ret = lookup->lookup_mount(ap, entry->rhost, + ret = lookup->lookup_mount(ap, instance, entry->rhost, strlen(entry->rhost), lookup->context); map_module_unlock(instance); @@ -2210,13 +2207,14 @@ done: return defaults_entry; } -int parse_mount(struct autofs_point *ap, const char *name, - int name_len, const char *mapent, void *context) +int parse_mount(struct autofs_point *ap, struct map_source *map, + const char *name, int name_len, const char *mapent, + void *context) { struct parse_context *ctxt = (struct parse_context *) context; unsigned int flags = conf_amd_get_flags(ap->path); struct substvar *sv = NULL; - struct map_source *source; + struct map_source *source = map; unsigned int at_least_one; struct list_head entries, *p, *head; struct amd_entry *defaults_entry; @@ -2226,10 +2224,6 @@ int parse_mount(struct autofs_point *ap, const char *name, int cur_state; int ret; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - if (!mapent) { warn(ap->logopt, MODPREFIX "error: empty map entry"); return 1; diff --git a/modules/parse_hesiod.c b/modules/parse_hesiod.c index a02da822..810b4053 100644 --- a/modules/parse_hesiod.c +++ b/modules/parse_hesiod.c @@ -272,8 +272,9 @@ int parse_done(void *context) return 0; } -int parse_mount(struct autofs_point *ap, const char *name, - int name_len, const char *mapent, void *context) +int parse_mount(struct autofs_point *ap, struct map_source *map, + const char *name, int name_len, const char *mapent, + void *context) { char source[HESIOD_LEN + 1]; char fstype[HESIOD_LEN + 1]; @@ -282,9 +283,6 @@ int parse_mount(struct autofs_point *ap, const char *name, const char *p; int ret; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - p = mapent; q = fstype; diff --git a/modules/parse_sun.c b/modules/parse_sun.c index 09ec6d4d..cb3e22a0 100644 --- a/modules/parse_sun.c +++ b/modules/parse_sun.c @@ -1310,13 +1310,14 @@ static void cleanup_offset_entries(struct autofs_point *ap, * level nexting point. Finally to mount non multi-mounts and to mount a * lower level multi-mount nesting point and its offsets. */ -int parse_mount(struct autofs_point *ap, const char *name, - int name_len, const char *mapent, void *context) +int parse_mount(struct autofs_point *ap, struct map_source *map, + const char *name, int name_len, const char *mapent, + void *context) { struct parse_context *ctxt = (struct parse_context *) context; char buf[MAX_ERR_BUF]; - struct map_source *source; - struct mapent_cache *mc; + struct map_source *source = map; + struct mapent_cache *mc = source->mc; struct mapent *me, *oe, *tmp; LIST_HEAD(offsets); char *pmapent, *options; @@ -1326,12 +1327,6 @@ int parse_mount(struct autofs_point *ap, const char *name, int slashify = ctxt->slashify_colons; unsigned int append_options; - source = ap->entry->current; - ap->entry->current = NULL; - master_source_current_signal(ap->entry); - - mc = source->mc; - if (!mapent) { warn(ap->logopt, MODPREFIX "error: empty map entry"); return 1;