1
2
3
4
5
6
7
8
9#ifndef _FS_FUSE_I_H
10#define _FS_FUSE_I_H
11
12#include <linux/fuse.h>
13#include <linux/fs.h>
14#include <linux/mount.h>
15#include <linux/wait.h>
16#include <linux/list.h>
17#include <linux/spinlock.h>
18#include <linux/mm.h>
19#include <linux/backing-dev.h>
20#include <linux/mutex.h>
21#include <linux/rwsem.h>
22#include <linux/rbtree.h>
23#include <linux/poll.h>
24#include <linux/workqueue.h>
25
26
27#define FUSE_MAX_PAGES_PER_REQ 32
28
29
30#define FUSE_NOWRITE INT_MIN
31
32
33#define FUSE_NAME_MAX 1024
34
35
36#define FUSE_CTL_NUM_DENTRIES 5
37
38
39
40
41#define FUSE_DEFAULT_PERMISSIONS (1 << 0)
42
43
44
45#define FUSE_ALLOW_OTHER (1 << 1)
46
47
48extern struct list_head fuse_conn_list;
49
50
51extern struct mutex fuse_mutex;
52
53
54extern unsigned max_user_bgreq;
55extern unsigned max_user_congthresh;
56
57
58struct fuse_forget_link {
59 struct fuse_forget_one forget_one;
60 struct fuse_forget_link *next;
61};
62
63
64struct fuse_inode {
65
66 struct inode inode;
67
68
69
70 u64 nodeid;
71
72
73 u64 nlookup;
74
75
76 struct fuse_forget_link *forget;
77
78
79 u64 i_time;
80
81
82
83 mode_t orig_i_mode;
84
85
86 u64 attr_version;
87
88
89 struct list_head write_files;
90
91
92 struct list_head queued_writes;
93
94
95
96 int writectr;
97
98
99 wait_queue_head_t page_waitq;
100
101
102 struct list_head writepages;
103};
104
105struct fuse_conn;
106
107
108struct fuse_file {
109
110 struct fuse_conn *fc;
111
112
113 struct fuse_req *reserved_req;
114
115
116 u64 kh;
117
118
119 u64 fh;
120
121
122 u64 nodeid;
123
124
125 atomic_t count;
126
127
128 u32 open_flags;
129
130
131 struct list_head write_entry;
132
133
134 struct rb_node polled_node;
135
136
137 wait_queue_head_t poll_wait;
138};
139
140
141struct fuse_in_arg {
142 unsigned size;
143 const void *value;
144};
145
146
147struct fuse_in {
148
149 struct fuse_in_header h;
150
151
152 unsigned argpages:1;
153
154
155 unsigned numargs;
156
157
158 struct fuse_in_arg args[3];
159};
160
161
162struct fuse_arg {
163 unsigned size;
164 void *value;
165};
166
167
168struct fuse_out {
169
170 struct fuse_out_header h;
171
172
173
174
175
176
177
178
179 unsigned argvar:1;
180
181
182 unsigned argpages:1;
183
184
185 unsigned page_zeroing:1;
186
187
188 unsigned page_replace:1;
189
190
191 unsigned numargs;
192
193
194 struct fuse_arg args[3];
195};
196
197
198enum fuse_req_state {
199 FUSE_REQ_INIT = 0,
200 FUSE_REQ_PENDING,
201 FUSE_REQ_READING,
202 FUSE_REQ_SENT,
203 FUSE_REQ_WRITING,
204 FUSE_REQ_FINISHED
205};
206
207
208
209
210struct fuse_req {
211
212
213 struct list_head list;
214
215
216 struct list_head intr_entry;
217
218
219 atomic_t count;
220
221
222 u64 intr_unique;
223
224
225
226
227
228
229
230
231 unsigned isreply:1;
232
233
234 unsigned force:1;
235
236
237 unsigned aborted:1;
238
239
240 unsigned background:1;
241
242
243 unsigned interrupted:1;
244
245
246 unsigned locked:1;
247
248
249 unsigned waiting:1;
250
251
252 enum fuse_req_state state;
253
254
255 struct fuse_in in;
256
257
258 struct fuse_out out;
259
260
261 wait_queue_head_t waitq;
262
263
264 union {
265 struct {
266 union {
267 struct fuse_release_in in;
268 struct work_struct work;
269 };
270 struct path path;
271 } release;
272 struct fuse_init_in init_in;
273 struct fuse_init_out init_out;
274 struct cuse_init_in cuse_init_in;
275 struct cuse_init_out cuse_init_out;
276 struct {
277 struct fuse_read_in in;
278 u64 attr_ver;
279 } read;
280 struct {
281 struct fuse_write_in in;
282 struct fuse_write_out out;
283 } write;
284 struct fuse_notify_retrieve_in retrieve_in;
285 struct fuse_lk_in lk_in;
286 } misc;
287
288
289 struct page *pages[FUSE_MAX_PAGES_PER_REQ];
290
291
292 unsigned num_pages;
293
294
295 unsigned page_offset;
296
297
298 struct fuse_file *ff;
299
300
301 struct inode *inode;
302
303
304 struct list_head writepages_entry;
305
306
307 void (*end)(struct fuse_conn *, struct fuse_req *);
308
309
310 struct file *stolen_file;
311};
312
313
314
315
316
317
318
319
320struct fuse_conn {
321
322 spinlock_t lock;
323
324
325 struct mutex inst_mutex;
326
327
328 atomic_t count;
329
330
331 uid_t user_id;
332
333
334 gid_t group_id;
335
336
337 unsigned flags;
338
339
340 unsigned max_read;
341
342
343 unsigned max_write;
344
345
346 wait_queue_head_t waitq;
347
348
349 struct list_head pending;
350
351
352 struct list_head processing;
353
354
355 struct list_head io;
356
357
358 u64 khctr;
359
360
361 struct rb_root polled_files;
362
363
364 unsigned max_background;
365
366
367 unsigned congestion_threshold;
368
369
370 unsigned num_background;
371
372
373 unsigned active_background;
374
375
376 struct list_head bg_queue;
377
378
379 struct list_head interrupts;
380
381
382 struct fuse_forget_link forget_list_head;
383 struct fuse_forget_link *forget_list_tail;
384
385
386 int forget_batch;
387
388
389
390
391 int blocked;
392
393
394 wait_queue_head_t blocked_waitq;
395
396
397 wait_queue_head_t reserved_req_waitq;
398
399
400 u64 reqctr;
401
402
403
404 unsigned connected;
405
406
407
408
409 unsigned conn_error:1;
410
411
412 unsigned conn_init:1;
413
414
415 unsigned async_read:1;
416
417
418 unsigned atomic_o_trunc:1;
419
420
421 unsigned export_support:1;
422
423
424 unsigned bdi_initialized:1;
425
426
427
428
429
430
431
432 unsigned no_fsync:1;
433
434
435 unsigned no_fsyncdir:1;
436
437
438 unsigned no_flush:1;
439
440
441 unsigned no_setxattr:1;
442
443
444 unsigned no_getxattr:1;
445
446
447 unsigned no_listxattr:1;
448
449
450 unsigned no_removexattr:1;
451
452
453 unsigned no_lock:1;
454
455
456 unsigned no_access:1;
457
458
459 unsigned no_create:1;
460
461
462 unsigned no_interrupt:1;
463
464
465 unsigned no_bmap:1;
466
467
468 unsigned no_poll:1;
469
470
471 unsigned big_writes:1;
472
473
474 unsigned dont_mask:1;
475
476
477 atomic_t num_waiting;
478
479
480 unsigned minor;
481
482
483 struct backing_dev_info bdi;
484
485
486 struct list_head entry;
487
488
489 dev_t dev;
490
491
492 struct dentry *ctl_dentry[FUSE_CTL_NUM_DENTRIES];
493
494
495 int ctl_ndents;
496
497
498 struct fasync_struct *fasync;
499
500
501 u32 scramble_key[4];
502
503
504 struct fuse_req *destroy_req;
505
506
507 u64 attr_version;
508
509
510 void (*release)(struct fuse_conn *);
511
512
513 struct super_block *sb;
514
515
516 struct rw_semaphore killsb;
517};
518
519static inline struct fuse_conn *get_fuse_conn_super(struct super_block *sb)
520{
521 return sb->s_fs_info;
522}
523
524static inline struct fuse_conn *get_fuse_conn(struct inode *inode)
525{
526 return get_fuse_conn_super(inode->i_sb);
527}
528
529static inline struct fuse_inode *get_fuse_inode(struct inode *inode)
530{
531 return container_of(inode, struct fuse_inode, inode);
532}
533
534static inline u64 get_node_id(struct inode *inode)
535{
536 return get_fuse_inode(inode)->nodeid;
537}
538
539
540extern const struct file_operations fuse_dev_operations;
541
542extern const struct dentry_operations fuse_dentry_operations;
543
544
545
546
547int fuse_inode_eq(struct inode *inode, void *_nodeidp);
548
549
550
551
552struct inode *fuse_iget(struct super_block *sb, u64 nodeid,
553 int generation, struct fuse_attr *attr,
554 u64 attr_valid, u64 attr_version);
555
556int fuse_lookup_name(struct super_block *sb, u64 nodeid, struct qstr *name,
557 struct fuse_entry_out *outarg, struct inode **inode);
558
559
560
561
562void fuse_queue_forget(struct fuse_conn *fc, struct fuse_forget_link *forget,
563 u64 nodeid, u64 nlookup);
564
565struct fuse_forget_link *fuse_alloc_forget(void);
566
567
568
569
570void fuse_read_fill(struct fuse_req *req, struct file *file,
571 loff_t pos, size_t count, int opcode);
572
573
574
575
576int fuse_open_common(struct inode *inode, struct file *file, bool isdir);
577
578struct fuse_file *fuse_file_alloc(struct fuse_conn *fc);
579struct fuse_file *fuse_file_get(struct fuse_file *ff);
580void fuse_file_free(struct fuse_file *ff);
581void fuse_finish_open(struct inode *inode, struct file *file);
582
583void fuse_sync_release(struct fuse_file *ff, int flags);
584
585
586
587
588void fuse_release_common(struct file *file, int opcode);
589
590
591
592
593int fuse_fsync_common(struct file *file, int datasync, int isdir);
594
595
596
597
598int fuse_notify_poll_wakeup(struct fuse_conn *fc,
599 struct fuse_notify_poll_wakeup_out *outarg);
600
601
602
603
604void fuse_init_file_inode(struct inode *inode);
605
606
607
608
609void fuse_init_common(struct inode *inode);
610
611
612
613
614void fuse_init_dir(struct inode *inode);
615
616
617
618
619void fuse_init_symlink(struct inode *inode);
620
621
622
623
624void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr,
625 u64 attr_valid, u64 attr_version);
626
627void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr,
628 u64 attr_valid);
629
630
631
632
633int fuse_dev_init(void);
634
635
636
637
638void fuse_dev_cleanup(void);
639
640int fuse_ctl_init(void);
641void fuse_ctl_cleanup(void);
642
643
644
645
646struct fuse_req *fuse_request_alloc(void);
647
648struct fuse_req *fuse_request_alloc_nofs(void);
649
650
651
652
653void fuse_request_free(struct fuse_req *req);
654
655
656
657
658struct fuse_req *fuse_get_req(struct fuse_conn *fc);
659
660
661
662
663struct fuse_req *fuse_get_req_nofail(struct fuse_conn *fc, struct file *file);
664
665
666
667
668
669void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req);
670
671
672
673
674void fuse_request_send(struct fuse_conn *fc, struct fuse_req *req);
675
676
677
678
679void fuse_request_send_background(struct fuse_conn *fc, struct fuse_req *req);
680
681void fuse_request_send_background_locked(struct fuse_conn *fc,
682 struct fuse_req *req);
683
684
685void fuse_abort_conn(struct fuse_conn *fc);
686
687
688
689
690void fuse_invalidate_attr(struct inode *inode);
691
692void fuse_invalidate_entry_cache(struct dentry *entry);
693
694
695
696
697struct fuse_conn *fuse_conn_get(struct fuse_conn *fc);
698
699void fuse_conn_kill(struct fuse_conn *fc);
700
701
702
703
704void fuse_conn_init(struct fuse_conn *fc);
705
706
707
708
709void fuse_conn_put(struct fuse_conn *fc);
710
711
712
713
714int fuse_ctl_add_conn(struct fuse_conn *fc);
715
716
717
718
719void fuse_ctl_remove_conn(struct fuse_conn *fc);
720
721
722
723
724int fuse_valid_type(int m);
725
726
727
728
729int fuse_allow_task(struct fuse_conn *fc, struct task_struct *task);
730
731u64 fuse_lock_owner_id(struct fuse_conn *fc, fl_owner_t id);
732
733int fuse_update_attributes(struct inode *inode, struct kstat *stat,
734 struct file *file, bool *refreshed);
735
736void fuse_flush_writepages(struct inode *inode);
737
738void fuse_set_nowrite(struct inode *inode);
739void fuse_release_nowrite(struct inode *inode);
740
741u64 fuse_get_attr_version(struct fuse_conn *fc);
742
743
744
745
746int fuse_reverse_inval_inode(struct super_block *sb, u64 nodeid,
747 loff_t offset, loff_t len);
748
749
750
751
752
753int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
754 struct qstr *name);
755
756int fuse_do_open(struct fuse_conn *fc, u64 nodeid, struct file *file,
757 bool isdir);
758ssize_t fuse_direct_io(struct file *file, const char __user *buf,
759 size_t count, loff_t *ppos, int write);
760long fuse_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg,
761 unsigned int flags);
762unsigned fuse_file_poll(struct file *file, poll_table *wait);
763int fuse_dev_release(struct inode *inode, struct file *file);
764
765void fuse_write_update_size(struct inode *inode, loff_t pos);
766
767#endif
768