203 lines
5.9 KiB
Diff
203 lines
5.9 KiB
Diff
diff --git a/daemon/automount.c b/daemon/automount.c
|
|
index 294c511..9809b9c 100644
|
|
--- a/daemon/automount.c
|
|
+++ b/daemon/automount.c
|
|
@@ -104,11 +104,14 @@ static int do_mkdir(const char *parent, const char *path, mode_t mode)
|
|
status = statfs(parent, &fs);
|
|
if ((status != -1 && fs.f_type == (__SWORD_TYPE) AUTOFS_SUPER_MAGIC) ||
|
|
contained_in_local_fs(path)) {
|
|
- if (mkdir(path, mode) == -1)
|
|
+ if (mkdir(path, mode) == -1) {
|
|
+ errno = EACCES;
|
|
return 0;
|
|
+ }
|
|
return 1;
|
|
}
|
|
|
|
+ errno = EACCES;
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/daemon/direct.c b/daemon/direct.c
|
|
index 179e74b..9a39a6f 100644
|
|
--- a/daemon/direct.c
|
|
+++ b/daemon/direct.c
|
|
@@ -604,6 +604,14 @@ int umount_autofs_offset(struct autofs_point *ap, struct mapent *me)
|
|
}
|
|
ioctlfd = me->ioctlfd;
|
|
} else {
|
|
+ /* offset isn't mounted, return success and try to recover */
|
|
+ if (!is_mounted(_PROC_MOUNTS, me->key, MNTS_AUTOFS)) {
|
|
+ debug(ap->logopt,
|
|
+ "offset %s unexpectedly not mounted",
|
|
+ me->key);
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
ioctlfd = open(me->key, O_RDONLY);
|
|
if (ioctlfd != -1) {
|
|
if ((cl_flags = fcntl(ioctlfd, F_GETFD, 0)) != -1) {
|
|
@@ -689,11 +697,19 @@ force_umount:
|
|
} else
|
|
msg("umounted offset mount %s", me->key);
|
|
|
|
+ if (!rv && me->dir_created) {
|
|
+ if (rmdir(me->key) == -1) {
|
|
+ char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|
+ warn(ap->logopt, "failed to remove dir %s: %s",
|
|
+ me->key, estr);
|
|
+ }
|
|
+ }
|
|
return rv;
|
|
}
|
|
|
|
-int mount_autofs_offset(struct autofs_point *ap, struct mapent *me, int is_autofs_fs)
|
|
+int mount_autofs_offset(struct autofs_point *ap, struct mapent *me)
|
|
{
|
|
+ char buf[MAX_ERR_BUF];
|
|
struct mnt_params *mp;
|
|
time_t timeout = ap->exp_timeout;
|
|
struct stat st;
|
|
@@ -740,36 +756,38 @@ int mount_autofs_offset(struct autofs_point *ap, struct mapent *me, int is_autof
|
|
return 0;
|
|
}
|
|
|
|
- if (is_autofs_fs) {
|
|
- /* In case the directory doesn't exist, try to mkdir it */
|
|
- if (mkdir_path(me->key, 0555) < 0) {
|
|
- if (errno != EEXIST) {
|
|
- crit(ap->logopt,
|
|
- "failed to create mount directory %s %d",
|
|
- me->key, errno);
|
|
- return -1;
|
|
- }
|
|
+ /* In case the directory doesn't exist, try to mkdir it */
|
|
+ if (mkdir_path(me->key, 0555) < 0) {
|
|
+ if (errno == EEXIST) {
|
|
/*
|
|
* If we recieve an error, and it's EEXIST
|
|
* we know the directory was not created.
|
|
*/
|
|
me->dir_created = 0;
|
|
+ } else if (errno == EACCES) {
|
|
+ /*
|
|
+ * We require the mount point directory to exist when
|
|
+ * installing multi-mount triggers into a host
|
|
+ * filesystem.
|
|
+ *
|
|
+ * If it doesn't exist it is not a valid part of the
|
|
+ * mount heirachy.
|
|
+ */
|
|
+ char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|
+ debug(ap->logopt,
|
|
+ "can't create mount directory: %s, %s",
|
|
+ me->key, estr);
|
|
+ return -1;
|
|
} else {
|
|
- /* No errors so the directory was successfully created */
|
|
- me->dir_created = 1;
|
|
+ char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|
+ crit(ap->logopt,
|
|
+ "failed to create mount directory: %s, %s",
|
|
+ me->key, estr);
|
|
+ return -1;
|
|
}
|
|
} else {
|
|
- me->dir_created = 0;
|
|
-
|
|
- /*
|
|
- * We require the mount point directory to exist when
|
|
- * installing multi-mount triggers into a host filesystem.
|
|
- *
|
|
- * If it doesn't exist it is not a valid part of the
|
|
- * mount heirachy so we silently succeed here.
|
|
- */
|
|
- if (stat(me->key, &st) == -1 && errno == ENOENT)
|
|
- return 0;
|
|
+ /* No errors so the directory was successfully created */
|
|
+ me->dir_created = 1;
|
|
}
|
|
|
|
debug(ap->logopt,
|
|
@@ -832,10 +850,8 @@ out_close:
|
|
out_umount:
|
|
umount(me->key);
|
|
out_err:
|
|
- if (is_autofs_fs) {
|
|
- if (stat(me->key, &st) == 0 && me->dir_created)
|
|
- rmdir_path(ap, me->key, st.st_dev);
|
|
- }
|
|
+ if (stat(me->key, &st) == 0 && me->dir_created)
|
|
+ rmdir_path(ap, me->key, st.st_dev);
|
|
|
|
return -1;
|
|
}
|
|
diff --git a/include/automount.h b/include/automount.h
|
|
index 106ed0a..d9e4ecd 100644
|
|
--- a/include/automount.h
|
|
+++ b/include/automount.h
|
|
@@ -470,7 +470,7 @@ 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);
|
|
int mount_autofs_direct(struct autofs_point *ap);
|
|
-int mount_autofs_offset(struct autofs_point *ap, struct mapent *me, int is_autofs_fs);
|
|
+int mount_autofs_offset(struct autofs_point *ap, struct mapent *me);
|
|
void submount_signal_parent(struct autofs_point *ap, unsigned int success);
|
|
int umount_autofs(struct autofs_point *ap, int force);
|
|
int umount_autofs_indirect(struct autofs_point *ap);
|
|
diff --git a/lib/parse_subs.c b/lib/parse_subs.c
|
|
index 0c45905..ad19f34 100644
|
|
--- a/lib/parse_subs.c
|
|
+++ b/lib/parse_subs.c
|
|
@@ -388,10 +388,8 @@ int mount_multi_triggers(struct autofs_point *ap, char *root, struct mapent *me,
|
|
struct mapent *oe;
|
|
struct list_head *pos = NULL;
|
|
unsigned int fs_path_len;
|
|
- struct statfs fs;
|
|
- struct stat st;
|
|
- unsigned int mounted, is_autofs_fs;
|
|
- int ret, start;
|
|
+ unsigned int mounted;
|
|
+ int start;
|
|
|
|
fs_path_len = strlen(root) + strlen(base);
|
|
if (fs_path_len > PATH_MAX)
|
|
@@ -399,15 +397,6 @@ int mount_multi_triggers(struct autofs_point *ap, char *root, struct mapent *me,
|
|
|
|
strcpy(path, root);
|
|
strcat(path, base);
|
|
- ret = statfs(path, &fs);
|
|
- if (ret == -1) {
|
|
- /* There's no mount yet - it must be autofs */
|
|
- if (errno == ENOENT)
|
|
- is_autofs_fs = 1;
|
|
- else
|
|
- return -1;
|
|
- } else
|
|
- is_autofs_fs = fs.f_type == (__SWORD_TYPE) AUTOFS_SUPER_MAGIC ? 1 : 0;
|
|
|
|
mounted = 0;
|
|
start = strlen(root);
|
|
@@ -424,20 +413,9 @@ int mount_multi_triggers(struct autofs_point *ap, char *root, struct mapent *me,
|
|
if (!oe)
|
|
goto cont;
|
|
|
|
- /*
|
|
- * If the host filesystem is not an autofs fs
|
|
- * we require the mount point directory exist
|
|
- * and that permissions are OK.
|
|
- */
|
|
- if (!is_autofs_fs) {
|
|
- ret = stat(oe->key, &st);
|
|
- if (ret == -1)
|
|
- goto cont;
|
|
- }
|
|
-
|
|
debug(ap->logopt, "mount offset %s", oe->key);
|
|
|
|
- if (mount_autofs_offset(ap, oe, is_autofs_fs) < 0)
|
|
+ if (mount_autofs_offset(ap, oe) < 0)
|
|
warn(ap->logopt, "failed to mount offset");
|
|
else
|
|
mounted++;
|