aboutsummaryrefslogtreecommitdiff
path: root/sys/sys/fusebuf.h
blob: 87066051f44e008306a1683181a928af7c6a1b4e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/* $OpenBSD: fusebuf.h,v 1.13 2018/06/19 11:27:54 helg Exp $ */
/*
 * Copyright (c) 2013 Sylvestre Gallon
 * Copyright (c) 2013 Martin Pieuchot
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef _SYS_FUSEBUF_H_
#define _SYS_FUSEBUF_H_

/*
 * Fusebufs are of a single size, 4096 bytes.
 */
#define	FUSEBUFSIZE	(sizeof(struct fusebuf))
#define FUSEBUFMAXSIZE	(4096*1024)

/* header at beginning of each fusebuf: */
struct fb_hdr {
	SIMPLEQ_ENTRY(fusebuf)	fh_next;	/* next buffer in chain */
	size_t			fh_len;		/* Amount of data */
	int			fh_err;		/* errno to pass back */
	int			fh_type;	/* type of data */
	ino_t			fh_ino;		/* Inode of this fusebuf */
	uint64_t		fh_uuid;	/* Uuid to track the answer */
	pid_t			fh_tid;		/* calling proc thread id */
	uid_t			fh_uid;		/* calling proc uid */
	gid_t			fh_gid;		/* calling proc gid */
	mode_t			fh_umask;	/* calling proc umask */
};

/* header for fuse file operations (like read/write/mkdir): */
struct fb_io {
	uint64_t	fi_fd;		/* fd where the io is performed */
	ino_t           fi_ino;		/* ino for the io */
	off_t		fi_off;		/* offset for the io */
	size_t		fi_len;		/* Length of data */
	mode_t		fi_mode;	/* mode for fd */
	uint32_t	fi_flags;	/* flags on transfer */
	dev_t		fi_rdev;	/* dev for mknod */
};

/*
 * An operation is issued by the kernel through fuse(4) when the
 * userland file system needs to execute an action (mkdir(2),
 * link(2), etc).
 *
 * F_databuf can be superior to FUSELEN for fusefs_read, fusefs_writes and
 * fusefs_readdir. If it is the case the transfer will be split in N
 * fusebuf with a changing offset in FD_io.
 *
 * When the userland file system answers to this operation it uses
 * the same ID (fh_uuid).
 */
struct fusebuf {
	struct fb_hdr	fb_hdr;
	union {
		struct statvfs	FD_stat;	/* vfs statfs */
		struct stat	FD_attr;	/* for attr vnops */
		struct fb_io	FD_io;		/* for file io vnops */
	} FD;
	uint8_t *fb_dat;			/* data's */
};

#define fb_next		fb_hdr.fh_next
#define fb_len		fb_hdr.fh_len
#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_tid		fb_hdr.fh_tid
#define fb_uid		fb_hdr.fh_uid
#define fb_gid		fb_hdr.fh_gid
#define fb_umask	fb_hdr.fh_umask

#define fb_stat		FD.FD_stat
#define fb_attr		FD.FD_attr
#define fb_io_fd	FD.FD_io.fi_fd
#define fb_io_ino	FD.FD_io.fi_ino
#define fb_io_off	FD.FD_io.fi_off
#define fb_io_len	FD.FD_io.fi_len
#define fb_io_mode	FD.FD_io.fi_mode
#define fb_io_flags	FD.FD_io.fi_flags
#define fb_io_rdev	FD.FD_io.fi_rdev

/*
 * Macros for type conversion
 * fbtod(fb,t) -	convert fusebuf pointer to data pointer of correct
 *			type
 */
#define	fbtod(fb,t)	((t)((fb)->fb_dat))

/* flags needed by setattr */
#define FUSE_FATTR_MODE		(1 << 0)
#define FUSE_FATTR_UID		(1 << 1)
#define FUSE_FATTR_GID		(1 << 2)
#define FUSE_FATTR_SIZE		(1 << 3)
#define FUSE_FATTR_ATIME	(1 << 4)
#define FUSE_FATTR_MTIME	(1 << 5)
#define FUSE_FATTR_FH		(1 << 6)

/* fusebuf types */
#define	FBT_LOOKUP	0
#define FBT_GETATTR	1
#define FBT_SETATTR	2
#define FBT_READLINK	3
#define FBT_SYMLINK	4
#define FBT_MKNOD	5
#define FBT_MKDIR	6
#define FBT_UNLINK	7
#define FBT_RMDIR	8
#define FBT_RENAME	9
#define FBT_LINK	10
#define FBT_OPEN	11
#define FBT_READ	12
#define FBT_WRITE	13
#define FBT_STATFS	14
#define FBT_RELEASE	16
#define FBT_FSYNC	17
#define FBT_FLUSH	18
#define FBT_INIT	19
#define FBT_OPENDIR	20
#define FBT_READDIR	21
#define FBT_RELEASEDIR	22
#define FBT_FSYNCDIR	23
#define FBT_ACCESS	24
#define FBT_DESTROY	26
#define FBT_RECLAIM	27

#ifdef _KERNEL

/* fusebuf prototypes */
struct	fusebuf *fb_setup(size_t, ino_t, int, struct proc *);
int	fb_queue(dev_t, struct fusebuf *);
void	fb_delete(struct fusebuf *);

#endif /* _KERNEL */
#endif /* _SYS_FUSEBUF_H_ */