diff options
Diffstat (limited to 'include/linux/fs.h')
-rw-r--r-- | include/linux/fs.h | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/include/linux/fs.h b/include/linux/fs.h index f4fc60727b8d..f4d63544a791 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -315,6 +315,8 @@ struct address_space; | |||
315 | struct writeback_control; | 315 | struct writeback_control; |
316 | 316 | ||
317 | #define IOCB_EVENTFD (1 << 0) | 317 | #define IOCB_EVENTFD (1 << 0) |
318 | #define IOCB_APPEND (1 << 1) | ||
319 | #define IOCB_DIRECT (1 << 2) | ||
318 | 320 | ||
319 | struct kiocb { | 321 | struct kiocb { |
320 | struct file *ki_filp; | 322 | struct file *ki_filp; |
@@ -329,10 +331,13 @@ static inline bool is_sync_kiocb(struct kiocb *kiocb) | |||
329 | return kiocb->ki_complete == NULL; | 331 | return kiocb->ki_complete == NULL; |
330 | } | 332 | } |
331 | 333 | ||
334 | static inline int iocb_flags(struct file *file); | ||
335 | |||
332 | static inline void init_sync_kiocb(struct kiocb *kiocb, struct file *filp) | 336 | static inline void init_sync_kiocb(struct kiocb *kiocb, struct file *filp) |
333 | { | 337 | { |
334 | *kiocb = (struct kiocb) { | 338 | *kiocb = (struct kiocb) { |
335 | .ki_filp = filp, | 339 | .ki_filp = filp, |
340 | .ki_flags = iocb_flags(filp), | ||
336 | }; | 341 | }; |
337 | } | 342 | } |
338 | 343 | ||
@@ -383,7 +388,7 @@ struct address_space_operations { | |||
383 | void (*invalidatepage) (struct page *, unsigned int, unsigned int); | 388 | void (*invalidatepage) (struct page *, unsigned int, unsigned int); |
384 | int (*releasepage) (struct page *, gfp_t); | 389 | int (*releasepage) (struct page *, gfp_t); |
385 | void (*freepage)(struct page *); | 390 | void (*freepage)(struct page *); |
386 | 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); |
387 | /* | 392 | /* |
388 | * migrate the contents of a page to the specified target. If | 393 | * migrate the contents of a page to the specified target. If |
389 | * migrate_mode is MIGRATE_ASYNC, it must not block. | 394 | * migrate_mode is MIGRATE_ASYNC, it must not block. |
@@ -2566,7 +2571,7 @@ extern int sb_min_blocksize(struct super_block *, int); | |||
2566 | 2571 | ||
2567 | extern int generic_file_mmap(struct file *, struct vm_area_struct *); | 2572 | extern int generic_file_mmap(struct file *, struct vm_area_struct *); |
2568 | extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *); | 2573 | extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *); |
2569 | int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isblk); | 2574 | extern ssize_t generic_write_checks(struct kiocb *, struct iov_iter *); |
2570 | extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *); | 2575 | extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *); |
2571 | extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *); | 2576 | extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *); |
2572 | extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *); | 2577 | extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *); |
@@ -2609,8 +2614,8 @@ extern loff_t fixed_size_llseek(struct file *file, loff_t offset, | |||
2609 | extern int generic_file_open(struct inode * inode, struct file * filp); | 2614 | extern int generic_file_open(struct inode * inode, struct file * filp); |
2610 | extern int nonseekable_open(struct inode * inode, struct file * filp); | 2615 | extern int nonseekable_open(struct inode * inode, struct file * filp); |
2611 | 2616 | ||
2612 | ssize_t dax_do_io(int rw, struct kiocb *, struct inode *, struct iov_iter *, | 2617 | ssize_t dax_do_io(struct kiocb *, struct inode *, struct iov_iter *, loff_t, |
2613 | loff_t, get_block_t, dio_iodone_t, int flags); | 2618 | get_block_t, dio_iodone_t, int flags); |
2614 | int dax_clear_blocks(struct inode *, sector_t block, long size); | 2619 | int dax_clear_blocks(struct inode *, sector_t block, long size); |
2615 | int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); | 2620 | int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); |
2616 | int dax_truncate_page(struct inode *, loff_t from, get_block_t); | 2621 | int dax_truncate_page(struct inode *, loff_t from, get_block_t); |
@@ -2635,16 +2640,18 @@ enum { | |||
2635 | 2640 | ||
2636 | void dio_end_io(struct bio *bio, int error); | 2641 | void dio_end_io(struct bio *bio, int error); |
2637 | 2642 | ||
2638 | ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, | 2643 | ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, |
2639 | struct block_device *bdev, struct iov_iter *iter, loff_t offset, | 2644 | struct block_device *bdev, struct iov_iter *iter, |
2640 | get_block_t get_block, dio_iodone_t end_io, | 2645 | loff_t offset, get_block_t get_block, |
2641 | dio_submit_t submit_io, int flags); | 2646 | dio_iodone_t end_io, dio_submit_t submit_io, |
2647 | int flags); | ||
2642 | 2648 | ||
2643 | static inline ssize_t blockdev_direct_IO(int rw, struct kiocb *iocb, | 2649 | static inline ssize_t blockdev_direct_IO(struct kiocb *iocb, |
2644 | struct inode *inode, struct iov_iter *iter, loff_t offset, | 2650 | struct inode *inode, |
2645 | get_block_t get_block) | 2651 | struct iov_iter *iter, loff_t offset, |
2652 | get_block_t get_block) | ||
2646 | { | 2653 | { |
2647 | return __blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iter, | 2654 | return __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, iter, |
2648 | offset, get_block, NULL, NULL, | 2655 | offset, get_block, NULL, NULL, |
2649 | DIO_LOCKING | DIO_SKIP_HOLES); | 2656 | DIO_LOCKING | DIO_SKIP_HOLES); |
2650 | } | 2657 | } |
@@ -2777,6 +2784,16 @@ static inline bool io_is_direct(struct file *filp) | |||
2777 | return (filp->f_flags & O_DIRECT) || IS_DAX(file_inode(filp)); | 2784 | return (filp->f_flags & O_DIRECT) || IS_DAX(file_inode(filp)); |
2778 | } | 2785 | } |
2779 | 2786 | ||
2787 | static inline int iocb_flags(struct file *file) | ||
2788 | { | ||
2789 | int res = 0; | ||
2790 | if (file->f_flags & O_APPEND) | ||
2791 | res |= IOCB_APPEND; | ||
2792 | if (io_is_direct(file)) | ||
2793 | res |= IOCB_DIRECT; | ||
2794 | return res; | ||
2795 | } | ||
2796 | |||
2780 | static inline ino_t parent_ino(struct dentry *dentry) | 2797 | static inline ino_t parent_ino(struct dentry *dentry) |
2781 | { | 2798 | { |
2782 | ino_t res; | 2799 | ino_t res; |