• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2   FUSE: Filesystem in Userspace
3   Copyright (C) 2001-2007  Miklos Szeredi <miklos@szeredi.hu>
4 
5   This program can be distributed under the terms of the GNU LGPLv2.
6   See the file COPYING.LIB
7 */
8 
9 #include "fuse.h"
10 #include "fuse_lowlevel.h"
11 
12 struct mount_opts;
13 
14 struct fuse_req {
15 	struct fuse_session *se;
16 	uint64_t unique;
17 	int ctr;
18 	pthread_mutex_t lock;
19 	struct fuse_ctx ctx;
20 	struct fuse_chan *ch;
21 	int interrupted;
22 	unsigned int ioctl_64bit : 1;
23 	union {
24 		struct {
25 			uint64_t unique;
26 		} i;
27 		struct {
28 			fuse_interrupt_func_t func;
29 			void *data;
30 		} ni;
31 	} u;
32 	struct fuse_req *next;
33 	struct fuse_req *prev;
34 };
35 
36 struct fuse_notify_req {
37 	uint64_t unique;
38 	void (*reply)(struct fuse_notify_req *, fuse_req_t, fuse_ino_t,
39 		      const void *, const struct fuse_buf *);
40 	struct fuse_notify_req *next;
41 	struct fuse_notify_req *prev;
42 };
43 
44 struct fuse_session {
45 	char *mountpoint;
46 	volatile int exited;
47 	int fd;
48 	struct mount_opts *mo;
49 	int debug;
50 	int deny_others;
51 	struct fuse_lowlevel_ops op;
52 	int got_init;
53 	struct cuse_data *cuse_data;
54 	void *userdata;
55 	uid_t owner;
56 	struct fuse_conn_info conn;
57 	struct fuse_req list;
58 	struct fuse_req interrupts;
59 	pthread_mutex_t lock;
60 	int got_destroy;
61 	pthread_key_t pipe_key;
62 	int broken_splice_nonblock;
63 	uint64_t notify_ctr;
64 	struct fuse_notify_req notify_list;
65 	size_t bufsize;
66 	int error;
67 };
68 
69 struct fuse_chan {
70 	pthread_mutex_t lock;
71 	int ctr;
72 	int fd;
73 };
74 
75 /**
76  * Filesystem module
77  *
78  * Filesystem modules are registered with the FUSE_REGISTER_MODULE()
79  * macro.
80  *
81  */
82 struct fuse_module {
83 	char *name;
84 	fuse_module_factory_t factory;
85 	struct fuse_module *next;
86 	struct fusemod_so *so;
87 	int ctr;
88 };
89 
90 /* ----------------------------------------------------------- *
91  * Channel interface (when using -o clone_fd)		       *
92  * ----------------------------------------------------------- */
93 
94 /**
95  * Obtain counted reference to the channel
96  *
97  * @param ch the channel
98  * @return the channel
99  */
100 struct fuse_chan *fuse_chan_get(struct fuse_chan *ch);
101 
102 /**
103  * Drop counted reference to a channel
104  *
105  * @param ch the channel
106  */
107 void fuse_chan_put(struct fuse_chan *ch);
108 
109 struct mount_opts *parse_mount_opts(struct fuse_args *args);
110 void destroy_mount_opts(struct mount_opts *mo);
111 void fuse_mount_version(void);
112 unsigned get_max_read(struct mount_opts *o);
113 void fuse_kern_unmount(const char *mountpoint, int fd);
114 int fuse_kern_mount(const char *mountpoint, struct mount_opts *mo);
115 
116 int fuse_send_reply_iov_nofree(fuse_req_t req, int error, struct iovec *iov,
117 			       int count);
118 void fuse_free_req(fuse_req_t req);
119 
120 void cuse_lowlevel_init(fuse_req_t req, fuse_ino_t nodeide, const void *inarg);
121 
122 int fuse_start_thread(pthread_t *thread_id, void *(*func)(void *), void *arg);
123 
124 int fuse_session_receive_buf_int(struct fuse_session *se, struct fuse_buf *buf,
125 				 struct fuse_chan *ch);
126 void fuse_session_process_buf_int(struct fuse_session *se,
127 				  const struct fuse_buf *buf, struct fuse_chan *ch);
128 
129 struct fuse *fuse_new_31(struct fuse_args *args, const struct fuse_operations *op,
130 		      size_t op_size, void *private_data);
131 int fuse_loop_mt_32(struct fuse *f, struct fuse_loop_config *config);
132 int fuse_session_loop_mt_32(struct fuse_session *se, struct fuse_loop_config *config);
133 
134 #define FUSE_MAX_MAX_PAGES 256
135 #define FUSE_DEFAULT_MAX_PAGES_PER_REQ 32
136 
137 /* room needed in buffer to accommodate header */
138 #define FUSE_BUFFER_HEADER_SIZE 0x1000
139 
140