|
Ian Kent |
ea444d |
autofs-5.0.3 - library reload fix
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
From: Ian Kent <raven@themaw.net>
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
During a map re-read autofs needs to re-open its lookup libraries but
|
|
Ian Kent |
ea444d |
dependent shared libraries can't handle being unloaded and then re-loaded
|
|
Ian Kent |
ea444d |
by the same process. This patch preventis dependent libraries from being
|
|
Ian Kent |
ea444d |
unloaded during this re-open.
|
|
Ian Kent |
ea444d |
---
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
daemon/automount.c | 1 -
|
|
Ian Kent |
ea444d |
daemon/lookup.c | 21 +++++++++------------
|
|
Ian Kent |
ea444d |
daemon/state.c | 3 +++
|
|
Ian Kent |
ea444d |
include/master.h | 17 +++--------------
|
|
Ian Kent |
ea444d |
lib/master.c | 28 ++++++++++++++++++++++------
|
|
Ian Kent |
ea444d |
5 files changed, 37 insertions(+), 33 deletions(-)
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
--- autofs-5.0.3.orig/daemon/automount.c
|
|
Ian Kent |
ea444d |
+++ autofs-5.0.3/daemon/automount.c
|
|
Ian Kent |
ea444d |
@@ -85,7 +85,6 @@ int aquire_flag_file(void);
|
|
Ian Kent |
ea444d |
void release_flag_file(void);
|
|
Ian Kent |
ea444d |
static int umount_all(struct autofs_point *ap, int force);
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
-extern pthread_mutex_t master_mutex;
|
|
Ian Kent |
ea444d |
extern struct master *master_list;
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
static int do_mkdir(const char *parent, const char *path, mode_t mode)
|
|
Ian Kent |
ea444d |
--- autofs-5.0.3.orig/daemon/lookup.c
|
|
Ian Kent |
ea444d |
+++ autofs-5.0.3/daemon/lookup.c
|
|
Ian Kent |
ea444d |
@@ -267,17 +267,17 @@ static int do_read_map(struct autofs_poi
|
|
Ian Kent |
ea444d |
struct lookup_mod *lookup;
|
|
Ian Kent |
ea444d |
int status;
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
- if (!map->lookup) {
|
|
Ian Kent |
ea444d |
- lookup = open_lookup(map->type, "",
|
|
Ian Kent |
ea444d |
- map->format, map->argc, map->argv);
|
|
Ian Kent |
ea444d |
- if (!lookup) {
|
|
Ian Kent |
ea444d |
- debug(ap->logopt, "lookup module %s failed", map->type);
|
|
Ian Kent |
ea444d |
- return NSS_STATUS_UNAVAIL;
|
|
Ian Kent |
ea444d |
- }
|
|
Ian Kent |
ea444d |
- map->lookup = lookup;
|
|
Ian Kent |
ea444d |
+ lookup = open_lookup(map->type, "", map->format, map->argc, map->argv);
|
|
Ian Kent |
ea444d |
+ if (!lookup) {
|
|
Ian Kent |
ea444d |
+ debug(ap->logopt, "lookup module %s failed", map->type);
|
|
Ian Kent |
ea444d |
+ return NSS_STATUS_UNAVAIL;
|
|
Ian Kent |
ea444d |
}
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
- lookup = map->lookup;
|
|
Ian Kent |
ea444d |
+ master_source_writelock(ap->entry);
|
|
Ian Kent |
ea444d |
+ if (map->lookup)
|
|
Ian Kent |
ea444d |
+ close_lookup(map->lookup);
|
|
Ian Kent |
ea444d |
+ map->lookup = lookup;
|
|
Ian Kent |
ea444d |
+ master_source_unlock(ap->entry);
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
/* If we don't need to create directories then there's no use
|
|
Ian Kent |
ea444d |
* reading the map. We just need to test that the map is valid
|
|
Ian Kent |
ea444d |
@@ -463,8 +463,6 @@ int lookup_nss_read_map(struct autofs_po
|
|
Ian Kent |
ea444d |
* point in the master map) do the nss lookup to
|
|
Ian Kent |
ea444d |
* locate the map and read it.
|
|
Ian Kent |
ea444d |
*/
|
|
Ian Kent |
ea444d |
- pthread_cleanup_push(master_source_lock_cleanup, entry);
|
|
Ian Kent |
ea444d |
- master_source_readlock(entry);
|
|
Ian Kent |
ea444d |
if (source)
|
|
Ian Kent |
ea444d |
map = source;
|
|
Ian Kent |
ea444d |
else
|
|
Ian Kent |
ea444d |
@@ -557,7 +555,6 @@ int lookup_nss_read_map(struct autofs_po
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
map = map->next;
|
|
Ian Kent |
ea444d |
}
|
|
Ian Kent |
ea444d |
- pthread_cleanup_pop(1);
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
if (!result || at_least_one)
|
|
Ian Kent |
ea444d |
return 1;
|
|
Ian Kent |
ea444d |
--- autofs-5.0.3.orig/daemon/state.c
|
|
Ian Kent |
ea444d |
+++ autofs-5.0.3/daemon/state.c
|
|
Ian Kent |
ea444d |
@@ -387,9 +387,12 @@ static void *do_readmap(void *arg)
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
info(ap->logopt, "re-reading map for %s", ap->path);
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
+ pthread_cleanup_push(master_mutex_lock_cleanup, NULL);
|
|
Ian Kent |
ea444d |
+ master_mutex_lock();
|
|
Ian Kent |
ea444d |
status = lookup_nss_read_map(ap, NULL, now);
|
|
Ian Kent |
ea444d |
if (!status)
|
|
Ian Kent |
ea444d |
pthread_exit(NULL);
|
|
Ian Kent |
ea444d |
+ pthread_cleanup_pop(1);
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
if (ap->type == LKP_INDIRECT) {
|
|
Ian Kent |
ea444d |
lookup_prune_cache(ap, now);
|
|
Ian Kent |
ea444d |
--- autofs-5.0.3.orig/include/master.h
|
|
Ian Kent |
ea444d |
+++ autofs-5.0.3/include/master.h
|
|
Ian Kent |
ea444d |
@@ -70,6 +70,9 @@ int master_parse_entry(const char *, uns
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
/* From master.c master parser utility routines */
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
+void master_mutex_lock(void);
|
|
Ian Kent |
ea444d |
+void master_mutex_unlock(void);
|
|
Ian Kent |
ea444d |
+void master_mutex_lock_cleanup(void *);
|
|
Ian Kent |
ea444d |
void master_set_default_timeout(void);
|
|
Ian Kent |
ea444d |
void master_set_default_ghost_mode(void);
|
|
Ian Kent |
ea444d |
int master_add_autofs_point(struct master_mapent *, time_t, unsigned, unsigned, int);
|
|
Ian Kent |
ea444d |
@@ -108,18 +111,4 @@ extern inline unsigned int master_get_lo
|
|
Ian Kent |
ea444d |
int master_list_empty(struct master *);
|
|
Ian Kent |
ea444d |
int master_kill(struct master *);
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
-#define master_mutex_lock() \
|
|
Ian Kent |
ea444d |
-do { \
|
|
Ian Kent |
ea444d |
- int status = pthread_mutex_lock(&master_mutex); \
|
|
Ian Kent |
ea444d |
- if (status) \
|
|
Ian Kent |
ea444d |
- fatal(status); \
|
|
Ian Kent |
ea444d |
-} while (0)
|
|
Ian Kent |
ea444d |
-
|
|
Ian Kent |
ea444d |
-#define master_mutex_unlock() \
|
|
Ian Kent |
ea444d |
-do { \
|
|
Ian Kent |
ea444d |
- int status = pthread_mutex_unlock(&master_mutex); \
|
|
Ian Kent |
ea444d |
- if (status) \
|
|
Ian Kent |
ea444d |
- fatal(status); \
|
|
Ian Kent |
ea444d |
-} while (0)
|
|
Ian Kent |
ea444d |
-
|
|
Ian Kent |
ea444d |
#endif
|
|
Ian Kent |
ea444d |
--- autofs-5.0.3.orig/lib/master.c
|
|
Ian Kent |
ea444d |
+++ autofs-5.0.3/lib/master.c
|
|
Ian Kent |
ea444d |
@@ -41,8 +41,28 @@ static struct map_source *
|
|
Ian Kent |
ea444d |
__master_find_map_source(struct master_mapent *,
|
|
Ian Kent |
ea444d |
const char *, const char *, int, const char **);
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
-pthread_mutex_t master_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
Ian Kent |
ea444d |
-pthread_mutex_t instance_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
Ian Kent |
ea444d |
+static pthread_mutex_t master_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
Ian Kent |
ea444d |
+static pthread_mutex_t instance_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
Ian Kent |
ea444d |
+
|
|
Ian Kent |
ea444d |
+void master_mutex_lock(void)
|
|
Ian Kent |
ea444d |
+{
|
|
Ian Kent |
ea444d |
+ int status = pthread_mutex_lock(&master_mutex);
|
|
Ian Kent |
ea444d |
+ if (status)
|
|
Ian Kent |
ea444d |
+ fatal(status);
|
|
Ian Kent |
ea444d |
+}
|
|
Ian Kent |
ea444d |
+
|
|
Ian Kent |
ea444d |
+void master_mutex_unlock(void)
|
|
Ian Kent |
ea444d |
+{
|
|
Ian Kent |
ea444d |
+ int status = pthread_mutex_unlock(&master_mutex);
|
|
Ian Kent |
ea444d |
+ if (status)
|
|
Ian Kent |
ea444d |
+ fatal(status);
|
|
Ian Kent |
ea444d |
+}
|
|
Ian Kent |
ea444d |
+
|
|
Ian Kent |
ea444d |
+void master_mutex_lock_cleanup(void *arg)
|
|
Ian Kent |
ea444d |
+{
|
|
Ian Kent |
ea444d |
+ master_mutex_unlock();
|
|
Ian Kent |
ea444d |
+ return;
|
|
Ian Kent |
ea444d |
+}
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
int master_add_autofs_point(struct master_mapent *entry,
|
|
Ian Kent |
ea444d |
time_t timeout, unsigned logopt, unsigned ghost, int submount)
|
|
Ian Kent |
ea444d |
@@ -1109,10 +1129,6 @@ int master_mount_mounts(struct master *m
|
|
Ian Kent |
ea444d |
continue;
|
|
Ian Kent |
ea444d |
}
|
|
Ian Kent |
ea444d |
|
|
Ian Kent |
ea444d |
- master_source_writelock(ap->entry);
|
|
Ian Kent |
ea444d |
- lookup_close_lookup(ap);
|
|
Ian Kent |
ea444d |
- master_source_unlock(ap->entry);
|
|
Ian Kent |
ea444d |
-
|
|
Ian Kent |
ea444d |
cache_readlock(nc);
|
|
Ian Kent |
ea444d |
ne = cache_lookup_distinct(nc, this->path);
|
|
Ian Kent |
ea444d |
if (ne && this->age > ne->age) {
|