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