Age | Commit message (Collapse) | Author | Lines |
|
Mounting a FUSE file system remotely using SSH in combination with
pseudo-terminal allocation (-t), results in "Transport endpoint is
not connected" errors when trying to access the file system contents.
For example:
# ssh -t root@localhost "cmsfs-fuse /dev/disk/by-path/ccw-0.0.0190 /CMSFS"
Connection to localhost closed.
# ls /CMSFS
ls: cannot access '/CMSFS': Transport endpoint is not connected
The cmsfs-fuse main program (which can also be any other FUSE file
system) calls into the fuse_main() libfuse library function.
The fuse_main() function later calls fuse_daemonize() to fork the
daemon process to handle the FUSE file system I/O.
The fuse_daemonize() function calls fork() as usual. The child
proceeds with setsid() and then redirecting its file descriptors
to /dev/null etc. The parent process, simply exits.
The child's functions and the parent's exit creates a subtle race.
This is seen with an SSH connection. The SSH command above calls
cmsfs-fuse on an allocated pseudo-terminal device (-t option).
If the parent exits, SSH receives the command completion and closes
the connection, that means, it closes the master side of the
pseudo-terminal. This causes a HUP signal being sent to the process
group on the pseudo-terminal. At this point in time, the child might
not have completed the setsid() call and, hence, becomes terminated.
Note that fuse daemon sets up its signal handlers after fuse_daemonize()
has completed.
Even if the child has the chance to disassociate from its parent process
group to become it's own process group with setsid(), the child still
has the pseudo-terminal opened as stdin, stdout, and stderr. So the
pseudo-terminal still behave as controlling terminal and might cause a
SIGHUP at closing the the master side.
To solve the problem, the parent has to wait until the child (the fuse
daemon process) has completed its processing, that means, has become
its own process group with setsid() and closed any file descriptors
pointing to the pseudo-terminal.
Closes: #27
Reported-by: Ofer Baruch <oferba@il.ibm.com>
Reviewed-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
|
|
|
|
IFTODT is provided by libc to convert from mode_t (as included in e.g.
struct fstat) to d_type (unsigned char element of struct dirent, as
returned by e.g. readdir). However, fuse actually uses a different
struct fuse_dirent with a "type" field of type uint32.
In other words, the semantics of (struct fuse_dirent).type are
not necessarily the same as those of (struct dirent).d_type.
|
|
|
|
trapexit-add-dirent-strlen3
|
|
|
|
s/disable remove file locking/disable remote file locking/
|
|
Applied (whitespace-cleanup) to each file. Having whitespace changes
in the VCS is ugly, but it ensures that in the future committers
can run this function to *avoid* commiting any whitespace.
|
|
|
|
|
|
Signed-off-by: Winfried Koehler <w_scan@gmx-topmail.de>
|
|
This should prevent some valgrind warnings.
|
|
|
|
|
|
|
|
Reported by Albert Berger
|
|
Returns the full PACKAGE_VERSION string, per autoconf
|
|
Reported by Jose R. Guzman
|
|
Found by Tavis Ormandy (CVE-2015-3202).
|
|
This creates a separate device file descriptor for each processing thread,
which might improve performance.
|
|
While the request lives don't free the channel associated with the request,
the answer will need to be written on the channel.
|
|
New functions: fuse_chan_get(), fuse_chan_put(). Removed function:
fuse_chan_destroy().
|
|
|
|
|
|
to properly restore the default signal handler.
Reported by: Chris Johnson <johnsocg@gmail.com>
|
|
Reported by Eric Biggers
|
|
See renameat2() system call in linux-3.15 and later kernels.
|
|
|
|
This allows the filesystem to specify the time granularity it
supports when the kernel is responsible for updating times
("writeback_cache" option).
|
|
...options. Uids/gids larger than 2147483647 would result in EINVAL when
mounting the filesystem. This also needs a fix in the kernel.
|
|
to zero in all cases.
Reported by Daniel Iwan.
|
|
Reuse the old "readdir" callback, but add a flags argument, that has
FUSE_READDIR_PLUS in case this is a "plus" version. Filesystems can safely
ignore this flag, but if they want they can add optimizations based on it:
i.e. only retrieve the full attributes in PLUS mode.
The filler function is also given a flags argument and the filesystem can
set FUSE_FILL_DIR_PLUS if all the attributes in "stat" are valid.
|
|
Was broken by commit 561d7054d856 "libfuse: remove fuse_chan_bufsize()".
|
|
|
|
Asynchronous direct I/O is supported by linux kernels 3.13 and
later, writeback caching is supported by 3.14 and later.
|
|
|
|
|
|
This allows compiling fuse with musl.
|
|
Valgrind warns on close(-1). So don't do this (happens if fuse_chan_clearfd()
was called on the channel).
|
|
|
|
|
|
Distribute ulockmgr separately. It is not needed for the building of
libfuse, only fusexmp_fh. Check ulockmgr library in ./configure and if not
disable remote-lock suport in fusexmp_fh.
|
|
Allow 2.X and 3.X to coexist. Includes are now stored under
/usr/include/fuse3 and library is named libfuse3.*. Invoke pkg-config with
"fuse3" as the first argument to build with version 3 of the library.
|
|
add AC_SYS_LARGEFILE to your configure.ac instead.
|
|
Remove 'fh_old' which was an ABI compatibility field for a long time.
Make 'writepage' a bitfield.
|
|
|
|
|
|
|
|
This prevents a valgrind warning.
|
|
- fuse_kern_unmount closes handle (e.g. 19)
- a thread in my process opens a file - the OS assigns newly freed
handle (i.e. 19)
- fuse_kern_chan_destroy closes the same handle (i.e. 19)
- a thread in my process opens another file - the OS assigns newly
freed handle (i.e. 19)
- * MAYHEM *
Reported by Dan Greenfield
|