mirror of
https://github.com/trapexit/mergerfs.git
synced 2024-11-30 04:23:43 +08:00
55 lines
2.3 KiB
Plaintext
55 lines
2.3 KiB
Plaintext
How Fuse-1.3 Works
|
|
|
|
[Written by Terje Oseberg]
|
|
|
|
1. The fuse library.
|
|
|
|
When your user mode program calls fuse_main() (lib/helper.c),
|
|
fuse_main() parses the arguments passed to your user mode program,
|
|
then calls fuse_mount() (lib/mount.c).
|
|
|
|
fuse_mount() creates a UNIX domain socket pair, then forks and execs
|
|
fusermount (util/fusermount.c) passing it one end of the socket in the
|
|
FUSE_COMMFD_ENV environment variable.
|
|
|
|
fusermount (util/fusermount.c) makes sure that the fuse module is
|
|
loaded. fusermount then open /dev/fuse and send the file handle over a
|
|
UNIX domain socket back to fuse_mount().
|
|
|
|
fuse_mount() returns the filehandle for /dev/fuse to fuse_main().
|
|
|
|
fuse_main() calls fuse_new() (lib/fuse.c) which allocates the struct
|
|
fuse datastructure that stores and maintains a cached image of the
|
|
filesystem data.
|
|
|
|
Lastly, fuse_main() calls either fuse_loop() (lib/fuse.c) or
|
|
fuse_loop_mt() (lib/fuse_mt.c) which both start to read the filesystem
|
|
system calls from the /dev/fuse, call the usermode functions
|
|
stored in struct fuse_operations datastructure before calling
|
|
fuse_main(). The results of those calls are then written back to the
|
|
/dev/fuse file where they can be forwarded back to the system
|
|
calls.
|
|
|
|
2. The kernel module.
|
|
|
|
The kernel module consists of two parts. First the proc filesystem
|
|
component in kernel/dev.c -and second the filesystem system calls
|
|
kernel/file.c, kernel/inode.c, and kernel/dir.c
|
|
|
|
All the system calls in kernel/file.c, kernel/inode.c, and
|
|
kernel/dir.c make calls to either request_send(),
|
|
request_send_noreply(), or request_send_nonblock(). Most of the calls
|
|
(all but 2) are to request_send(). request_send() adds the request to,
|
|
"list of requests" structure (fc->pending), then waits for a response.
|
|
request_send_noreply() and request_send_nonblock() are both similar in
|
|
function to request_send() except that one is non-blocking, and the
|
|
other does not respond with a reply.
|
|
|
|
The proc filesystem component in kernel/dev.c responds to file io
|
|
requests to the file /dev/fuse. fuse_dev_read() handles the
|
|
file reads and returns commands from the "list of requests" structure
|
|
to the calling program. fuse_dev_write() handles file writes and takes
|
|
the data written and places them into the req->out datastructure where
|
|
they can be returned to the system call through the "list of requests"
|
|
structure and request_send().
|