Unmount while dav_run_msgloop is still running
This commit is contained in:
parent
5a2e6a0daa
commit
dfe67b208a
@ -1,6 +1,10 @@
|
|||||||
ChangeLog for davfs2
|
ChangeLog for davfs2
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
|
2016-04-09 Werner Baumann (werner.baumann@onlinehome.de)
|
||||||
|
* kernel_interface.c, mount_davfs.c:
|
||||||
|
Unmount while dav_run_msgloop is still running.
|
||||||
|
|
||||||
2016-04-04 Werner Baumann (werner.baumann@onlinehome.de)
|
2016-04-04 Werner Baumann (werner.baumann@onlinehome.de)
|
||||||
* cache.c, kernel_interface.c:
|
* cache.c, kernel_interface.c:
|
||||||
Fix compiler warnings.
|
Fix compiler warnings.
|
||||||
|
@ -117,6 +117,9 @@ struct create_out {
|
|||||||
/* File descriptor of the fuse device. */
|
/* File descriptor of the fuse device. */
|
||||||
static int fuse_device;
|
static int fuse_device;
|
||||||
|
|
||||||
|
/* The mountpoint. */
|
||||||
|
const char *mountpoint;
|
||||||
|
|
||||||
/* Buffer used for communication with the kernel module (in and out). */
|
/* Buffer used for communication with the kernel module (in and out). */
|
||||||
static size_t buf_size;
|
static size_t buf_size;
|
||||||
static char *buf;
|
static char *buf;
|
||||||
@ -212,6 +215,8 @@ dav_init_kernel_interface(const char *url, const char *mpoint,
|
|||||||
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG),
|
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG),
|
||||||
"Initializing kernel interface");
|
"Initializing kernel interface");
|
||||||
|
|
||||||
|
mountpoint = mpoint;
|
||||||
|
|
||||||
buf_size = args->buf_size * 1024;
|
buf_size = args->buf_size * 1024;
|
||||||
if (buf_size < (FUSE_MIN_READ_BUFFER + 1024))
|
if (buf_size < (FUSE_MIN_READ_BUFFER + 1024))
|
||||||
buf_size = FUSE_MIN_READ_BUFFER + 1024;
|
buf_size = FUSE_MIN_READ_BUFFER + 1024;
|
||||||
@ -280,12 +285,14 @@ dav_run_msgloop(volatile int *keep_on_running)
|
|||||||
{
|
{
|
||||||
dav_register_kernel_interface(&write_dir_entry);
|
dav_register_kernel_interface(&write_dir_entry);
|
||||||
|
|
||||||
|
int unmounting = 0;
|
||||||
|
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
tv.tv_sec = idle_time;
|
tv.tv_sec = idle_time;
|
||||||
tv.tv_usec = 0;
|
tv.tv_usec = 0;
|
||||||
time_t last_tidy_cache = time(NULL);
|
time_t last_tidy_cache = time(NULL);
|
||||||
|
|
||||||
while (*keep_on_running) {
|
while (1) {
|
||||||
|
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
FD_ZERO(&fds);
|
FD_ZERO(&fds);
|
||||||
@ -294,6 +301,17 @@ dav_run_msgloop(volatile int *keep_on_running)
|
|||||||
if (debug)
|
if (debug)
|
||||||
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG), "SELECT: %i", ret);
|
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG), "SELECT: %i", ret);
|
||||||
|
|
||||||
|
if (!*keep_on_running && !unmounting) {
|
||||||
|
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_ERR), _("unmounting %s"),
|
||||||
|
mountpoint);
|
||||||
|
unmounting = 1;
|
||||||
|
pid_t pid = fork();
|
||||||
|
if (pid == 0) {
|
||||||
|
execl("/bin/umount", "umount", "-il", mountpoint, NULL);
|
||||||
|
_exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
ssize_t bytes_read = read(fuse_device, buf, buf_size);
|
ssize_t bytes_read = read(fuse_device, buf, buf_size);
|
||||||
if (bytes_read <= 0) {
|
if (bytes_read <= 0) {
|
||||||
@ -322,6 +340,8 @@ dav_run_msgloop(volatile int *keep_on_running)
|
|||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
|
if (errno == EINTR)
|
||||||
|
continue;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -363,12 +363,8 @@ main(int argc, char *argv[])
|
|||||||
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG), "Closing");
|
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG), "Closing");
|
||||||
dav_close_cache(&got_sigterm);
|
dav_close_cache(&got_sigterm);
|
||||||
dav_close_webdav();
|
dav_close_webdav();
|
||||||
if (dav_is_mounted()) {
|
if (dav_is_mounted())
|
||||||
char *prog = xasprintf("/bin/umount -il %s", mpoint);
|
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_ERR), _("unmounting failed"));
|
||||||
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_ERR), _("unmounting %s"), mpoint);
|
|
||||||
if (system(prog) != 0 && dav_is_mounted())
|
|
||||||
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_ERR), _("unmounting failed"));
|
|
||||||
}
|
|
||||||
if (debug)
|
if (debug)
|
||||||
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG), "Removing %s", pidfile);
|
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG), "Removing %s", pidfile);
|
||||||
remove(pidfile);
|
remove(pidfile);
|
||||||
|
Loading…
Reference in New Issue
Block a user