autofs-5.1.5 - use single unlink_umount_tree() for both direct and indirect mounts
From: Ian Kent <raven@themaw.net>
Use the same function, unlink_umount_tree(), for forced unlink of mounts
for both indirect and direct mounts.
Signed-off-by: Ian Kent <raven@themaw.net>
---
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.0.7.orig/CHANGELOG
+++ autofs-5.0.7/CHANGELOG
@@ -344,6 +344,7 @@
- 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.
25/07/2012 autofs-5.0.7
=======================
--- autofs-5.0.7.orig/daemon/direct.c
+++ autofs-5.0.7/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();
@@ -341,6 +287,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;
@@ -366,15 +314,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);
@@ -500,7 +456,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 = time(NULL);
if (strcmp(ap->path, "/-")) {
@@ -516,8 +471,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;
@@ -545,7 +498,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;
@@ -562,7 +515,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);
}
@@ -571,7 +524,6 @@ int mount_autofs_direct(struct autofs_po
}
pthread_cleanup_pop(1);
pthread_cleanup_pop(1);
- pthread_cleanup_pop(1);
return 0;
}
--- autofs-5.0.7.orig/daemon/indirect.c
+++ autofs-5.0.7/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.0.7.orig/daemon/state.c
+++ autofs-5.0.7/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.0.7.orig/include/automount.h
+++ autofs-5.0.7/include/automount.h
@@ -590,7 +590,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);