diff options
Diffstat (limited to 'fs/fuse/fuse_i.h')
-rw-r--r-- | fs/fuse/fuse_i.h | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index c0481e48d161..4b094fbc9c7f 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/mm.h> | 15 | #include <linux/mm.h> |
16 | #include <linux/backing-dev.h> | 16 | #include <linux/backing-dev.h> |
17 | #include <linux/mutex.h> | 17 | #include <linux/mutex.h> |
18 | #include <linux/rwsem.h> | ||
18 | 19 | ||
19 | /** Max number of pages that can be used in a single read request */ | 20 | /** Max number of pages that can be used in a single read request */ |
20 | #define FUSE_MAX_PAGES_PER_REQ 32 | 21 | #define FUSE_MAX_PAGES_PER_REQ 32 |
@@ -25,6 +26,9 @@ | |||
25 | /** Congestion starts at 75% of maximum */ | 26 | /** Congestion starts at 75% of maximum */ |
26 | #define FUSE_CONGESTION_THRESHOLD (FUSE_MAX_BACKGROUND * 75 / 100) | 27 | #define FUSE_CONGESTION_THRESHOLD (FUSE_MAX_BACKGROUND * 75 / 100) |
27 | 28 | ||
29 | /** Bias for fi->writectr, meaning new writepages must not be sent */ | ||
30 | #define FUSE_NOWRITE INT_MIN | ||
31 | |||
28 | /** It could be as large as PATH_MAX, but would that have any uses? */ | 32 | /** It could be as large as PATH_MAX, but would that have any uses? */ |
29 | #define FUSE_NAME_MAX 1024 | 33 | #define FUSE_NAME_MAX 1024 |
30 | 34 | ||
@@ -73,6 +77,19 @@ struct fuse_inode { | |||
73 | 77 | ||
74 | /** Files usable in writepage. Protected by fc->lock */ | 78 | /** Files usable in writepage. Protected by fc->lock */ |
75 | struct list_head write_files; | 79 | struct list_head write_files; |
80 | |||
81 | /** Writepages pending on truncate or fsync */ | ||
82 | struct list_head queued_writes; | ||
83 | |||
84 | /** Number of sent writes, a negative bias (FUSE_NOWRITE) | ||
85 | * means more writes are blocked */ | ||
86 | int writectr; | ||
87 | |||
88 | /** Waitq for writepage completion */ | ||
89 | wait_queue_head_t page_waitq; | ||
90 | |||
91 | /** List of writepage requestst (pending or sent) */ | ||
92 | struct list_head writepages; | ||
76 | }; | 93 | }; |
77 | 94 | ||
78 | /** FUSE specific file data */ | 95 | /** FUSE specific file data */ |
@@ -242,6 +259,12 @@ struct fuse_req { | |||
242 | /** File used in the request (or NULL) */ | 259 | /** File used in the request (or NULL) */ |
243 | struct fuse_file *ff; | 260 | struct fuse_file *ff; |
244 | 261 | ||
262 | /** Inode used in the request or NULL */ | ||
263 | struct inode *inode; | ||
264 | |||
265 | /** Link on fi->writepages */ | ||
266 | struct list_head writepages_entry; | ||
267 | |||
245 | /** Request completion callback */ | 268 | /** Request completion callback */ |
246 | void (*end)(struct fuse_conn *, struct fuse_req *); | 269 | void (*end)(struct fuse_conn *, struct fuse_req *); |
247 | 270 | ||
@@ -504,6 +527,11 @@ void fuse_init_symlink(struct inode *inode); | |||
504 | void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr, | 527 | void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr, |
505 | u64 attr_valid, u64 attr_version); | 528 | u64 attr_valid, u64 attr_version); |
506 | 529 | ||
530 | void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr, | ||
531 | u64 attr_valid); | ||
532 | |||
533 | void fuse_truncate(struct address_space *mapping, loff_t offset); | ||
534 | |||
507 | /** | 535 | /** |
508 | * Initialize the client device | 536 | * Initialize the client device |
509 | */ | 537 | */ |
@@ -522,6 +550,8 @@ void fuse_ctl_cleanup(void); | |||
522 | */ | 550 | */ |
523 | struct fuse_req *fuse_request_alloc(void); | 551 | struct fuse_req *fuse_request_alloc(void); |
524 | 552 | ||
553 | struct fuse_req *fuse_request_alloc_nofs(void); | ||
554 | |||
525 | /** | 555 | /** |
526 | * Free a request | 556 | * Free a request |
527 | */ | 557 | */ |
@@ -558,6 +588,8 @@ void request_send_noreply(struct fuse_conn *fc, struct fuse_req *req); | |||
558 | */ | 588 | */ |
559 | void request_send_background(struct fuse_conn *fc, struct fuse_req *req); | 589 | void request_send_background(struct fuse_conn *fc, struct fuse_req *req); |
560 | 590 | ||
591 | void request_send_background_locked(struct fuse_conn *fc, struct fuse_req *req); | ||
592 | |||
561 | /* Abort all requests */ | 593 | /* Abort all requests */ |
562 | void fuse_abort_conn(struct fuse_conn *fc); | 594 | void fuse_abort_conn(struct fuse_conn *fc); |
563 | 595 | ||
@@ -600,3 +632,8 @@ u64 fuse_lock_owner_id(struct fuse_conn *fc, fl_owner_t id); | |||
600 | 632 | ||
601 | int fuse_update_attributes(struct inode *inode, struct kstat *stat, | 633 | int fuse_update_attributes(struct inode *inode, struct kstat *stat, |
602 | struct file *file, bool *refreshed); | 634 | struct file *file, bool *refreshed); |
635 | |||
636 | void fuse_flush_writepages(struct inode *inode); | ||
637 | |||
638 | void fuse_set_nowrite(struct inode *inode); | ||
639 | void fuse_release_nowrite(struct inode *inode); | ||