From: Nikolaus Rath Date: Wed, 23 Nov 2016 23:59:52 +0000 (-0800) Subject: Improve documentation of fuse_session_unmount X-Git-Tag: fuse-3.0.0rc3~1 X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=56fde4ba9ee0268ece42512a00782b2064537b15;p=qemu-gpiodev%2Flibfuse.git Improve documentation of fuse_session_unmount --- diff --git a/include/fuse.h b/include/fuse.h index a9e569e..89798ef 100644 --- a/include/fuse.h +++ b/include/fuse.h @@ -819,6 +819,8 @@ int fuse_mount(struct fuse *f, const char *mountpoint); /** * Unmount a FUSE file system. * + * See fuse_session_unmount() for additional information. + * * @param f the FUSE handle **/ void fuse_unmount(struct fuse *f); diff --git a/include/fuse_lowlevel.h b/include/fuse_lowlevel.h index af3063f..835b420 100644 --- a/include/fuse_lowlevel.h +++ b/include/fuse_lowlevel.h @@ -1850,7 +1850,26 @@ void fuse_session_reset(struct fuse_session *se); int fuse_session_exited(struct fuse_session *se); /** - * Unmount the file system + * Ensure that file system is unmounted. + * + * In regular operation, the file system is typically unmounted by the + * user calling umount(8) or fusermount(1), which then terminates the + * FUSE session loop. However, the session loop may also terminate as + * a result of an explicit call to fuse_session_exit() (e.g. by a + * signal handler installed by fuse_set_signal_handler()). In this + * case the filesystem remains mounted, but any attempt to access it + * will block (while the filesystem process is still running) or give + * an ESHUTDOWN error (after the filesystem process has terminated). + * + * If the communication channel with the FUSE kernel module is still + * open (i.e., if the session loop was terminated by an explicit call + * to fuse_session_exit()), this function will close it and unmount + * the filesystem. If the communication channel has been closed by the + * kernel, this method will do (almost) nothing. + * + * NOTE: The above semantics mean that if the connection to the kernel + * is terminated via the ``/sys/fs/fuse/connections/NNN/abort`` file, + * this method will *not* unmount the filesystem. * * @param se the session */ diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c index 4855961..a960123 100644 --- a/lib/fuse_lowlevel.c +++ b/lib/fuse_lowlevel.c @@ -2655,6 +2655,8 @@ int fuse_session_receive_buf_int(struct fuse_session *se, struct fuse_buf *buf, if (res == -1) { if (err == ENODEV) { + /* Filesystem was unmounted, or connection was aborted + via /sys/fs/fuse/connections */ fuse_session_exit(se); return 0; } @@ -2743,6 +2745,8 @@ restart: goto restart; if (err == ENODEV) { + /* Filesystem was unmounted, or connection was aborted + via /sys/fs/fuse/connections */ fuse_session_exit(se); return 0; } diff --git a/lib/mount.c b/lib/mount.c index d19242e..2f7e068 100644 --- a/lib/mount.c +++ b/lib/mount.c @@ -275,7 +275,8 @@ void fuse_kern_unmount(const char *mountpoint, int fd) close(fd); /* If file poll returns POLLERR on the device file descriptor, - then the filesystem is already unmounted */ + then the filesystem is already unmounted or the connection + was severed via /sys/fs/fuse/connections/NNN/abort */ if (res == 1 && (pfd.revents & POLLERR)) return; }