mirror of https://github.com/trapexit/mergerfs.git
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							54 lines
						
					
					
						
							2.3 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							54 lines
						
					
					
						
							2.3 KiB
						
					
					
				
								                           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().
							 |