xref: /openbmc/linux/fs/fuse/fuse_i.h (revision 7f3edee8)
1 /*
2   FUSE: Filesystem in Userspace
3   Copyright (C) 2001-2006  Miklos Szeredi <miklos@szeredi.hu>
4 
5   This program can be distributed under the terms of the GNU GPL.
6   See the file COPYING.
7 */
8 
9 #include <linux/fuse.h>
10 #include <linux/fs.h>
11 #include <linux/mount.h>
12 #include <linux/wait.h>
13 #include <linux/list.h>
14 #include <linux/spinlock.h>
15 #include <linux/mm.h>
16 #include <linux/backing-dev.h>
17 #include <linux/mutex.h>
18 
19 /** Max number of pages that can be used in a single read request */
20 #define FUSE_MAX_PAGES_PER_REQ 32
21 
22 /** Maximum number of outstanding background requests */
23 #define FUSE_MAX_BACKGROUND 12
24 
25 /** Congestion starts at 75% of maximum */
26 #define FUSE_CONGESTION_THRESHOLD (FUSE_MAX_BACKGROUND * 75 / 100)
27 
28 /** It could be as large as PATH_MAX, but would that have any uses? */
29 #define FUSE_NAME_MAX 1024
30 
31 /** Number of dentries for each connection in the control filesystem */
32 #define FUSE_CTL_NUM_DENTRIES 3
33 
34 /** If the FUSE_DEFAULT_PERMISSIONS flag is given, the filesystem
35     module will check permissions based on the file mode.  Otherwise no
36     permission checking is done in the kernel */
37 #define FUSE_DEFAULT_PERMISSIONS (1 << 0)
38 
39 /** If the FUSE_ALLOW_OTHER flag is given, then not only the user
40     doing the mount will be allowed to access the filesystem */
41 #define FUSE_ALLOW_OTHER         (1 << 1)
42 
43 /** List of active connections */
44 extern struct list_head fuse_conn_list;
45 
46 /** Global mutex protecting fuse_conn_list and the control filesystem */
47 extern struct mutex fuse_mutex;
48 
49 /** FUSE inode */
50 struct fuse_inode {
51 	/** Inode data */
52 	struct inode inode;
53 
54 	/** Unique ID, which identifies the inode between userspace
55 	 * and kernel */
56 	u64 nodeid;
57 
58 	/** Number of lookups on this inode */
59 	u64 nlookup;
60 
61 	/** The request used for sending the FORGET message */
62 	struct fuse_req *forget_req;
63 
64 	/** Time in jiffies until the file attributes are valid */
65 	u64 i_time;
66 
67 	/** The sticky bit in inode->i_mode may have been removed, so
68 	    preserve the original mode */
69 	mode_t orig_i_mode;
70 
71 	/** Version of last attribute change */
72 	u64 attr_version;
73 
74 	/** Files usable in writepage.  Protected by fc->lock */
75 	struct list_head write_files;
76 };
77 
78 /** FUSE specific file data */
79 struct fuse_file {
80 	/** Request reserved for flush and release */
81 	struct fuse_req *reserved_req;
82 
83 	/** File handle used by userspace */
84 	u64 fh;
85 
86 	/** Refcount */
87 	atomic_t count;
88 
89 	/** Entry on inode's write_files list */
90 	struct list_head write_entry;
91 };
92 
93 /** One input argument of a request */
94 struct fuse_in_arg {
95 	unsigned size;
96 	const void *value;
97 };
98 
99 /** The request input */
100 struct fuse_in {
101 	/** The request header */
102 	struct fuse_in_header h;
103 
104 	/** True if the data for the last argument is in req->pages */
105 	unsigned argpages:1;
106 
107 	/** Number of arguments */
108 	unsigned numargs;
109 
110 	/** Array of arguments */
111 	struct fuse_in_arg args[3];
112 };
113 
114 /** One output argument of a request */
115 struct fuse_arg {
116 	unsigned size;
117 	void *value;
118 };
119 
120 /** The request output */
121 struct fuse_out {
122 	/** Header returned from userspace */
123 	struct fuse_out_header h;
124 
125 	/*
126 	 * The following bitfields are not changed during the request
127 	 * processing
128 	 */
129 
130 	/** Last argument is variable length (can be shorter than
131 	    arg->size) */
132 	unsigned argvar:1;
133 
134 	/** Last argument is a list of pages to copy data to */
135 	unsigned argpages:1;
136 
137 	/** Zero partially or not copied pages */
138 	unsigned page_zeroing:1;
139 
140 	/** Number or arguments */
141 	unsigned numargs;
142 
143 	/** Array of arguments */
144 	struct fuse_arg args[3];
145 };
146 
147 /** The request state */
148 enum fuse_req_state {
149 	FUSE_REQ_INIT = 0,
150 	FUSE_REQ_PENDING,
151 	FUSE_REQ_READING,
152 	FUSE_REQ_SENT,
153 	FUSE_REQ_WRITING,
154 	FUSE_REQ_FINISHED
155 };
156 
157 struct fuse_conn;
158 
159 /**
160  * A request to the client
161  */
162 struct fuse_req {
163 	/** This can be on either pending processing or io lists in
164 	    fuse_conn */
165 	struct list_head list;
166 
167 	/** Entry on the interrupts list  */
168 	struct list_head intr_entry;
169 
170 	/** refcount */
171 	atomic_t count;
172 
173 	/** Unique ID for the interrupt request */
174 	u64 intr_unique;
175 
176 	/*
177 	 * The following bitfields are either set once before the
178 	 * request is queued or setting/clearing them is protected by
179 	 * fuse_conn->lock
180 	 */
181 
182 	/** True if the request has reply */
183 	unsigned isreply:1;
184 
185 	/** Force sending of the request even if interrupted */
186 	unsigned force:1;
187 
188 	/** The request was aborted */
189 	unsigned aborted:1;
190 
191 	/** Request is sent in the background */
192 	unsigned background:1;
193 
194 	/** The request has been interrupted */
195 	unsigned interrupted:1;
196 
197 	/** Data is being copied to/from the request */
198 	unsigned locked:1;
199 
200 	/** Request is counted as "waiting" */
201 	unsigned waiting:1;
202 
203 	/** State of the request */
204 	enum fuse_req_state state;
205 
206 	/** The request input */
207 	struct fuse_in in;
208 
209 	/** The request output */
210 	struct fuse_out out;
211 
212 	/** Used to wake up the task waiting for completion of request*/
213 	wait_queue_head_t waitq;
214 
215 	/** Data for asynchronous requests */
216 	union {
217 		struct fuse_forget_in forget_in;
218 		struct fuse_release_in release_in;
219 		struct fuse_init_in init_in;
220 		struct fuse_init_out init_out;
221 		struct fuse_read_in read_in;
222 		struct {
223 			struct fuse_write_in in;
224 			struct fuse_write_out out;
225 		} write;
226 		struct fuse_lk_in lk_in;
227 	} misc;
228 
229 	/** page vector */
230 	struct page *pages[FUSE_MAX_PAGES_PER_REQ];
231 
232 	/** number of pages in vector */
233 	unsigned num_pages;
234 
235 	/** offset of data on first page */
236 	unsigned page_offset;
237 
238 	/** File used in the request (or NULL) */
239 	struct fuse_file *ff;
240 
241 	/** vfsmount used in release */
242 	struct vfsmount *vfsmount;
243 
244 	/** dentry used in release */
245 	struct dentry *dentry;
246 
247 	/** Request completion callback */
248 	void (*end)(struct fuse_conn *, struct fuse_req *);
249 
250 	/** Request is stolen from fuse_file->reserved_req */
251 	struct file *stolen_file;
252 };
253 
254 /**
255  * A Fuse connection.
256  *
257  * This structure is created, when the filesystem is mounted, and is
258  * destroyed, when the client device is closed and the filesystem is
259  * unmounted.
260  */
261 struct fuse_conn {
262 	/** Lock protecting accessess to  members of this structure */
263 	spinlock_t lock;
264 
265 	/** Mutex protecting against directory alias creation */
266 	struct mutex inst_mutex;
267 
268 	/** Refcount */
269 	atomic_t count;
270 
271 	/** The user id for this mount */
272 	uid_t user_id;
273 
274 	/** The group id for this mount */
275 	gid_t group_id;
276 
277 	/** The fuse mount flags for this mount */
278 	unsigned flags;
279 
280 	/** Maximum read size */
281 	unsigned max_read;
282 
283 	/** Maximum write size */
284 	unsigned max_write;
285 
286 	/** Readers of the connection are waiting on this */
287 	wait_queue_head_t waitq;
288 
289 	/** The list of pending requests */
290 	struct list_head pending;
291 
292 	/** The list of requests being processed */
293 	struct list_head processing;
294 
295 	/** The list of requests under I/O */
296 	struct list_head io;
297 
298 	/** Number of requests currently in the background */
299 	unsigned num_background;
300 
301 	/** Pending interrupts */
302 	struct list_head interrupts;
303 
304 	/** Flag indicating if connection is blocked.  This will be
305 	    the case before the INIT reply is received, and if there
306 	    are too many outstading backgrounds requests */
307 	int blocked;
308 
309 	/** waitq for blocked connection */
310 	wait_queue_head_t blocked_waitq;
311 
312 	/** waitq for reserved requests */
313 	wait_queue_head_t reserved_req_waitq;
314 
315 	/** The next unique request id */
316 	u64 reqctr;
317 
318 	/** Connection established, cleared on umount, connection
319 	    abort and device release */
320 	unsigned connected;
321 
322 	/** Connection failed (version mismatch).  Cannot race with
323 	    setting other bitfields since it is only set once in INIT
324 	    reply, before any other request, and never cleared */
325 	unsigned conn_error : 1;
326 
327 	/** Connection successful.  Only set in INIT */
328 	unsigned conn_init : 1;
329 
330 	/** Do readpages asynchronously?  Only set in INIT */
331 	unsigned async_read : 1;
332 
333 	/** Do not send separate SETATTR request before open(O_TRUNC)  */
334 	unsigned atomic_o_trunc : 1;
335 
336 	/*
337 	 * The following bitfields are only for optimization purposes
338 	 * and hence races in setting them will not cause malfunction
339 	 */
340 
341 	/** Is fsync not implemented by fs? */
342 	unsigned no_fsync : 1;
343 
344 	/** Is fsyncdir not implemented by fs? */
345 	unsigned no_fsyncdir : 1;
346 
347 	/** Is flush not implemented by fs? */
348 	unsigned no_flush : 1;
349 
350 	/** Is setxattr not implemented by fs? */
351 	unsigned no_setxattr : 1;
352 
353 	/** Is getxattr not implemented by fs? */
354 	unsigned no_getxattr : 1;
355 
356 	/** Is listxattr not implemented by fs? */
357 	unsigned no_listxattr : 1;
358 
359 	/** Is removexattr not implemented by fs? */
360 	unsigned no_removexattr : 1;
361 
362 	/** Are file locking primitives not implemented by fs? */
363 	unsigned no_lock : 1;
364 
365 	/** Is access not implemented by fs? */
366 	unsigned no_access : 1;
367 
368 	/** Is create not implemented by fs? */
369 	unsigned no_create : 1;
370 
371 	/** Is interrupt not implemented by fs? */
372 	unsigned no_interrupt : 1;
373 
374 	/** Is bmap not implemented by fs? */
375 	unsigned no_bmap : 1;
376 
377 	/** The number of requests waiting for completion */
378 	atomic_t num_waiting;
379 
380 	/** Negotiated minor version */
381 	unsigned minor;
382 
383 	/** Backing dev info */
384 	struct backing_dev_info bdi;
385 
386 	/** Entry on the fuse_conn_list */
387 	struct list_head entry;
388 
389 	/** Unique ID */
390 	u64 id;
391 
392 	/** Dentries in the control filesystem */
393 	struct dentry *ctl_dentry[FUSE_CTL_NUM_DENTRIES];
394 
395 	/** number of dentries used in the above array */
396 	int ctl_ndents;
397 
398 	/** O_ASYNC requests */
399 	struct fasync_struct *fasync;
400 
401 	/** Key for lock owner ID scrambling */
402 	u32 scramble_key[4];
403 
404 	/** Reserved request for the DESTROY message */
405 	struct fuse_req *destroy_req;
406 
407 	/** Version counter for attribute changes */
408 	u64 attr_version;
409 };
410 
411 static inline struct fuse_conn *get_fuse_conn_super(struct super_block *sb)
412 {
413 	return sb->s_fs_info;
414 }
415 
416 static inline struct fuse_conn *get_fuse_conn(struct inode *inode)
417 {
418 	return get_fuse_conn_super(inode->i_sb);
419 }
420 
421 static inline struct fuse_inode *get_fuse_inode(struct inode *inode)
422 {
423 	return container_of(inode, struct fuse_inode, inode);
424 }
425 
426 static inline u64 get_node_id(struct inode *inode)
427 {
428 	return get_fuse_inode(inode)->nodeid;
429 }
430 
431 /** Device operations */
432 extern const struct file_operations fuse_dev_operations;
433 
434 /**
435  * Get a filled in inode
436  */
437 struct inode *fuse_iget(struct super_block *sb, unsigned long nodeid,
438 			int generation, struct fuse_attr *attr,
439 			u64 attr_valid, u64 attr_version);
440 
441 /**
442  * Send FORGET command
443  */
444 void fuse_send_forget(struct fuse_conn *fc, struct fuse_req *req,
445 		      unsigned long nodeid, u64 nlookup);
446 
447 /**
448  * Initialize READ or READDIR request
449  */
450 void fuse_read_fill(struct fuse_req *req, struct file *file,
451 		    struct inode *inode, loff_t pos, size_t count, int opcode);
452 
453 /**
454  * Send OPEN or OPENDIR request
455  */
456 int fuse_open_common(struct inode *inode, struct file *file, int isdir);
457 
458 struct fuse_file *fuse_file_alloc(void);
459 void fuse_file_free(struct fuse_file *ff);
460 void fuse_finish_open(struct inode *inode, struct file *file,
461 		      struct fuse_file *ff, struct fuse_open_out *outarg);
462 
463 /** Fill in ff->reserved_req with a RELEASE request */
464 void fuse_release_fill(struct fuse_file *ff, u64 nodeid, int flags, int opcode);
465 
466 /**
467  * Send RELEASE or RELEASEDIR request
468  */
469 int fuse_release_common(struct inode *inode, struct file *file, int isdir);
470 
471 /**
472  * Send FSYNC or FSYNCDIR request
473  */
474 int fuse_fsync_common(struct file *file, struct dentry *de, int datasync,
475 		      int isdir);
476 
477 /**
478  * Initialize file operations on a regular file
479  */
480 void fuse_init_file_inode(struct inode *inode);
481 
482 /**
483  * Initialize inode operations on regular files and special files
484  */
485 void fuse_init_common(struct inode *inode);
486 
487 /**
488  * Initialize inode and file operations on a directory
489  */
490 void fuse_init_dir(struct inode *inode);
491 
492 /**
493  * Initialize inode operations on a symlink
494  */
495 void fuse_init_symlink(struct inode *inode);
496 
497 /**
498  * Change attributes of an inode
499  */
500 void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr,
501 			    u64 attr_valid, u64 attr_version);
502 
503 /**
504  * Initialize the client device
505  */
506 int fuse_dev_init(void);
507 
508 /**
509  * Cleanup the client device
510  */
511 void fuse_dev_cleanup(void);
512 
513 int fuse_ctl_init(void);
514 void fuse_ctl_cleanup(void);
515 
516 /**
517  * Allocate a request
518  */
519 struct fuse_req *fuse_request_alloc(void);
520 
521 /**
522  * Free a request
523  */
524 void fuse_request_free(struct fuse_req *req);
525 
526 /**
527  * Get a request, may fail with -ENOMEM
528  */
529 struct fuse_req *fuse_get_req(struct fuse_conn *fc);
530 
531 /**
532  * Gets a requests for a file operation, always succeeds
533  */
534 struct fuse_req *fuse_get_req_nofail(struct fuse_conn *fc, struct file *file);
535 
536 /**
537  * Decrement reference count of a request.  If count goes to zero free
538  * the request.
539  */
540 void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req);
541 
542 /**
543  * Send a request (synchronous)
544  */
545 void request_send(struct fuse_conn *fc, struct fuse_req *req);
546 
547 /**
548  * Send a request with no reply
549  */
550 void request_send_noreply(struct fuse_conn *fc, struct fuse_req *req);
551 
552 /**
553  * Send a request in the background
554  */
555 void request_send_background(struct fuse_conn *fc, struct fuse_req *req);
556 
557 /* Abort all requests */
558 void fuse_abort_conn(struct fuse_conn *fc);
559 
560 /**
561  * Invalidate inode attributes
562  */
563 void fuse_invalidate_attr(struct inode *inode);
564 
565 /**
566  * Acquire reference to fuse_conn
567  */
568 struct fuse_conn *fuse_conn_get(struct fuse_conn *fc);
569 
570 /**
571  * Release reference to fuse_conn
572  */
573 void fuse_conn_put(struct fuse_conn *fc);
574 
575 /**
576  * Add connection to control filesystem
577  */
578 int fuse_ctl_add_conn(struct fuse_conn *fc);
579 
580 /**
581  * Remove connection from control filesystem
582  */
583 void fuse_ctl_remove_conn(struct fuse_conn *fc);
584 
585 /**
586  * Is file type valid?
587  */
588 int fuse_valid_type(int m);
589 
590 /**
591  * Is task allowed to perform filesystem operation?
592  */
593 int fuse_allow_task(struct fuse_conn *fc, struct task_struct *task);
594 
595 u64 fuse_lock_owner_id(struct fuse_conn *fc, fl_owner_t id);
596 
597 int fuse_update_attributes(struct inode *inode, struct kstat *stat,
598 			   struct file *file, bool *refreshed);
599