diff options
Diffstat (limited to 'include/linux/fs.h')
-rw-r--r-- | include/linux/fs.h | 97 |
1 files changed, 8 insertions, 89 deletions
diff --git a/include/linux/fs.h b/include/linux/fs.h index 81048f9bc783..7a9c5bca2b76 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -48,6 +48,7 @@ struct cred; | |||
48 | struct swap_info_struct; | 48 | struct swap_info_struct; |
49 | struct seq_file; | 49 | struct seq_file; |
50 | struct workqueue_struct; | 50 | struct workqueue_struct; |
51 | struct iov_iter; | ||
51 | 52 | ||
52 | extern void __init inode_init(void); | 53 | extern void __init inode_init(void); |
53 | extern void __init inode_init_early(void); | 54 | extern void __init inode_init_early(void); |
@@ -125,6 +126,8 @@ typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset, | |||
125 | 126 | ||
126 | /* File needs atomic accesses to f_pos */ | 127 | /* File needs atomic accesses to f_pos */ |
127 | #define FMODE_ATOMIC_POS ((__force fmode_t)0x8000) | 128 | #define FMODE_ATOMIC_POS ((__force fmode_t)0x8000) |
129 | /* Write access to underlying fs */ | ||
130 | #define FMODE_WRITER ((__force fmode_t)0x10000) | ||
128 | 131 | ||
129 | /* File was opened by fanotify and shouldn't generate fanotify events */ | 132 | /* File was opened by fanotify and shouldn't generate fanotify events */ |
130 | #define FMODE_NONOTIFY ((__force fmode_t)0x1000000) | 133 | #define FMODE_NONOTIFY ((__force fmode_t)0x1000000) |
@@ -293,38 +296,6 @@ struct page; | |||
293 | struct address_space; | 296 | struct address_space; |
294 | struct writeback_control; | 297 | struct writeback_control; |
295 | 298 | ||
296 | struct iov_iter { | ||
297 | const struct iovec *iov; | ||
298 | unsigned long nr_segs; | ||
299 | size_t iov_offset; | ||
300 | size_t count; | ||
301 | }; | ||
302 | |||
303 | size_t iov_iter_copy_from_user_atomic(struct page *page, | ||
304 | struct iov_iter *i, unsigned long offset, size_t bytes); | ||
305 | size_t iov_iter_copy_from_user(struct page *page, | ||
306 | struct iov_iter *i, unsigned long offset, size_t bytes); | ||
307 | void iov_iter_advance(struct iov_iter *i, size_t bytes); | ||
308 | int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes); | ||
309 | size_t iov_iter_single_seg_count(const struct iov_iter *i); | ||
310 | |||
311 | static inline void iov_iter_init(struct iov_iter *i, | ||
312 | const struct iovec *iov, unsigned long nr_segs, | ||
313 | size_t count, size_t written) | ||
314 | { | ||
315 | i->iov = iov; | ||
316 | i->nr_segs = nr_segs; | ||
317 | i->iov_offset = 0; | ||
318 | i->count = count + written; | ||
319 | |||
320 | iov_iter_advance(i, written); | ||
321 | } | ||
322 | |||
323 | static inline size_t iov_iter_count(struct iov_iter *i) | ||
324 | { | ||
325 | return i->count; | ||
326 | } | ||
327 | |||
328 | /* | 299 | /* |
329 | * "descriptor" for what we're up to with a read. | 300 | * "descriptor" for what we're up to with a read. |
330 | * This allows us to use the same read code yet | 301 | * This allows us to use the same read code yet |
@@ -383,7 +354,7 @@ struct address_space_operations { | |||
383 | int (*migratepage) (struct address_space *, | 354 | int (*migratepage) (struct address_space *, |
384 | struct page *, struct page *, enum migrate_mode); | 355 | struct page *, struct page *, enum migrate_mode); |
385 | int (*launder_page) (struct page *); | 356 | int (*launder_page) (struct page *); |
386 | int (*is_partially_uptodate) (struct page *, read_descriptor_t *, | 357 | int (*is_partially_uptodate) (struct page *, unsigned long, |
387 | unsigned long); | 358 | unsigned long); |
388 | void (*is_dirty_writeback) (struct page *, bool *, bool *); | 359 | void (*is_dirty_writeback) (struct page *, bool *, bool *); |
389 | int (*error_remove_page)(struct address_space *, struct page *); | 360 | int (*error_remove_page)(struct address_space *, struct page *); |
@@ -770,9 +741,6 @@ static inline int ra_has_index(struct file_ra_state *ra, pgoff_t index) | |||
770 | index < ra->start + ra->size); | 741 | index < ra->start + ra->size); |
771 | } | 742 | } |
772 | 743 | ||
773 | #define FILE_MNT_WRITE_TAKEN 1 | ||
774 | #define FILE_MNT_WRITE_RELEASED 2 | ||
775 | |||
776 | struct file { | 744 | struct file { |
777 | union { | 745 | union { |
778 | struct llist_node fu_llist; | 746 | struct llist_node fu_llist; |
@@ -810,9 +778,6 @@ struct file { | |||
810 | struct list_head f_tfile_llink; | 778 | struct list_head f_tfile_llink; |
811 | #endif /* #ifdef CONFIG_EPOLL */ | 779 | #endif /* #ifdef CONFIG_EPOLL */ |
812 | struct address_space *f_mapping; | 780 | struct address_space *f_mapping; |
813 | #ifdef CONFIG_DEBUG_WRITECOUNT | ||
814 | unsigned long f_mnt_write_state; | ||
815 | #endif | ||
816 | } __attribute__((aligned(4))); /* lest something weird decides that 2 is OK */ | 781 | } __attribute__((aligned(4))); /* lest something weird decides that 2 is OK */ |
817 | 782 | ||
818 | struct file_handle { | 783 | struct file_handle { |
@@ -830,49 +795,6 @@ static inline struct file *get_file(struct file *f) | |||
830 | #define fput_atomic(x) atomic_long_add_unless(&(x)->f_count, -1, 1) | 795 | #define fput_atomic(x) atomic_long_add_unless(&(x)->f_count, -1, 1) |
831 | #define file_count(x) atomic_long_read(&(x)->f_count) | 796 | #define file_count(x) atomic_long_read(&(x)->f_count) |
832 | 797 | ||
833 | #ifdef CONFIG_DEBUG_WRITECOUNT | ||
834 | static inline void file_take_write(struct file *f) | ||
835 | { | ||
836 | WARN_ON(f->f_mnt_write_state != 0); | ||
837 | f->f_mnt_write_state = FILE_MNT_WRITE_TAKEN; | ||
838 | } | ||
839 | static inline void file_release_write(struct file *f) | ||
840 | { | ||
841 | f->f_mnt_write_state |= FILE_MNT_WRITE_RELEASED; | ||
842 | } | ||
843 | static inline void file_reset_write(struct file *f) | ||
844 | { | ||
845 | f->f_mnt_write_state = 0; | ||
846 | } | ||
847 | static inline void file_check_state(struct file *f) | ||
848 | { | ||
849 | /* | ||
850 | * At this point, either both or neither of these bits | ||
851 | * should be set. | ||
852 | */ | ||
853 | WARN_ON(f->f_mnt_write_state == FILE_MNT_WRITE_TAKEN); | ||
854 | WARN_ON(f->f_mnt_write_state == FILE_MNT_WRITE_RELEASED); | ||
855 | } | ||
856 | static inline int file_check_writeable(struct file *f) | ||
857 | { | ||
858 | if (f->f_mnt_write_state == FILE_MNT_WRITE_TAKEN) | ||
859 | return 0; | ||
860 | printk(KERN_WARNING "writeable file with no " | ||
861 | "mnt_want_write()\n"); | ||
862 | WARN_ON(1); | ||
863 | return -EINVAL; | ||
864 | } | ||
865 | #else /* !CONFIG_DEBUG_WRITECOUNT */ | ||
866 | static inline void file_take_write(struct file *filp) {} | ||
867 | static inline void file_release_write(struct file *filp) {} | ||
868 | static inline void file_reset_write(struct file *filp) {} | ||
869 | static inline void file_check_state(struct file *filp) {} | ||
870 | static inline int file_check_writeable(struct file *filp) | ||
871 | { | ||
872 | return 0; | ||
873 | } | ||
874 | #endif /* CONFIG_DEBUG_WRITECOUNT */ | ||
875 | |||
876 | #define MAX_NON_LFS ((1UL<<31) - 1) | 798 | #define MAX_NON_LFS ((1UL<<31) - 1) |
877 | 799 | ||
878 | /* Page cache limit. The filesystems should put that into their s_maxbytes | 800 | /* Page cache limit. The filesystems should put that into their s_maxbytes |
@@ -2481,16 +2403,13 @@ extern int generic_file_mmap(struct file *, struct vm_area_struct *); | |||
2481 | extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *); | 2403 | extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *); |
2482 | extern int generic_file_remap_pages(struct vm_area_struct *, unsigned long addr, | 2404 | extern int generic_file_remap_pages(struct vm_area_struct *, unsigned long addr, |
2483 | unsigned long size, pgoff_t pgoff); | 2405 | unsigned long size, pgoff_t pgoff); |
2484 | extern int file_read_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size); | ||
2485 | int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isblk); | 2406 | int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isblk); |
2486 | extern ssize_t generic_file_aio_read(struct kiocb *, const struct iovec *, unsigned long, loff_t); | 2407 | extern ssize_t generic_file_aio_read(struct kiocb *, const struct iovec *, unsigned long, loff_t); |
2487 | extern ssize_t __generic_file_aio_write(struct kiocb *, const struct iovec *, unsigned long, | 2408 | extern ssize_t __generic_file_aio_write(struct kiocb *, const struct iovec *, unsigned long); |
2488 | loff_t *); | ||
2489 | extern ssize_t generic_file_aio_write(struct kiocb *, const struct iovec *, unsigned long, loff_t); | 2409 | extern ssize_t generic_file_aio_write(struct kiocb *, const struct iovec *, unsigned long, loff_t); |
2490 | extern ssize_t generic_file_direct_write(struct kiocb *, const struct iovec *, | 2410 | extern ssize_t generic_file_direct_write(struct kiocb *, const struct iovec *, |
2491 | unsigned long *, loff_t, loff_t *, size_t, size_t); | 2411 | unsigned long *, loff_t, size_t, size_t); |
2492 | extern ssize_t generic_file_buffered_write(struct kiocb *, const struct iovec *, | 2412 | extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t); |
2493 | unsigned long, loff_t, loff_t *, size_t, ssize_t); | ||
2494 | extern ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos); | 2413 | extern ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos); |
2495 | extern ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos); | 2414 | extern ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos); |
2496 | extern int generic_segment_checks(const struct iovec *iov, | 2415 | extern int generic_segment_checks(const struct iovec *iov, |
@@ -2582,7 +2501,7 @@ extern const struct file_operations generic_ro_fops; | |||
2582 | 2501 | ||
2583 | #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m)) | 2502 | #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m)) |
2584 | 2503 | ||
2585 | extern int vfs_readlink(struct dentry *, char __user *, int, const char *); | 2504 | extern int readlink_copy(char __user *, int, const char *); |
2586 | extern int page_readlink(struct dentry *, char __user *, int); | 2505 | extern int page_readlink(struct dentry *, char __user *, int); |
2587 | extern void *page_follow_link_light(struct dentry *, struct nameidata *); | 2506 | extern void *page_follow_link_light(struct dentry *, struct nameidata *); |
2588 | extern void page_put_link(struct dentry *, struct nameidata *, void *); | 2507 | extern void page_put_link(struct dentry *, struct nameidata *, void *); |