397 lines
12 KiB
Diff
397 lines
12 KiB
Diff
|
autofs-5.1.8 - eliminate root param from autofs mount and umount
|
||
|
|
||
|
From: Ian Kent <raven@themaw.net>
|
||
|
|
||
|
Eliminate the "root" parameter of both mount and umount of autofs mounts.
|
||
|
|
||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||
|
---
|
||
|
CHANGELOG | 1
|
||
|
daemon/automount.c | 30 ++++++-------------------
|
||
|
daemon/indirect.c | 57 ++++++++++++++++++++-----------------------------
|
||
|
daemon/lookup.c | 4 +--
|
||
|
daemon/master.c | 1
|
||
|
daemon/state.c | 2 -
|
||
|
include/automount.h | 7 ++----
|
||
|
modules/mount_autofs.c | 1
|
||
|
8 files changed, 39 insertions(+), 64 deletions(-)
|
||
|
|
||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||
|
+++ autofs-5.1.4/CHANGELOG
|
||
|
@@ -132,6 +132,7 @@
|
||
|
- get rid entry thid field.
|
||
|
- continue expire immediately after submount check.
|
||
|
- add buffer length checks to autofs mount_mount().
|
||
|
+- eliminate root param from autofs mount and umount.
|
||
|
|
||
|
xx/xx/2018 autofs-5.1.5
|
||
|
- fix flag file permission.
|
||
|
--- autofs-5.1.4.orig/daemon/automount.c
|
||
|
+++ autofs-5.1.4/daemon/automount.c
|
||
|
@@ -736,7 +736,7 @@ static void umount_all(struct autofs_poi
|
||
|
left, ap->path);
|
||
|
}
|
||
|
|
||
|
-static int umount_autofs(struct autofs_point *ap, const char *root)
|
||
|
+static int umount_autofs(struct autofs_point *ap)
|
||
|
{
|
||
|
int ret = 0;
|
||
|
|
||
|
@@ -745,7 +745,7 @@ static int umount_autofs(struct autofs_p
|
||
|
|
||
|
if (ap->type == LKP_INDIRECT) {
|
||
|
umount_all(ap);
|
||
|
- ret = umount_autofs_indirect(ap, root);
|
||
|
+ ret = umount_autofs_indirect(ap);
|
||
|
} else
|
||
|
ret = umount_autofs_direct(ap);
|
||
|
|
||
|
@@ -915,7 +915,7 @@ static int autofs_init_ap(struct autofs_
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
-static int mount_autofs(struct autofs_point *ap, const char *root)
|
||
|
+static int mount_autofs(struct autofs_point *ap)
|
||
|
{
|
||
|
int status;
|
||
|
|
||
|
@@ -930,7 +930,7 @@ static int mount_autofs(struct autofs_po
|
||
|
if (ap->type == LKP_DIRECT)
|
||
|
status = mount_autofs_direct(ap);
|
||
|
else
|
||
|
- status = mount_autofs_indirect(ap, root);
|
||
|
+ status = mount_autofs_indirect(ap);
|
||
|
|
||
|
st_add_task(ap, ST_READY);
|
||
|
|
||
|
@@ -1884,7 +1884,7 @@ int handle_mounts_exit(struct autofs_poi
|
||
|
* to check for possible recovery.
|
||
|
*/
|
||
|
if (ap->type == LKP_DIRECT) {
|
||
|
- umount_autofs(ap, NULL);
|
||
|
+ umount_autofs(ap);
|
||
|
handle_mounts_cleanup(ap);
|
||
|
return 1;
|
||
|
}
|
||
|
@@ -1895,7 +1895,7 @@ int handle_mounts_exit(struct autofs_poi
|
||
|
* so we can continue. This can happen if a lookup
|
||
|
* occurs while we're trying to umount.
|
||
|
*/
|
||
|
- ret = umount_autofs(ap, NULL);
|
||
|
+ ret = umount_autofs(ap);
|
||
|
if (!ret) {
|
||
|
set_indirect_mount_tree_catatonic(ap);
|
||
|
handle_mounts_cleanup(ap);
|
||
|
@@ -1923,12 +1923,10 @@ void *handle_mounts(void *arg)
|
||
|
struct startup_cond *suc;
|
||
|
struct autofs_point *ap;
|
||
|
int cancel_state, status = 0;
|
||
|
- char *root;
|
||
|
|
||
|
suc = (struct startup_cond *) arg;
|
||
|
|
||
|
ap = suc->ap;
|
||
|
- root = strdup(suc->root);
|
||
|
|
||
|
pthread_cleanup_push(return_start_status, suc);
|
||
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancel_state);
|
||
|
@@ -1936,30 +1934,18 @@ void *handle_mounts(void *arg)
|
||
|
status = pthread_mutex_lock(&suc->mutex);
|
||
|
if (status) {
|
||
|
logerr("failed to lock startup condition mutex!");
|
||
|
- if (root)
|
||
|
- free(root);
|
||
|
fatal(status);
|
||
|
}
|
||
|
|
||
|
- if (!root) {
|
||
|
- crit(ap->logopt, "failed to alloc string root");
|
||
|
- suc->status = 1;
|
||
|
- pthread_setcancelstate(cancel_state, NULL);
|
||
|
- pthread_exit(NULL);
|
||
|
- }
|
||
|
-
|
||
|
- if (mount_autofs(ap, root) < 0) {
|
||
|
+ if (mount_autofs(ap) < 0) {
|
||
|
if (!(do_force_unlink & UNLINK_AND_EXIT))
|
||
|
crit(ap->logopt, "mount of %s failed!", ap->path);
|
||
|
suc->status = 1;
|
||
|
- umount_autofs(ap, root);
|
||
|
- free(root);
|
||
|
+ umount_autofs(ap);
|
||
|
pthread_setcancelstate(cancel_state, NULL);
|
||
|
pthread_exit(NULL);
|
||
|
}
|
||
|
|
||
|
- free(root);
|
||
|
-
|
||
|
if (ap->flags & MOUNT_FLAG_NOBIND)
|
||
|
info(ap->logopt, "bind mounts disabled");
|
||
|
|
||
|
--- 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 do_mount_autofs_indirect(struct autofs_point *ap, const char *root)
|
||
|
+static int do_mount_autofs_indirect(struct autofs_point *ap)
|
||
|
{
|
||
|
const char *str_indirect = mount_type_str(t_indirect);
|
||
|
struct ioctl_ops *ops = get_ioctl_ops();
|
||
|
@@ -89,11 +89,11 @@ static int do_mount_autofs_indirect(stru
|
||
|
}
|
||
|
|
||
|
/* In case the directory doesn't exist, try to mkdir it */
|
||
|
- if (mkdir_path(root, mp_mode) < 0) {
|
||
|
+ if (mkdir_path(ap->path, mp_mode) < 0) {
|
||
|
if (errno != EEXIST && errno != EROFS) {
|
||
|
crit(ap->logopt,
|
||
|
"failed to create autofs directory %s",
|
||
|
- root);
|
||
|
+ ap->path);
|
||
|
goto out_err;
|
||
|
}
|
||
|
/* If we recieve an error, and it's EEXIST or EROFS we know
|
||
|
@@ -108,27 +108,27 @@ static int do_mount_autofs_indirect(stru
|
||
|
if (!type || strcmp(ap->entry->maps->type, "hosts"))
|
||
|
map_name = ap->entry->maps->argv[0];
|
||
|
|
||
|
- ret = mount(map_name, root, "autofs", MS_MGC_VAL, options);
|
||
|
+ ret = mount(map_name, ap->path, "autofs", MS_MGC_VAL, options);
|
||
|
if (ret) {
|
||
|
crit(ap->logopt,
|
||
|
- "failed to mount autofs path %s at %s", ap->path, root);
|
||
|
+ "failed to mount autofs at %s", ap->path);
|
||
|
goto out_rmdir;
|
||
|
}
|
||
|
|
||
|
free(options);
|
||
|
options = NULL;
|
||
|
|
||
|
- ret = stat(root, &st);
|
||
|
+ ret = stat(ap->path, &st);
|
||
|
if (ret == -1) {
|
||
|
crit(ap->logopt,
|
||
|
"failed to stat mount for autofs path %s", ap->path);
|
||
|
goto out_umount;
|
||
|
}
|
||
|
|
||
|
- if (ap->mode && (err = chmod(root, ap->mode)))
|
||
|
+ if (ap->mode && (err = chmod(ap->path, ap->mode)))
|
||
|
warn(ap->logopt, "failed to change mode of %s", ap->path);
|
||
|
|
||
|
- if (ops->open(ap->logopt, &ap->ioctlfd, st.st_dev, root)) {
|
||
|
+ if (ops->open(ap->logopt, &ap->ioctlfd, st.st_dev, ap->path)) {
|
||
|
crit(ap->logopt,
|
||
|
"failed to create ioctl fd for autofs path %s", ap->path);
|
||
|
goto out_umount;
|
||
|
@@ -137,18 +137,15 @@ static int do_mount_autofs_indirect(stru
|
||
|
ap->dev = st.st_dev; /* Device number for mount point checks */
|
||
|
|
||
|
ops->timeout(ap->logopt, ap->ioctlfd, timeout);
|
||
|
- if (ap->logopt & LOGOPT_DEBUG)
|
||
|
- notify_mount_result(ap, root, timeout, str_indirect);
|
||
|
- else
|
||
|
- notify_mount_result(ap, ap->path, timeout, str_indirect);
|
||
|
+ notify_mount_result(ap, ap->path, timeout, str_indirect);
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
out_umount:
|
||
|
- umount(root);
|
||
|
+ umount(ap->path);
|
||
|
out_rmdir:
|
||
|
if (ap->flags & MOUNT_FLAG_DIR_CREATED)
|
||
|
- rmdir(root);
|
||
|
+ rmdir(ap->path);
|
||
|
out_err:
|
||
|
if (options)
|
||
|
free(options);
|
||
|
@@ -158,7 +155,7 @@ out_err:
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
-int mount_autofs_indirect(struct autofs_point *ap, const char *root)
|
||
|
+int mount_autofs_indirect(struct autofs_point *ap)
|
||
|
{
|
||
|
time_t now = monotonic_time(NULL);
|
||
|
int status;
|
||
|
@@ -180,11 +177,11 @@ int mount_autofs_indirect(struct autofs_
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- status = do_mount_autofs_indirect(ap, root);
|
||
|
+ status = do_mount_autofs_indirect(ap);
|
||
|
if (status < 0)
|
||
|
return -1;
|
||
|
|
||
|
- map = lookup_ghost(ap, root);
|
||
|
+ map = lookup_ghost(ap);
|
||
|
if (map & LKP_FAIL) {
|
||
|
if (map & LKP_DIRECT) {
|
||
|
error(ap->logopt,
|
||
|
@@ -223,19 +220,13 @@ void close_mount_fds(struct autofs_point
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
-int umount_autofs_indirect(struct autofs_point *ap, const char *root)
|
||
|
+int umount_autofs_indirect(struct autofs_point *ap)
|
||
|
{
|
||
|
struct ioctl_ops *ops = get_ioctl_ops();
|
||
|
char buf[MAX_ERR_BUF];
|
||
|
- char mountpoint[PATH_MAX + 1];
|
||
|
int rv, retries;
|
||
|
unsigned int unused;
|
||
|
|
||
|
- if (root)
|
||
|
- strcpy(mountpoint, root);
|
||
|
- else
|
||
|
- strcpy(mountpoint, ap->path);
|
||
|
-
|
||
|
/* If we are trying to shutdown make sure we can umount */
|
||
|
rv = ops->askumount(ap->logopt, ap->ioctlfd, &unused);
|
||
|
if (rv == -1) {
|
||
|
@@ -257,7 +248,7 @@ int umount_autofs_indirect(struct autofs
|
||
|
sched_yield();
|
||
|
|
||
|
retries = UMOUNT_RETRIES;
|
||
|
- while ((rv = umount(mountpoint)) == -1 && retries--) {
|
||
|
+ while ((rv = umount(ap->path)) == -1 && retries--) {
|
||
|
struct timespec tm = {0, 50000000};
|
||
|
if (errno != EBUSY)
|
||
|
break;
|
||
|
@@ -269,13 +260,13 @@ int umount_autofs_indirect(struct autofs
|
||
|
case ENOENT:
|
||
|
case EINVAL:
|
||
|
error(ap->logopt,
|
||
|
- "mount point %s does not exist", mountpoint);
|
||
|
+ "mount point %s does not exist", ap->path);
|
||
|
close_mount_fds(ap);
|
||
|
return 0;
|
||
|
break;
|
||
|
case EBUSY:
|
||
|
debug(ap->logopt,
|
||
|
- "mount point %s is in use", mountpoint);
|
||
|
+ "mount point %s is in use", ap->path);
|
||
|
if (ap->state == ST_SHUTDOWN_FORCE) {
|
||
|
close_mount_fds(ap);
|
||
|
goto force_umount;
|
||
|
@@ -294,11 +285,11 @@ int umount_autofs_indirect(struct autofs
|
||
|
}
|
||
|
#endif
|
||
|
ops->open(ap->logopt,
|
||
|
- &ap->ioctlfd, ap->dev, mountpoint);
|
||
|
+ &ap->ioctlfd, ap->dev, ap->path);
|
||
|
if (ap->ioctlfd < 0) {
|
||
|
warn(ap->logopt,
|
||
|
"could not recover autofs path %s",
|
||
|
- mountpoint);
|
||
|
+ ap->path);
|
||
|
close_mount_fds(ap);
|
||
|
return 0;
|
||
|
}
|
||
|
@@ -323,12 +314,12 @@ int umount_autofs_indirect(struct autofs
|
||
|
force_umount:
|
||
|
if (rv != 0) {
|
||
|
warn(ap->logopt,
|
||
|
- "forcing umount of indirect mount %s", mountpoint);
|
||
|
- rv = umount2(mountpoint, MNT_DETACH);
|
||
|
+ "forcing umount of indirect mount %s", ap->path);
|
||
|
+ rv = umount2(ap->path, MNT_DETACH);
|
||
|
} else {
|
||
|
- info(ap->logopt, "umounting indirect mount %s succeeded", mountpoint);
|
||
|
+ info(ap->logopt, "umounting indirect mount %s succeeded", ap->path);
|
||
|
if (ap->submount)
|
||
|
- rm_unwanted(ap, mountpoint, 1);
|
||
|
+ rm_unwanted(ap, ap->path, 1);
|
||
|
}
|
||
|
|
||
|
return rv;
|
||
|
--- autofs-5.1.4.orig/daemon/lookup.c
|
||
|
+++ autofs-5.1.4/daemon/lookup.c
|
||
|
@@ -720,7 +720,7 @@ static char *make_browse_path(unsigned i
|
||
|
return path;
|
||
|
}
|
||
|
|
||
|
-int lookup_ghost(struct autofs_point *ap, const char *root)
|
||
|
+int lookup_ghost(struct autofs_point *ap)
|
||
|
{
|
||
|
struct master_mapent *entry = ap->entry;
|
||
|
struct map_source *map;
|
||
|
@@ -784,7 +784,7 @@ int lookup_ghost(struct autofs_point *ap
|
||
|
}
|
||
|
|
||
|
fullpath = make_browse_path(ap->logopt,
|
||
|
- root, me->key, ap->pref);
|
||
|
+ ap->path, me->key, ap->pref);
|
||
|
if (!fullpath)
|
||
|
goto next;
|
||
|
|
||
|
--- autofs-5.1.4.orig/daemon/master.c
|
||
|
+++ autofs-5.1.4/daemon/master.c
|
||
|
@@ -1384,7 +1384,6 @@ static int master_do_mount(struct master
|
||
|
}
|
||
|
|
||
|
suc.ap = ap;
|
||
|
- suc.root = ap->path;
|
||
|
suc.done = 0;
|
||
|
suc.status = 0;
|
||
|
|
||
|
--- autofs-5.1.4.orig/daemon/state.c
|
||
|
+++ autofs-5.1.4/daemon/state.c
|
||
|
@@ -453,7 +453,7 @@ static void *do_readmap(void *arg)
|
||
|
ap->exp_runfreq = (timeout + CHECK_RATIO - 1) / CHECK_RATIO;
|
||
|
ops->timeout(ap->logopt, ap->ioctlfd, timeout);
|
||
|
lookup_prune_cache(ap, now);
|
||
|
- status = lookup_ghost(ap, ap->path);
|
||
|
+ status = lookup_ghost(ap);
|
||
|
} else {
|
||
|
struct mapent *me;
|
||
|
unsigned int append_alarm = !ap->exp_runfreq;
|
||
|
--- autofs-5.1.4.orig/include/automount.h
|
||
|
+++ autofs-5.1.4/include/automount.h
|
||
|
@@ -269,7 +269,7 @@ int lookup_nss_read_master(struct master
|
||
|
int lookup_nss_read_map(struct autofs_point *ap, struct map_source *source, time_t age);
|
||
|
int lookup_enumerate(struct autofs_point *ap,
|
||
|
int (*fn)(struct autofs_point *,struct mapent *, int), time_t now);
|
||
|
-int lookup_ghost(struct autofs_point *ap, const char *root);
|
||
|
+int lookup_ghost(struct autofs_point *ap);
|
||
|
int lookup_nss_mount(struct autofs_point *ap, struct map_source *source, const char *name, int name_len);
|
||
|
void lookup_close_lookup(struct autofs_point *ap);
|
||
|
void lookup_prune_one_cache(struct autofs_point *ap, struct mapent_cache *mc, time_t age);
|
||
|
@@ -391,7 +391,6 @@ struct startup_cond {
|
||
|
pthread_mutex_t mutex;
|
||
|
pthread_cond_t cond;
|
||
|
struct autofs_point *ap;
|
||
|
- char *root;
|
||
|
unsigned int done;
|
||
|
unsigned int status;
|
||
|
};
|
||
|
@@ -588,13 +587,13 @@ int do_expire(struct autofs_point *ap, c
|
||
|
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 mount_autofs_indirect(struct autofs_point *ap);
|
||
|
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);
|
||
|
void submount_signal_parent(struct autofs_point *ap, unsigned int success);
|
||
|
void close_mount_fds(struct autofs_point *ap);
|
||
|
-int umount_autofs_indirect(struct autofs_point *ap, const char *root);
|
||
|
+int umount_autofs_indirect(struct autofs_point *ap);
|
||
|
int do_umount_autofs_direct(struct autofs_point *ap, struct mapent *me);
|
||
|
int umount_autofs_direct(struct autofs_point *ap);
|
||
|
int umount_autofs_offset(struct autofs_point *ap, struct mapent *me);
|
||
|
--- autofs-5.1.4.orig/modules/mount_autofs.c
|
||
|
+++ autofs-5.1.4/modules/mount_autofs.c
|
||
|
@@ -324,7 +324,6 @@ int mount_mount(struct autofs_point *ap,
|
||
|
|
||
|
|
||
|
suc.ap = nap;
|
||
|
- suc.root = mountpoint;
|
||
|
suc.done = 0;
|
||
|
suc.status = 0;
|
||
|
|