diff --git a/CHANGELOG b/CHANGELOG index 9f4e4b4..c09ae44 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -6,6 +6,7 @@ - cthon multi-map locking fix and current race corrections. - cthon shutdown expire fix. - cthon more map parser corrections. +- cthon cleanup and corrections. 13/7/2006 autofs-5.0.1 rc1 -------------------------- diff --git a/daemon/automount.c b/daemon/automount.c index 1d0e64f..21f0378 100644 --- a/daemon/automount.c +++ b/daemon/automount.c @@ -314,7 +314,7 @@ static int umount_ent(struct autofs_poin if (rv && (ap->state == ST_SHUTDOWN_FORCE || ap->state == ST_SHUTDOWN)) { ret = stat(path, &st); if (ret == -1 && errno == ENOENT) { - error(ap->logopt, "mount point does not exist"); + warn(ap->logopt, "mount point does not exist"); status = pthread_mutex_unlock(&ap->state_mutex); if (status) fatal(status); @@ -322,7 +322,7 @@ static int umount_ent(struct autofs_poin } if (ret == 0 && !S_ISDIR(st.st_mode)) { - error(ap->logopt, "mount point is not a directory"); + warn(ap->logopt, "mount point is not a directory"); status = pthread_mutex_unlock(&ap->state_mutex); if (status) fatal(status); @@ -440,7 +440,7 @@ static int rm_unwanted_fn(const char *fi debug(LOGOPT_ANY, "removing directory %s", file); if (rmdir(file)) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(LOGOPT_ANY, + warn(LOGOPT_ANY, "unable to remove directory %s: %s", file, estr); return 0; } @@ -570,36 +570,38 @@ int umount_multi(struct autofs_point *ap if (!strcmp(mptr->fs_type, "autofs")) continue; + sched_yield(); + if (umount_offsets(ap, mnts, mptr->path)) - error(ap->logopt, "could not umount some offsets under %s", + warn(ap->logopt, "could not umount some offsets under %s", mptr->path); + sched_yield(); + debug(ap->logopt, "unmounting dir = %s", mptr->path); if (umount_ent(ap, mptr->path, mptr->fs_type)) { left++; } - - sched_yield(); } /* Lastly check for offsets with no root mount */ n = scandir(path, &de, 0, alphasort); - if (n) { + if (n && n != -1) { char buf[PATH_MAX + 1]; while (n--) { size_t size; int ret; + sched_yield(); + if (strcmp(de[n]->d_name, ".") == 0 || strcmp(de[n]->d_name, "..") == 0) { free(de[n]); continue; } - sched_yield(); - size = sizeof(buf); ret = cat_path(buf, size, path, de[n]->d_name); if (!ret) { @@ -612,7 +614,7 @@ int umount_multi(struct autofs_point *ap if (!tree_is_mounted(mnts, buf)) { if (umount_offsets(ap, mnts, buf)) { - error(ap->logopt, + warn(ap->logopt, "could not umount some offsets under %s", buf); left++; @@ -624,8 +626,9 @@ int umount_multi(struct autofs_point *ap } if (!left && !tree_is_mounted(mnts, path)) { + sched_yield(); if (umount_offsets(ap, mnts, path)) { - error(ap->logopt, + warn(ap->logopt, "could not umount some offsets under %s", path); left++; } @@ -831,11 +834,10 @@ int do_expire(struct autofs_point *ap, c mnts = tree_make_mnt_tree(_PROC_MOUNTS, buf); ret = umount_multi(ap, mnts, buf, 1); - if (ret == 0) { + if (ret == 0) msg("expired %s", buf); - } else { + else error(ap->logopt, "error while expiring %s", buf); - } tree_free_mnt_tree(mnts); @@ -1258,8 +1260,6 @@ static void handle_mounts_cleanup(void * sched_yield(); - sched_yield(); - if (clean) { if (rmdir(path) == -1) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); @@ -1415,7 +1415,7 @@ void *handle_mounts(void *arg) * So, the solution is a recipe for disaster. * Hope we don't get a really busy system! */ - sleep(5); + sleep(1); /* sched_yield(); */ return NULL; diff --git a/daemon/direct.c b/daemon/direct.c index 4ee8a03..3905ed0 100644 --- a/daemon/direct.c +++ b/daemon/direct.c @@ -140,12 +140,12 @@ int do_umount_autofs_direct(struct autof switch (errno) { case ENOENT: case EINVAL: - error(ap->logopt, "mount point %s does not exist", + warn(ap->logopt, "mount point %s does not exist", me->key); return 0; break; case EBUSY: - error(ap->logopt, "mount point %s is in use", me->key); + warn(ap->logopt, "mount point %s is in use", me->key); if (ap->state == ST_SHUTDOWN_FORCE) goto force_umount; else @@ -246,13 +246,13 @@ static int unlink_mount_tree(struct auto switch (errno) { case EINVAL: - debug(ap->logopt, + warn(ap->logopt, "bad superblock or not mounted"); break; case ENOENT: case EFAULT: - debug(ap->logopt, "bad path for mount"); + warn(ap->logopt, "bad path for mount"); break; } } @@ -494,10 +494,10 @@ int umount_autofs_offset(struct autofs_p rv = umount(me->key); if (rv == -1) { if (errno == ENOENT) { - error(ap->logopt, "mount point does not exist"); + warn(ap->logopt, "mount point does not exist"); return 0; } else if (errno == EBUSY) { - error(ap->logopt, "mount point %s is in use", me->key); + warn(ap->logopt, "mount point %s is in use", me->key); if (ap->state != ST_SHUTDOWN_FORCE) return 0; } else if (errno == ENOTDIR) { @@ -534,7 +534,7 @@ int mount_autofs_offset(struct autofs_po if (is_mounted(_PROC_MOUNTS, me->key, MNTS_AUTOFS)) { if (ap->state != ST_READMAP) - debug(ap->logopt, + warn(ap->logopt, "trigger %s already mounted", me->key); return 0; } diff --git a/daemon/indirect.c b/daemon/indirect.c index c46326c..0c47cfd 100644 --- a/daemon/indirect.c +++ b/daemon/indirect.c @@ -106,13 +106,13 @@ static int unlink_mount_tree(struct auto switch (errno) { case EINVAL: - debug(ap->logopt, + warn(ap->logopt, "bad superblock or not mounted"); break; case ENOENT: case EFAULT: - debug(ap->logopt, "bad path for mount"); + warn(ap->logopt, "bad path for mount"); break; } } @@ -329,12 +329,12 @@ int umount_autofs_indirect(struct autofs switch (errno) { case ENOENT: case EINVAL: - error(ap->logopt, + warn(ap->logopt, "mount point %s does not exist", ap->path); return 0; break; case EBUSY: - error(ap->logopt, + warn(ap->logopt, "mount point %s is in use", ap->path); if (ap->state == ST_SHUTDOWN_FORCE) goto force_umount; @@ -457,7 +457,7 @@ void *expire_proc_indirect(void *arg) ret = ioctl(ioctlfd, AUTOFS_IOC_EXPIRE_MULTI, &now); if (ret < 0 && errno != EAGAIN) { - debug(ap->logopt, + warn(ap->logopt, "failed to expire mount %s", next->path); ea->status = 1; break; @@ -490,7 +490,7 @@ void *expire_proc_indirect(void *arg) while (offsets--) { ret = ioctl(ap->ioctlfd, AUTOFS_IOC_EXPIRE_MULTI, &now); if (ret < 0 && errno != EAGAIN) { - debug(ap->logopt, + warn(ap->logopt, "failed to expire ofsets under %s", ap->path); ea->status = 1; @@ -529,7 +529,7 @@ void *expire_proc_indirect(void *arg) if (!ioctl(ap->ioctlfd, AUTOFS_IOC_ASKUMOUNT, &ret)) { if (!ret) { - debug(ap->logopt, + warn(ap->logopt, "mount still busy %s", ap->path); ea->status = 1; } diff --git a/daemon/lookup.c b/daemon/lookup.c index cad98d2..f0f9718 100644 --- a/daemon/lookup.c +++ b/daemon/lookup.c @@ -253,6 +253,9 @@ static int do_read_map(struct autofs_poi if (!ap->ghost && ap->type != LKP_DIRECT) return NSS_STATUS_SUCCESS; + master_source_current_wait(ap->entry); + ap->entry->current = map; + status = lookup->lookup_read_map(ap, age, lookup->context); /* @@ -414,8 +417,6 @@ int lookup_nss_read_map(struct autofs_po if (map->type) { debug(ap->logopt, "reading map %s %s", map->type, map->argv[0]); - master_source_current_wait(entry); - entry->current = map; result = do_read_map(ap, map, age); map = map->next; continue; @@ -432,14 +433,10 @@ int lookup_nss_read_map(struct autofs_po map->type = tmp; debug(ap->logopt, "reading map %s %s", tmp, map->argv[0]); - master_source_current_wait(entry); - entry->current = map; result = do_read_map(ap, map, age); } else { debug(ap->logopt, "reading map file %s", map->argv[0]); - master_source_current_wait(entry); - entry->current = map; result = read_file_source_instance(ap, map, age); } map = map->next; @@ -464,8 +461,6 @@ int lookup_nss_read_map(struct autofs_po debug(ap->logopt, "reading map %s %s", this->source, map->argv[0]); - master_source_current_wait(entry); - entry->current = map; result = read_map_source(this, ap, map, age); if (result == NSS_STATUS_UNKNOWN) continue; @@ -592,6 +587,9 @@ int do_lookup_mount(struct autofs_point lookup = map->lookup; + master_source_current_wait(ap->entry); + ap->entry->current = map; + status = lookup->lookup_mount(ap, name, name_len, lookup->context); return status; @@ -746,8 +744,6 @@ int lookup_nss_mount(struct autofs_point sched_yield(); if (map->type) { - master_source_current_wait(entry); - entry->current = map; result = do_lookup_mount(ap, map, name, name_len); if (result == NSS_STATUS_SUCCESS) @@ -766,14 +762,9 @@ int lookup_nss_mount(struct autofs_point continue; } map->type = tmp; - master_source_current_wait(entry); - entry->current = map; result = do_lookup_mount(ap, map, name, name_len); - } else { - master_source_current_wait(entry); - entry->current = map; + } else result = lookup_name_file_source_instance(ap, map, name, name_len); - } if (result == NSS_STATUS_SUCCESS) break; @@ -798,8 +789,6 @@ int lookup_nss_mount(struct autofs_point this = list_entry(p, struct nss_source, list); - master_source_current_wait(entry); - entry->current = map; result = lookup_map_name(this, ap, map, name, name_len); if (result == NSS_STATUS_UNKNOWN) { diff --git a/lib/master.c b/lib/master.c index f54fffe..9d16801 100644 --- a/lib/master.c +++ b/lib/master.c @@ -181,13 +181,7 @@ master_add_map_source(struct master_mape source->age = age; source->stale = 1; -/* - source->mc = cache_init(source); - if (!source->mc) { - master_free_map_source(source); - return NULL; - } -*/ + tmpargv = copy_argv(argc, argv); if (!tmpargv) { master_free_map_source(source, 0); @@ -343,7 +337,7 @@ void master_free_map_source(struct map_s instance = source->instance; while (instance) { next = instance->next; - master_free_map_source(instance, free_cache); + master_free_map_source(instance, 0); instance = next; } @@ -434,6 +428,7 @@ master_add_source_instance(struct map_so } new->age = age; + new->mc = source->mc; tmpargv = copy_argv(source->argc, source->argv); if (!tmpargv) { @@ -519,6 +514,8 @@ void master_source_current_wait(struct m { int status; + debug(LOGOPT_ANY, "locking"); + status = pthread_mutex_lock(&entry->current_mutex); if (status) { error(LOGOPT_ANY, "entry current source lock failed"); @@ -555,6 +552,8 @@ void master_source_current_signal(struct fatal(status); } + debug(LOGOPT_ANY, "unlocking"); + return; } diff --git a/modules/lookup_file.c b/modules/lookup_file.c index 6306084..81ade74 100644 --- a/modules/lookup_file.c +++ b/modules/lookup_file.c @@ -193,7 +193,7 @@ static int read_one(FILE *f, char *key, else { if (key_len == KEY_MAX_LEN) { state = st_badent; - error(LOGOPT_ANY, + warn(LOGOPT_ANY, MODPREFIX "map key \"%s...\" " "is too long. The maximum key " "length is %d", key, @@ -243,7 +243,7 @@ static int read_one(FILE *f, char *key, state = st_badent; ungetc(nch, f); gotten = got_nothing; - error(LOGOPT_ANY, MODPREFIX + warn(LOGOPT_ANY, MODPREFIX "bad map entry \"%s...\" for key " "\"%s\"", mapent, key); break; @@ -261,7 +261,7 @@ static int read_one(FILE *f, char *key, goto got_it; ungetc(nch, f); } else { - error(LOGOPT_ANY, + warn(LOGOPT_ANY, MODPREFIX "map entry \"%s...\" for key " "\"%s\" is too long. The maximum entry" " size is %d", mapent, key, diff --git a/modules/lookup_hesiod.c b/modules/lookup_hesiod.c index 4491c16..1664afc 100644 --- a/modules/lookup_hesiod.c +++ b/modules/lookup_hesiod.c @@ -86,6 +86,9 @@ int lookup_read_master(struct master *ma int lookup_read_map(struct autofs_point *ap, time_t age, void *context) { + ap->entry->current = NULL; + master_source_current_signal(ap->entry); + return NSS_STATUS_UNKNOWN; } @@ -103,6 +106,9 @@ int lookup_mount(struct autofs_point *ap char **record, *best_record = NULL, *p; int priority, lowest_priority = INT_MAX; + ap->entry->current = NULL; + master_source_current_signal(ap->entry); + debug(ap->logopt, MODPREFIX "looking up root=\"%s\", name=\"%s\"", ap->path, name); diff --git a/modules/lookup_multi.c b/modules/lookup_multi.c index a3363b7..00ab28e 100644 --- a/modules/lookup_multi.c +++ b/modules/lookup_multi.c @@ -133,9 +133,16 @@ int lookup_read_master(struct master *ma int lookup_read_map(struct autofs_point *ap, time_t age, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; + struct map_source *source; 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, ctxt->m[i].mod->context); if (ret & LKP_FAIL || ret == LKP_NOTSUP) @@ -153,9 +160,16 @@ int lookup_read_map(struct autofs_point int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; + struct map_source *source; 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, ctxt->m[i].mod->context) == 0) return NSS_STATUS_SUCCESS; diff --git a/modules/lookup_program.c b/modules/lookup_program.c index 9c69b6f..c589d05 100644 --- a/modules/lookup_program.c +++ b/modules/lookup_program.c @@ -99,6 +99,9 @@ int lookup_read_master(struct master *ma int lookup_read_map(struct autofs_point *ap, time_t age, void *context) { + ap->entry->current = NULL; + master_source_current_signal(ap->entry); + return NSS_STATUS_UNKNOWN; } diff --git a/modules/lookup_userhome.c b/modules/lookup_userhome.c index 0d84379..cc0b4fa 100644 --- a/modules/lookup_userhome.c +++ b/modules/lookup_userhome.c @@ -42,6 +42,8 @@ int lookup_read_master(struct master *ma int lookup_read_map(struct autofs_point *ap, time_t age, void *context) { + ap->entry->current = NULL; + master_source_current_signal(ap->entry); return NSS_STATUS_UNKNOWN; } @@ -50,6 +52,8 @@ int lookup_mount(struct autofs_point *ap struct passwd *pw; char buf[MAX_ERR_BUF]; + ap->entry->current = NULL; + master_source_current_signal(ap->entry); debug(ap->logopt, MODPREFIX "looking up %s", name); /* Get the equivalent username */ diff --git a/modules/parse_sun.c b/modules/parse_sun.c index 7656bb4..00b0bd3 100644 --- a/modules/parse_sun.c +++ b/modules/parse_sun.c @@ -641,7 +641,7 @@ add_offset_entry(struct autofs_point *ap p_len--; m_key_len = m_root_len + p_len; if (m_key_len > PATH_MAX) { - error(ap->logopt, MODPREFIX "multi mount key too long"); + warn(ap->logopt, MODPREFIX "multi mount key too long"); return CHE_FAIL; } strcpy(m_key, m_root); @@ -654,7 +654,7 @@ add_offset_entry(struct autofs_point *ap m_mapent_len = strlen(loc); if (m_mapent_len + m_options_len > MAPENT_MAX_LEN) { - error(ap->logopt, MODPREFIX "multi mount mapent too long"); + warn(ap->logopt, MODPREFIX "multi mount mapent too long"); return CHE_FAIL; } @@ -676,7 +676,7 @@ add_offset_entry(struct autofs_point *ap debug(ap->logopt, MODPREFIX "added multi-mount offset %s -> %s", path, m_mapent); else - debug(ap->logopt, MODPREFIX + warn(ap->logopt, MODPREFIX "syntax error or dupliate offset %s -> %s", path, loc); return ret; @@ -818,7 +818,7 @@ static int parse_mapent(const char *ent, /* Location can't begin with a '/' */ if (*p == '/') { - error(logopt, MODPREFIX "error location begins with \"/\""); + warn(logopt, MODPREFIX "error location begins with \"/\""); free(myoptions); return 0; } @@ -852,7 +852,7 @@ static int parse_mapent(const char *ent, /* Location can't begin with a '/' */ if (*p == '/') { - error(logopt, + warn(logopt, MODPREFIX "error location begins with \"/\""); free(myoptions); free(loc); @@ -873,7 +873,7 @@ static int parse_mapent(const char *ent, } if (!validate_location(ent)) { - error(logopt, + warn(logopt, MODPREFIX "invalid location %s", ent); free(ent); free(myoptions); @@ -940,7 +940,7 @@ int parse_mount(struct autofs_point *ap, mc = source->mc; if (!mapent) { - error(ap->logopt, MODPREFIX "error: empty map entry"); + warn(ap->logopt, MODPREFIX "error: empty map entry"); return 1; } @@ -1094,7 +1094,7 @@ int parse_mount(struct autofs_point *ap, path = sanitize_path(tmp, strlen(tmp)); if (!path) { - error(ap->logopt, MODPREFIX "invalid path"); + warn(ap->logopt, MODPREFIX "invalid path"); cache_readlock(mc); cache_multi_lock(mc); cache_delete_offset_list(mc, name); @@ -1132,7 +1132,7 @@ int parse_mount(struct autofs_point *ap, path, myoptions, loc, age); if (status != CHE_OK) { - error(ap->logopt, MODPREFIX "error adding multi-mount"); + warn(ap->logopt, MODPREFIX "error adding multi-mount"); cache_readlock(mc); cache_multi_lock(mc); cache_delete_offset_list(mc, name); @@ -1172,7 +1172,7 @@ int parse_mount(struct autofs_point *ap, options, &myoptions, &loc, ap->logopt); if (!rv) { error(ap->logopt, - MODPREFIX "mount of root offset failed"); + MODPREFIX "failed to mount root offset"); cache_multi_lock(mc); cache_delete_offset_list(mc, name); cache_multi_unlock(mc); @@ -1219,7 +1219,7 @@ int parse_mount(struct autofs_point *ap, /* Location can't begin with a '/' */ if (*p == '/') { - error(ap->logopt, + warn(ap->logopt, MODPREFIX "error location begins with \"/\""); free(options); return 1; @@ -1236,15 +1236,8 @@ int parse_mount(struct autofs_point *ap, return 1; } - if (!*loc) { - error(ap->logopt, MODPREFIX "invalid location"); - free(loc); - free(options); - return 1; - } - if (!validate_location(loc)) { - error(ap->logopt, MODPREFIX "invalid location"); + warn(ap->logopt, MODPREFIX "invalid location"); free(loc); free(options); return 1; @@ -1269,7 +1262,7 @@ int parse_mount(struct autofs_point *ap, } if (!validate_location(ent)) { - error(ap->logopt, MODPREFIX "invalid location"); + warn(ap->logopt, MODPREFIX "invalid location"); free(ent); free(loc); free(options);