xref: /openbsd/sys/sys/fusebuf.h (revision 413ec31c)
1 /* $OpenBSD: fusebuf.h,v 1.13 2018/06/19 11:27:54 helg Exp $ */
2 /*
3  * Copyright (c) 2013 Sylvestre Gallon
4  * Copyright (c) 2013 Martin Pieuchot
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #ifndef _SYS_FUSEBUF_H_
20 #define _SYS_FUSEBUF_H_
21 
22 /*
23  * Fusebufs are of a single size, 4096 bytes.
24  */
25 #define	FUSEBUFSIZE	(sizeof(struct fusebuf))
26 #define FUSEBUFMAXSIZE	(4096*1024)
27 
28 /* header at beginning of each fusebuf: */
29 struct fb_hdr {
30 	SIMPLEQ_ENTRY(fusebuf)	fh_next;	/* next buffer in chain */
31 	size_t			fh_len;		/* Amount of data */
32 	int			fh_err;		/* errno to pass back */
33 	int			fh_type;	/* type of data */
34 	ino_t			fh_ino;		/* Inode of this fusebuf */
35 	uint64_t		fh_uuid;	/* Uuid to track the answer */
36 	pid_t			fh_tid;		/* calling proc thread id */
37 	uid_t			fh_uid;		/* calling proc uid */
38 	gid_t			fh_gid;		/* calling proc gid */
39 	mode_t			fh_umask;	/* calling proc umask */
40 };
41 
42 /* header for fuse file operations (like read/write/mkdir): */
43 struct fb_io {
44 	uint64_t	fi_fd;		/* fd where the io is performed */
45 	ino_t           fi_ino;		/* ino for the io */
46 	off_t		fi_off;		/* offset for the io */
47 	size_t		fi_len;		/* Length of data */
48 	mode_t		fi_mode;	/* mode for fd */
49 	uint32_t	fi_flags;	/* flags on transfer */
50 	dev_t		fi_rdev;	/* dev for mknod */
51 };
52 
53 /*
54  * An operation is issued by the kernel through fuse(4) when the
55  * userland file system needs to execute an action (mkdir(2),
56  * link(2), etc).
57  *
58  * F_databuf can be superior to FUSELEN for fusefs_read, fusefs_writes and
59  * fusefs_readdir. If it is the case the transfer will be split in N
60  * fusebuf with a changing offset in FD_io.
61  *
62  * When the userland file system answers to this operation it uses
63  * the same ID (fh_uuid).
64  */
65 struct fusebuf {
66 	struct fb_hdr	fb_hdr;
67 	union {
68 		struct statvfs	FD_stat;	/* vfs statfs */
69 		struct stat	FD_attr;	/* for attr vnops */
70 		struct fb_io	FD_io;		/* for file io vnops */
71 	} FD;
72 	uint8_t *fb_dat;			/* data's */
73 };
74 
75 #define fb_next		fb_hdr.fh_next
76 #define fb_len		fb_hdr.fh_len
77 #define fb_err		fb_hdr.fh_err
78 #define fb_type		fb_hdr.fh_type
79 #define fb_ino		fb_hdr.fh_ino
80 #define fb_uuid		fb_hdr.fh_uuid
81 #define fb_tid		fb_hdr.fh_tid
82 #define fb_uid		fb_hdr.fh_uid
83 #define fb_gid		fb_hdr.fh_gid
84 #define fb_umask	fb_hdr.fh_umask
85 
86 #define fb_stat		FD.FD_stat
87 #define fb_attr		FD.FD_attr
88 #define fb_io_fd	FD.FD_io.fi_fd
89 #define fb_io_ino	FD.FD_io.fi_ino
90 #define fb_io_off	FD.FD_io.fi_off
91 #define fb_io_len	FD.FD_io.fi_len
92 #define fb_io_mode	FD.FD_io.fi_mode
93 #define fb_io_flags	FD.FD_io.fi_flags
94 #define fb_io_rdev	FD.FD_io.fi_rdev
95 
96 /*
97  * Macros for type conversion
98  * fbtod(fb,t) -	convert fusebuf pointer to data pointer of correct
99  *			type
100  */
101 #define	fbtod(fb,t)	((t)((fb)->fb_dat))
102 
103 /* flags needed by setattr */
104 #define FUSE_FATTR_MODE		(1 << 0)
105 #define FUSE_FATTR_UID		(1 << 1)
106 #define FUSE_FATTR_GID		(1 << 2)
107 #define FUSE_FATTR_SIZE		(1 << 3)
108 #define FUSE_FATTR_ATIME	(1 << 4)
109 #define FUSE_FATTR_MTIME	(1 << 5)
110 #define FUSE_FATTR_FH		(1 << 6)
111 
112 /* fusebuf types */
113 #define	FBT_LOOKUP	0
114 #define FBT_GETATTR	1
115 #define FBT_SETATTR	2
116 #define FBT_READLINK	3
117 #define FBT_SYMLINK	4
118 #define FBT_MKNOD	5
119 #define FBT_MKDIR	6
120 #define FBT_UNLINK	7
121 #define FBT_RMDIR	8
122 #define FBT_RENAME	9
123 #define FBT_LINK	10
124 #define FBT_OPEN	11
125 #define FBT_READ	12
126 #define FBT_WRITE	13
127 #define FBT_STATFS	14
128 #define FBT_RELEASE	16
129 #define FBT_FSYNC	17
130 #define FBT_FLUSH	18
131 #define FBT_INIT	19
132 #define FBT_OPENDIR	20
133 #define FBT_READDIR	21
134 #define FBT_RELEASEDIR	22
135 #define FBT_FSYNCDIR	23
136 #define FBT_ACCESS	24
137 #define FBT_DESTROY	26
138 #define FBT_RECLAIM	27
139 
140 #ifdef _KERNEL
141 
142 /* fusebuf prototypes */
143 struct	fusebuf *fb_setup(size_t, ino_t, int, struct proc *);
144 int	fb_queue(dev_t, struct fusebuf *);
145 void	fb_delete(struct fusebuf *);
146 
147 #endif /* _KERNEL */
148 #endif /* _SYS_FUSEBUF_H_ */
149