FUSEBUF(9)

NAME
fusebuf - kernel messaging mechanism for file system in userland

SYNOPSIS
#include <sys/fusebuf.h>
struct fusebuf *
fb_setup(size_t size, ino_t inode, int type, struct proc *p);
int
fb_queue(dev_t dev, struct fusebuf *fbuf);

    #define	FUSEBUFSIZE	4096
    #define	FUSEFDSIZE	sizeof(((struct fusebuf *)0)->F_dat.FD)
    #define	FUSELEN		(FUSEBUFSIZE - sizeof(struct fb_hdr) - \
    			sizeof(union uFD))
    struct fb_hdr {
    	SIMPLEQ_ENTRY(fusebuf)	fh_next;
    	size_t			fh_len;
    	size_t			fh_resid;
    	uint32_t		fh_err;
    	int			fh_type;
    	ino_t			fh_ino;
    	uint64_t		fh_uuid;
    };
    struct fb_io {
    	uint64_t		fi_fd;
    	ino_t			fi_ino;
    	off_t			fi_off;
    	size_t			fi_len;
    	mode_t			fi_mode;
    	uint32_t		fi_flags;
    };
    struct fusebuf {
            struct	fb_hdr fb_hdr;
    	struct {
    		union uFD {
    			struct statvfs	FD_stat;
    			struct vattr	FD_vattr;
    			struct fb_io	FD_io;
    		} FD;
    		char	F_databuf[FUSELEN];
    	} F_dat;
    };
    #define fb_next		fb_hdr.fh_next
    #define fb_len		fb_hdr.fh_len
    #define fb_resid	fb_hdr.fh_resid
    #define fb_err		fb_hdr.fh_err
    #define fb_type		fb_hdr.fh_type
    #define fb_ino		fb_hdr.fh_ino
    #define fb_uuid		fb_hdr.fh_uuid
    #define fb_stat		F_dat.FD.FD_stat
    #define fb_vattr	F_dat.FD.FD_vattr
    #define fb_io_fd	F_dat.FD.FD_io.fi_fd
    #define fb_io_ino	F_dat.FD.FD_io.fi_ino
    #define fb_io_off	F_dat.FD.FD_io.fi_off
    #define fb_io_len	F_dat.FD.FD_io.fi_len
    #define fb_io_mode	F_dat.FD.FD_io.fi_mode
    #define fb_io_flags	F_dat.FD.FD_io.fi_flags
    #define	fb_dat		F_dat.F_databuf

DESCRIPTION
These functions provide a way to manage the kernel messaging mechanism for fuse(4) file systems. It is based on mbuf(9).

Each FUSE operation fits in a fusebuf except for read, write, and readdirs, which are split into several fusebufs with a changing value in fb_io_off for each. The size of a fusebuf is FUSEBUFSIZE.

A fusebuf structure is defined as an fb_hdr followed by a structure containing a union and a buffer F_Dat. The header contains the following elements:

fh_next
    A SIMPLEQ_ENTRY(3) needed to store the different fusebufs stored with fb_queue.

fh_len
    Indicates the amount of data in F_dat.

fh_resid
    Used for partial fuse(4) reads. If the read does not fill the fusebuf, the number of bytes of F_dat written in this field are stored.

fh_err
    Indicates the errno(2) failure of a fusebuf.

fh_type
    Indicates the type of fusebuf transaction (see below).

fh_ino
    Indicates the inode on which the fuse(4) operation is done.

fh_uuid
    UUID to track the answer. This number is generated with arc4random(9).

The fh_type variable can take the following values:

FBT_LOOKUP
    The fusebuf is a lookup operation.
FBT_GETATTR
    The fusebuf is a gettattr operation.
FBT_SETATTR
    The fusebuf is a setattr operation.
FBT_READLINK
    The fusebuf is a readlink operation.
FBT_SYMLINK
    The fusebuf is a symlink operation.
FBT_MKNOD
    The fusebuf is a mknod operation.
FBT_MKDIR
    The fusebuf is a mkdir operation.
FBT_UNLINK
    The fusebuf is an unlink operation.
FBT_RMDIR
    The fusebuf is an rmdir operation.
FBT_RENAME
    The fusebuf is a rename operation.
FBT_LINK
    The fusebuf is a link operation.
FBT_OPEN
    The fusebuf is an open operation.
FBT_READ
    The fusebuf is a read operation.
FBT_WRITE
    The fusebuf is a write operation.
FBT_STATFS
    The fusebuf is a statfs operation.
FBT_RELEASE
    The fusebuf is a file close operation.
FBT_FSYNC
    The fusebuf is a file sync operation.
FBT_FLUSH
    The fusebuf is a flush operation.
FBT_INIT
    The fusebuf initializes the FUSE connection.
FBT_OPENDIR
    The fusebuf is an opendir operation.
FBT_READDIR
    The fusebuf is a readdir operation.
FBT_RELEASEDIR
    The fusebuf is a close dir operation.
FBT_FSYNCDIR
    The fusebuf is a dir sync operation.
FBT_ACCESS
    The fusebuf is an access operation.
FBT_CREATE
    The fusebuf is a create file operation.
FBT_DESTROY
    The fusebuf closes the FUSE connection.

All the data needed by the FUSE clients is contained in the F_dat structure. This structure contains a union FD of frequently used type and a buffer F_databuf to send data to libfuse. The union contains the following elements:

FD_stat
    A struct statvfs(3) filled in by the FUSE client statfs for the FUSE VFS statfs code.

FD_vattr
    Used by the getattr and setattr calls.

FD_io
    Contains all fields commonly used by FUSE client callbacks to provide information to FUSE vnops. It is used by access, readdir, release, releasedir, read, write, create, mkdir, and setattr.

Setattr uses a struct fb_io and a struct vattr. Settattr uses FD_stat and encapsulates a struct fb_io in F_databuf with fbtod.

SEE ALSO
errno(2), queue(3), statvfs(3), fuse(4), arc4random(9), mbuf(9)

HISTORY
The fusebuf API first appeared in OpenBSD 5.4.