autofs-5.1.5 - use single unlink_umount_tree() for both direct and indirect mounts From: Ian Kent Use the same function, unlink_umount_tree(), for forced unlink of mounts for both indirect and direct mounts. Signed-off-by: Ian Kent --- CHANGELOG | 1 daemon/direct.c | 96 +++++++++++++--------------------------------------- daemon/indirect.c | 2 - daemon/state.c | 17 +-------- include/automount.h | 2 - 5 files changed, 30 insertions(+), 88 deletions(-) --- autofs-5.1.4.orig/CHANGELOG +++ autofs-5.1.4/CHANGELOG @@ -70,6 +70,7 @@ xx/xx/2018 autofs-5.1.5 - use local getmntent_r in table_is_mounted(). - refactor unlink_active_mounts() in direct.c. - don't use tree_is_mounted() for mounted checks. +- use single unlink_umount_tree() for both direct and indirect mounts. 19/12/2017 autofs-5.1.4 - fix spec file url. --- autofs-5.1.4.orig/daemon/direct.c +++ autofs-5.1.4/daemon/direct.c @@ -49,6 +49,8 @@ pthread_key_t key_mnt_direct_params; pthread_key_t key_mnt_offset_params; pthread_once_t key_mnt_params_once = PTHREAD_ONCE_INIT; +int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts); + static void key_mnt_params_destroy(void *arg) { struct mnt_params *mp; @@ -256,64 +258,8 @@ done: return 0; } -static int unlink_mount_tree(struct autofs_point *ap, struct list_head *list) -{ - struct list_head *p; - int rv, ret; - - ret = 1; - list_for_each(p, list) { - struct mnt_list *mnt; - - mnt = list_entry(p, struct mnt_list, list); - - if (mnt->flags & MNTS_AUTOFS) - rv = umount2(mnt->mp, MNT_DETACH); - else - rv = spawn_umount(ap->logopt, "-l", mnt->mp, NULL); - if (rv == -1) { - debug(ap->logopt, - "can't unlink %s from mount tree", mnt->mp); - - switch (errno) { - case EINVAL: - warn(ap->logopt, - "bad superblock or not mounted"); - break; - - case ENOENT: - case EFAULT: - ret = 0; - warn(ap->logopt, "bad path for mount"); - break; - } - } - } - return ret; -} - -static int unlink_active_mounts(struct autofs_point *ap, struct mnt_list *mnts, struct mapent *me) -{ - struct list_head list; - - INIT_LIST_HEAD(&list); - - if (!tree_get_mnt_list(mnts, &list, me->key, 1)) - return 1; - - if (!unlink_mount_tree(ap, &list)) { - debug(ap->logopt, - "already mounted as other than autofs " - "or failed to unlink entry in tree"); - return 0; - } - - return 1; -} - int do_mount_autofs_direct(struct autofs_point *ap, - struct mnt_list *mnts, struct mapent *me, - time_t timeout) + struct mapent *me, time_t timeout) { const char *str_direct = mount_type_str(t_direct); struct ioctl_ops *ops = get_ioctl_ops(); @@ -342,6 +288,8 @@ int do_mount_autofs_direct(struct autofs if (ret == 0) return -1; } else { + struct mnt_list *mnts; + if (ap->state == ST_READMAP && is_mounted(me->key, MNTS_ALL)) { time_t tout = get_exp_timeout(ap, me->source); int save_ioctlfd, ioctlfd; @@ -367,15 +315,23 @@ int do_mount_autofs_direct(struct autofs return 0; } - /* - * A return of 1 indicates we successfully unlinked - * the mount tree if there was one. A return of 0 - * indicates we failed to unlink the mount tree so - * we have to return a failure. - */ - ret = unlink_active_mounts(ap, mnts, me); - if (!ret) - return -1; + mnts = get_mnt_list(me->key, 1); + if (mnts) { + /* + * A return of 1 indicates we successfully unlinked + * the mount tree if there was one. A return of 0 + * indicates we failed to unlink the mount tree so + * we have to return a failure. + */ + ret = unlink_mount_tree(ap, mnts); + free_mnt_list(mnts); + if (!ret) { + error(ap->logopt, + "already mounted as other than autofs " + "or failed to unlink entry in tree"); + return -1; + } + } if (me->ioctlfd != -1) { error(ap->logopt, "active direct mount %s", me->key); @@ -494,7 +450,6 @@ int mount_autofs_direct(struct autofs_po struct map_source *map; struct mapent_cache *nc, *mc; struct mapent *me, *ne, *nested; - struct mnt_list *mnts; time_t now = monotonic_time(NULL); if (strcmp(ap->path, "/-")) { @@ -510,8 +465,6 @@ int mount_autofs_direct(struct autofs_po return -1; } - mnts = tree_make_mnt_tree("/"); - pthread_cleanup_push(mnts_cleanup, mnts); pthread_cleanup_push(master_source_lock_cleanup, ap->entry); master_source_readlock(ap->entry); nc = ap->entry->master->nc; @@ -539,7 +492,7 @@ int mount_autofs_direct(struct autofs_po if (ne) { if (map->master_line < ne->age) { /* TODO: check return, locking me */ - do_mount_autofs_direct(ap, mnts, me, timeout); + do_mount_autofs_direct(ap, me, timeout); } me = cache_enumerate(mc, me); continue; @@ -556,7 +509,7 @@ int mount_autofs_direct(struct autofs_po } /* TODO: check return, locking me */ - do_mount_autofs_direct(ap, mnts, me, timeout); + do_mount_autofs_direct(ap, me, timeout); me = cache_enumerate(mc, me); } @@ -565,7 +518,6 @@ int mount_autofs_direct(struct autofs_po } pthread_cleanup_pop(1); pthread_cleanup_pop(1); - pthread_cleanup_pop(1); return 0; } --- autofs-5.1.4.orig/daemon/indirect.c +++ autofs-5.1.4/daemon/indirect.c @@ -40,7 +40,7 @@ /* Attribute to create detached thread */ extern pthread_attr_t th_attr_detached; -static int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts) +int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts) { struct mnt_list *this; int rv, ret; --- autofs-5.1.4.orig/daemon/state.c +++ autofs-5.1.4/daemon/state.c @@ -350,14 +350,7 @@ static void do_readmap_cleanup(void *arg return; } -static void tree_mnts_cleanup(void *arg) -{ - struct mnt_list *mnts = (struct mnt_list *) arg; - tree_free_mnt_tree(mnts); - return; -} - -static void do_readmap_mount(struct autofs_point *ap, struct mnt_list *mnts, +static void do_readmap_mount(struct autofs_point *ap, struct map_source *map, struct mapent *me, time_t now) { struct mapent_cache *nc; @@ -444,7 +437,7 @@ static void do_readmap_mount(struct auto debug(ap->logopt, "%s is mounted", me->key); } else - do_mount_autofs_direct(ap, mnts, me, get_exp_timeout(ap, map)); + do_mount_autofs_direct(ap, me, get_exp_timeout(ap, map)); return; } @@ -455,7 +448,6 @@ static void *do_readmap(void *arg) struct map_source *map; struct mapent_cache *nc, *mc; struct readmap_args *ra; - struct mnt_list *mnts; int status; time_t now; @@ -499,8 +491,6 @@ static void *do_readmap(void *arg) struct mapent *me; unsigned int append_alarm = !ap->exp_runfreq; - mnts = tree_make_mnt_tree("/"); - pthread_cleanup_push(tree_mnts_cleanup, mnts); nc = ap->entry->master->nc; cache_readlock(nc); pthread_cleanup_push(cache_lock_cleanup, nc); @@ -518,7 +508,7 @@ static void *do_readmap(void *arg) cache_readlock(mc); me = cache_enumerate(mc, NULL); while (me) { - do_readmap_mount(ap, mnts, map, me, now); + do_readmap_mount(ap, map, me, now); me = cache_enumerate(mc, me); } lookup_prune_one_cache(ap, map->mc, now); @@ -538,7 +528,6 @@ static void *do_readmap(void *arg) pthread_cleanup_pop(1); pthread_cleanup_pop(1); - pthread_cleanup_pop(1); } pthread_cleanup_pop(1); --- autofs-5.1.4.orig/include/automount.h +++ autofs-5.1.4/include/automount.h @@ -606,7 +606,7 @@ void *expire_proc_indirect(void *); void *expire_proc_direct(void *); int expire_offsets_direct(struct autofs_point *ap, struct mapent *me, int now); int mount_autofs_indirect(struct autofs_point *ap, const char *root); -int do_mount_autofs_direct(struct autofs_point *ap, struct mnt_list *mnts, struct mapent *me, time_t timeout); +int do_mount_autofs_direct(struct autofs_point *ap, struct mapent *me, time_t timeout); int mount_autofs_direct(struct autofs_point *ap); int mount_autofs_offset(struct autofs_point *ap, struct mapent *me, const char *root, const char *offset); void submount_signal_parent(struct autofs_point *ap, unsigned int success);