aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/fs.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/fs.h')
-rw-r--r--include/linux/fs.h41
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;
315struct writeback_control; 315struct 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
319struct kiocb { 321struct 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
334static inline int iocb_flags(struct file *file);
335
332static inline void init_sync_kiocb(struct kiocb *kiocb, struct file *filp) 336static 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
2567extern int generic_file_mmap(struct file *, struct vm_area_struct *); 2572extern int generic_file_mmap(struct file *, struct vm_area_struct *);
2568extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *); 2573extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *);
2569int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isblk); 2574extern ssize_t generic_write_checks(struct kiocb *, struct iov_iter *);
2570extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *); 2575extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *);
2571extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *); 2576extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *);
2572extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *); 2577extern 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,
2609extern int generic_file_open(struct inode * inode, struct file * filp); 2614extern int generic_file_open(struct inode * inode, struct file * filp);
2610extern int nonseekable_open(struct inode * inode, struct file * filp); 2615extern int nonseekable_open(struct inode * inode, struct file * filp);
2611 2616
2612ssize_t dax_do_io(int rw, struct kiocb *, struct inode *, struct iov_iter *, 2617ssize_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);
2614int dax_clear_blocks(struct inode *, sector_t block, long size); 2619int dax_clear_blocks(struct inode *, sector_t block, long size);
2615int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); 2620int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t);
2616int dax_truncate_page(struct inode *, loff_t from, get_block_t); 2621int dax_truncate_page(struct inode *, loff_t from, get_block_t);
@@ -2635,16 +2640,18 @@ enum {
2635 2640
2636void dio_end_io(struct bio *bio, int error); 2641void dio_end_io(struct bio *bio, int error);
2637 2642
2638ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, 2643ssize_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
2643static inline ssize_t blockdev_direct_IO(int rw, struct kiocb *iocb, 2649static 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
2787static 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
2780static inline ino_t parent_ino(struct dentry *dentry) 2797static inline ino_t parent_ino(struct dentry *dentry)
2781{ 2798{
2782 ino_t res; 2799 ino_t res;