diff options
Diffstat (limited to 'include/linux/fs.h')
| -rw-r--r-- | include/linux/fs.h | 89 |
1 files changed, 66 insertions, 23 deletions
diff --git a/include/linux/fs.h b/include/linux/fs.h index b4d71b5e1ff2..c7496f263860 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -314,6 +314,33 @@ struct page; | |||
| 314 | struct address_space; | 314 | struct address_space; |
| 315 | struct writeback_control; | 315 | struct writeback_control; |
| 316 | 316 | ||
| 317 | #define IOCB_EVENTFD (1 << 0) | ||
| 318 | #define IOCB_APPEND (1 << 1) | ||
| 319 | #define IOCB_DIRECT (1 << 2) | ||
| 320 | |||
| 321 | struct kiocb { | ||
| 322 | struct file *ki_filp; | ||
| 323 | loff_t ki_pos; | ||
| 324 | void (*ki_complete)(struct kiocb *iocb, long ret, long ret2); | ||
| 325 | void *private; | ||
| 326 | int ki_flags; | ||
| 327 | }; | ||
| 328 | |||
| 329 | static inline bool is_sync_kiocb(struct kiocb *kiocb) | ||
| 330 | { | ||
| 331 | return kiocb->ki_complete == NULL; | ||
| 332 | } | ||
| 333 | |||
| 334 | static inline int iocb_flags(struct file *file); | ||
| 335 | |||
| 336 | static inline void init_sync_kiocb(struct kiocb *kiocb, struct file *filp) | ||
| 337 | { | ||
| 338 | *kiocb = (struct kiocb) { | ||
| 339 | .ki_filp = filp, | ||
| 340 | .ki_flags = iocb_flags(filp), | ||
| 341 | }; | ||
| 342 | } | ||
| 343 | |||
| 317 | /* | 344 | /* |
| 318 | * "descriptor" for what we're up to with a read. | 345 | * "descriptor" for what we're up to with a read. |
| 319 | * This allows us to use the same read code yet | 346 | * This allows us to use the same read code yet |
| @@ -361,7 +388,7 @@ struct address_space_operations { | |||
| 361 | void (*invalidatepage) (struct page *, unsigned int, unsigned int); | 388 | void (*invalidatepage) (struct page *, unsigned int, unsigned int); |
| 362 | int (*releasepage) (struct page *, gfp_t); | 389 | int (*releasepage) (struct page *, gfp_t); |
| 363 | void (*freepage)(struct page *); | 390 | void (*freepage)(struct page *); |
| 364 | ssize_t (*direct_IO)(int, struct kiocb *, struct iov_iter *iter, loff_t offset); | 391 | ssize_t (*direct_IO)(struct kiocb *, struct iov_iter *iter, loff_t offset); |
| 365 | /* | 392 | /* |
| 366 | * migrate the contents of a page to the specified target. If | 393 | * migrate the contents of a page to the specified target. If |
| 367 | * migrate_mode is MIGRATE_ASYNC, it must not block. | 394 | * migrate_mode is MIGRATE_ASYNC, it must not block. |
| @@ -604,6 +631,7 @@ struct inode { | |||
| 604 | struct mutex i_mutex; | 631 | struct mutex i_mutex; |
| 605 | 632 | ||
| 606 | unsigned long dirtied_when; /* jiffies of first dirtying */ | 633 | unsigned long dirtied_when; /* jiffies of first dirtying */ |
| 634 | unsigned long dirtied_time_when; | ||
| 607 | 635 | ||
| 608 | struct hlist_node i_hash; | 636 | struct hlist_node i_hash; |
| 609 | struct list_head i_wb_list; /* backing dev IO list */ | 637 | struct list_head i_wb_list; /* backing dev IO list */ |
| @@ -847,6 +875,7 @@ static inline struct file *get_file(struct file *f) | |||
| 847 | atomic_long_inc(&f->f_count); | 875 | atomic_long_inc(&f->f_count); |
| 848 | return f; | 876 | return f; |
| 849 | } | 877 | } |
| 878 | #define get_file_rcu(x) atomic_long_inc_not_zero(&(x)->f_count) | ||
| 850 | #define fput_atomic(x) atomic_long_add_unless(&(x)->f_count, -1, 1) | 879 | #define fput_atomic(x) atomic_long_add_unless(&(x)->f_count, -1, 1) |
| 851 | #define file_count(x) atomic_long_read(&(x)->f_count) | 880 | #define file_count(x) atomic_long_read(&(x)->f_count) |
| 852 | 881 | ||
| @@ -892,8 +921,8 @@ struct file_lock_operations { | |||
| 892 | struct lock_manager_operations { | 921 | struct lock_manager_operations { |
| 893 | int (*lm_compare_owner)(struct file_lock *, struct file_lock *); | 922 | int (*lm_compare_owner)(struct file_lock *, struct file_lock *); |
| 894 | unsigned long (*lm_owner_key)(struct file_lock *); | 923 | unsigned long (*lm_owner_key)(struct file_lock *); |
| 895 | void (*lm_get_owner)(struct file_lock *, struct file_lock *); | 924 | fl_owner_t (*lm_get_owner)(fl_owner_t); |
| 896 | void (*lm_put_owner)(struct file_lock *); | 925 | void (*lm_put_owner)(fl_owner_t); |
| 897 | void (*lm_notify)(struct file_lock *); /* unblock callback */ | 926 | void (*lm_notify)(struct file_lock *); /* unblock callback */ |
| 898 | int (*lm_grant)(struct file_lock *, int); | 927 | int (*lm_grant)(struct file_lock *, int); |
| 899 | bool (*lm_break)(struct file_lock *); | 928 | bool (*lm_break)(struct file_lock *); |
| @@ -1018,6 +1047,9 @@ extern void lease_get_mtime(struct inode *, struct timespec *time); | |||
| 1018 | extern int generic_setlease(struct file *, long, struct file_lock **, void **priv); | 1047 | extern int generic_setlease(struct file *, long, struct file_lock **, void **priv); |
| 1019 | extern int vfs_setlease(struct file *, long, struct file_lock **, void **); | 1048 | extern int vfs_setlease(struct file *, long, struct file_lock **, void **); |
| 1020 | extern int lease_modify(struct file_lock *, int, struct list_head *); | 1049 | extern int lease_modify(struct file_lock *, int, struct list_head *); |
| 1050 | struct files_struct; | ||
| 1051 | extern void show_fd_locks(struct seq_file *f, | ||
| 1052 | struct file *filp, struct files_struct *files); | ||
| 1021 | #else /* !CONFIG_FILE_LOCKING */ | 1053 | #else /* !CONFIG_FILE_LOCKING */ |
| 1022 | static inline int fcntl_getlk(struct file *file, unsigned int cmd, | 1054 | static inline int fcntl_getlk(struct file *file, unsigned int cmd, |
| 1023 | struct flock __user *user) | 1055 | struct flock __user *user) |
| @@ -1154,6 +1186,10 @@ static inline int lease_modify(struct file_lock *fl, int arg, | |||
| 1154 | { | 1186 | { |
| 1155 | return -EINVAL; | 1187 | return -EINVAL; |
| 1156 | } | 1188 | } |
| 1189 | |||
| 1190 | struct files_struct; | ||
| 1191 | static inline void show_fd_locks(struct seq_file *f, | ||
| 1192 | struct file *filp, struct files_struct *files) {} | ||
| 1157 | #endif /* !CONFIG_FILE_LOCKING */ | 1193 | #endif /* !CONFIG_FILE_LOCKING */ |
| 1158 | 1194 | ||
| 1159 | 1195 | ||
| @@ -1539,8 +1575,6 @@ struct file_operations { | |||
| 1539 | loff_t (*llseek) (struct file *, loff_t, int); | 1575 | loff_t (*llseek) (struct file *, loff_t, int); |
| 1540 | ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); | 1576 | ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); |
| 1541 | ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); | 1577 | ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); |
| 1542 | ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t); | ||
| 1543 | ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t); | ||
| 1544 | ssize_t (*read_iter) (struct kiocb *, struct iov_iter *); | 1578 | ssize_t (*read_iter) (struct kiocb *, struct iov_iter *); |
| 1545 | ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); | 1579 | ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); |
| 1546 | int (*iterate) (struct file *, struct dir_context *); | 1580 | int (*iterate) (struct file *, struct dir_context *); |
| @@ -1548,7 +1582,7 @@ struct file_operations { | |||
| 1548 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); | 1582 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); |
| 1549 | long (*compat_ioctl) (struct file *, unsigned int, unsigned long); | 1583 | long (*compat_ioctl) (struct file *, unsigned int, unsigned long); |
| 1550 | int (*mmap) (struct file *, struct vm_area_struct *); | 1584 | int (*mmap) (struct file *, struct vm_area_struct *); |
| 1551 | void (*mremap)(struct file *, struct vm_area_struct *); | 1585 | int (*mremap)(struct file *, struct vm_area_struct *); |
| 1552 | int (*open) (struct inode *, struct file *); | 1586 | int (*open) (struct inode *, struct file *); |
| 1553 | int (*flush) (struct file *, fl_owner_t id); | 1587 | int (*flush) (struct file *, fl_owner_t id); |
| 1554 | int (*release) (struct inode *, struct file *); | 1588 | int (*release) (struct inode *, struct file *); |
| @@ -1616,6 +1650,7 @@ ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, | |||
| 1616 | struct iovec **ret_pointer); | 1650 | struct iovec **ret_pointer); |
| 1617 | 1651 | ||
| 1618 | extern ssize_t __vfs_read(struct file *, char __user *, size_t, loff_t *); | 1652 | extern ssize_t __vfs_read(struct file *, char __user *, size_t, loff_t *); |
| 1653 | extern ssize_t __vfs_write(struct file *, const char __user *, size_t, loff_t *); | ||
| 1619 | extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *); | 1654 | extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *); |
| 1620 | extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *); | 1655 | extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *); |
| 1621 | extern ssize_t vfs_readv(struct file *, const struct iovec __user *, | 1656 | extern ssize_t vfs_readv(struct file *, const struct iovec __user *, |
| @@ -2144,7 +2179,7 @@ struct filename { | |||
| 2144 | const __user char *uptr; /* original userland pointer */ | 2179 | const __user char *uptr; /* original userland pointer */ |
| 2145 | struct audit_names *aname; | 2180 | struct audit_names *aname; |
| 2146 | int refcnt; | 2181 | int refcnt; |
| 2147 | bool separate; /* should "name" be freed? */ | 2182 | const char iname[]; |
| 2148 | }; | 2183 | }; |
| 2149 | 2184 | ||
| 2150 | extern long vfs_truncate(struct path *, loff_t); | 2185 | extern long vfs_truncate(struct path *, loff_t); |
| @@ -2544,16 +2579,12 @@ extern int sb_min_blocksize(struct super_block *, int); | |||
| 2544 | 2579 | ||
| 2545 | extern int generic_file_mmap(struct file *, struct vm_area_struct *); | 2580 | extern int generic_file_mmap(struct file *, struct vm_area_struct *); |
| 2546 | extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *); | 2581 | extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *); |
| 2547 | int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isblk); | 2582 | extern ssize_t generic_write_checks(struct kiocb *, struct iov_iter *); |
| 2548 | extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *); | 2583 | extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *); |
| 2549 | extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *); | 2584 | extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *); |
| 2550 | extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *); | 2585 | extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *); |
| 2551 | extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *, loff_t); | 2586 | extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *, loff_t); |
| 2552 | extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t); | 2587 | extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t); |
| 2553 | extern ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos); | ||
| 2554 | extern ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos); | ||
| 2555 | extern ssize_t new_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos); | ||
| 2556 | extern ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos); | ||
| 2557 | 2588 | ||
| 2558 | ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos); | 2589 | ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos); |
| 2559 | ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos); | 2590 | ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos); |
| @@ -2591,12 +2622,13 @@ extern loff_t fixed_size_llseek(struct file *file, loff_t offset, | |||
| 2591 | extern int generic_file_open(struct inode * inode, struct file * filp); | 2622 | extern int generic_file_open(struct inode * inode, struct file * filp); |
| 2592 | extern int nonseekable_open(struct inode * inode, struct file * filp); | 2623 | extern int nonseekable_open(struct inode * inode, struct file * filp); |
| 2593 | 2624 | ||
| 2594 | ssize_t dax_do_io(int rw, struct kiocb *, struct inode *, struct iov_iter *, | 2625 | ssize_t dax_do_io(struct kiocb *, struct inode *, struct iov_iter *, loff_t, |
| 2595 | loff_t, get_block_t, dio_iodone_t, int flags); | 2626 | get_block_t, dio_iodone_t, int flags); |
| 2596 | int dax_clear_blocks(struct inode *, sector_t block, long size); | 2627 | int dax_clear_blocks(struct inode *, sector_t block, long size); |
| 2597 | int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); | 2628 | int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); |
| 2598 | int dax_truncate_page(struct inode *, loff_t from, get_block_t); | 2629 | int dax_truncate_page(struct inode *, loff_t from, get_block_t); |
| 2599 | int dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t); | 2630 | int dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t); |
| 2631 | int dax_pfn_mkwrite(struct vm_area_struct *, struct vm_fault *); | ||
| 2600 | #define dax_mkwrite(vma, vmf, gb) dax_fault(vma, vmf, gb) | 2632 | #define dax_mkwrite(vma, vmf, gb) dax_fault(vma, vmf, gb) |
| 2601 | 2633 | ||
| 2602 | #ifdef CONFIG_BLOCK | 2634 | #ifdef CONFIG_BLOCK |
| @@ -2616,16 +2648,18 @@ enum { | |||
| 2616 | 2648 | ||
| 2617 | void dio_end_io(struct bio *bio, int error); | 2649 | void dio_end_io(struct bio *bio, int error); |
| 2618 | 2650 | ||
| 2619 | ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, | 2651 | ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, |
| 2620 | struct block_device *bdev, struct iov_iter *iter, loff_t offset, | 2652 | struct block_device *bdev, struct iov_iter *iter, |
| 2621 | get_block_t get_block, dio_iodone_t end_io, | 2653 | loff_t offset, get_block_t get_block, |
| 2622 | dio_submit_t submit_io, int flags); | 2654 | dio_iodone_t end_io, dio_submit_t submit_io, |
| 2655 | int flags); | ||
| 2623 | 2656 | ||
| 2624 | static inline ssize_t blockdev_direct_IO(int rw, struct kiocb *iocb, | 2657 | static inline ssize_t blockdev_direct_IO(struct kiocb *iocb, |
| 2625 | struct inode *inode, struct iov_iter *iter, loff_t offset, | 2658 | struct inode *inode, |
| 2626 | get_block_t get_block) | 2659 | struct iov_iter *iter, loff_t offset, |
| 2660 | get_block_t get_block) | ||
| 2627 | { | 2661 | { |
| 2628 | return __blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iter, | 2662 | return __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, iter, |
| 2629 | offset, get_block, NULL, NULL, | 2663 | offset, get_block, NULL, NULL, |
| 2630 | DIO_LOCKING | DIO_SKIP_HOLES); | 2664 | DIO_LOCKING | DIO_SKIP_HOLES); |
| 2631 | } | 2665 | } |
| @@ -2661,7 +2695,6 @@ void inode_sub_bytes(struct inode *inode, loff_t bytes); | |||
| 2661 | loff_t inode_get_bytes(struct inode *inode); | 2695 | loff_t inode_get_bytes(struct inode *inode); |
| 2662 | void inode_set_bytes(struct inode *inode, loff_t bytes); | 2696 | void inode_set_bytes(struct inode *inode, loff_t bytes); |
| 2663 | 2697 | ||
| 2664 | extern int vfs_readdir(struct file *, filldir_t, void *); | ||
| 2665 | extern int iterate_dir(struct file *, struct dir_context *); | 2698 | extern int iterate_dir(struct file *, struct dir_context *); |
| 2666 | 2699 | ||
| 2667 | extern int vfs_stat(const char __user *, struct kstat *); | 2700 | extern int vfs_stat(const char __user *, struct kstat *); |
| @@ -2759,6 +2792,16 @@ static inline bool io_is_direct(struct file *filp) | |||
| 2759 | return (filp->f_flags & O_DIRECT) || IS_DAX(file_inode(filp)); | 2792 | return (filp->f_flags & O_DIRECT) || IS_DAX(file_inode(filp)); |
| 2760 | } | 2793 | } |
| 2761 | 2794 | ||
| 2795 | static inline int iocb_flags(struct file *file) | ||
| 2796 | { | ||
| 2797 | int res = 0; | ||
| 2798 | if (file->f_flags & O_APPEND) | ||
| 2799 | res |= IOCB_APPEND; | ||
| 2800 | if (io_is_direct(file)) | ||
| 2801 | res |= IOCB_DIRECT; | ||
| 2802 | return res; | ||
| 2803 | } | ||
| 2804 | |||
| 2762 | static inline ino_t parent_ino(struct dentry *dentry) | 2805 | static inline ino_t parent_ino(struct dentry *dentry) |
| 2763 | { | 2806 | { |
| 2764 | ino_t res; | 2807 | ino_t res; |
