diff options
-rw-r--r-- | fs/dax.c | 9 | ||||
-rw-r--r-- | fs/direct-io.c | 9 | ||||
-rw-r--r-- | fs/ext4/inode.c | 9 | ||||
-rw-r--r-- | fs/ocfs2/aops.c | 7 | ||||
-rw-r--r-- | fs/xfs/xfs_aops.c | 13 | ||||
-rw-r--r-- | include/linux/fs.h | 2 |
6 files changed, 35 insertions, 14 deletions
@@ -267,8 +267,13 @@ ssize_t dax_do_io(struct kiocb *iocb, struct inode *inode, | |||
267 | if ((flags & DIO_LOCKING) && iov_iter_rw(iter) == READ) | 267 | if ((flags & DIO_LOCKING) && iov_iter_rw(iter) == READ) |
268 | inode_unlock(inode); | 268 | inode_unlock(inode); |
269 | 269 | ||
270 | if ((retval > 0) && end_io) | 270 | if (end_io) { |
271 | end_io(iocb, pos, retval, bh.b_private); | 271 | int err; |
272 | |||
273 | err = end_io(iocb, pos, retval, bh.b_private); | ||
274 | if (err) | ||
275 | retval = err; | ||
276 | } | ||
272 | 277 | ||
273 | if (!(flags & DIO_SKIP_DIO_COUNT)) | 278 | if (!(flags & DIO_SKIP_DIO_COUNT)) |
274 | inode_dio_end(inode); | 279 | inode_dio_end(inode); |
diff --git a/fs/direct-io.c b/fs/direct-io.c index 1b2f7ffc8b84..9c6f885cc518 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c | |||
@@ -253,8 +253,13 @@ static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, | |||
253 | if (ret == 0) | 253 | if (ret == 0) |
254 | ret = transferred; | 254 | ret = transferred; |
255 | 255 | ||
256 | if (dio->end_io && dio->result) | 256 | if (dio->end_io) { |
257 | dio->end_io(dio->iocb, offset, transferred, dio->private); | 257 | int err; |
258 | |||
259 | err = dio->end_io(dio->iocb, offset, ret, dio->private); | ||
260 | if (err) | ||
261 | ret = err; | ||
262 | } | ||
258 | 263 | ||
259 | if (!(dio->flags & DIO_SKIP_DIO_COUNT)) | 264 | if (!(dio->flags & DIO_SKIP_DIO_COUNT)) |
260 | inode_dio_end(dio->inode); | 265 | inode_dio_end(dio->inode); |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 83bc8bfb3bea..9db04dd9b88a 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -3161,14 +3161,17 @@ out: | |||
3161 | } | 3161 | } |
3162 | #endif | 3162 | #endif |
3163 | 3163 | ||
3164 | static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, | 3164 | static int ext4_end_io_dio(struct kiocb *iocb, loff_t offset, |
3165 | ssize_t size, void *private) | 3165 | ssize_t size, void *private) |
3166 | { | 3166 | { |
3167 | ext4_io_end_t *io_end = iocb->private; | 3167 | ext4_io_end_t *io_end = iocb->private; |
3168 | 3168 | ||
3169 | if (size <= 0) | ||
3170 | return 0; | ||
3171 | |||
3169 | /* if not async direct IO just return */ | 3172 | /* if not async direct IO just return */ |
3170 | if (!io_end) | 3173 | if (!io_end) |
3171 | return; | 3174 | return 0; |
3172 | 3175 | ||
3173 | ext_debug("ext4_end_io_dio(): io_end 0x%p " | 3176 | ext_debug("ext4_end_io_dio(): io_end 0x%p " |
3174 | "for inode %lu, iocb 0x%p, offset %llu, size %zd\n", | 3177 | "for inode %lu, iocb 0x%p, offset %llu, size %zd\n", |
@@ -3179,6 +3182,8 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, | |||
3179 | io_end->offset = offset; | 3182 | io_end->offset = offset; |
3180 | io_end->size = size; | 3183 | io_end->size = size; |
3181 | ext4_put_io_end(io_end); | 3184 | ext4_put_io_end(io_end); |
3185 | |||
3186 | return 0; | ||
3182 | } | 3187 | } |
3183 | 3188 | ||
3184 | /* | 3189 | /* |
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 794fd1587f34..5dcc5f5a842e 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
@@ -620,7 +620,7 @@ bail: | |||
620 | * particularly interested in the aio/dio case. We use the rw_lock DLM lock | 620 | * particularly interested in the aio/dio case. We use the rw_lock DLM lock |
621 | * to protect io on one node from truncation on another. | 621 | * to protect io on one node from truncation on another. |
622 | */ | 622 | */ |
623 | static void ocfs2_dio_end_io(struct kiocb *iocb, | 623 | static int ocfs2_dio_end_io(struct kiocb *iocb, |
624 | loff_t offset, | 624 | loff_t offset, |
625 | ssize_t bytes, | 625 | ssize_t bytes, |
626 | void *private) | 626 | void *private) |
@@ -628,6 +628,9 @@ static void ocfs2_dio_end_io(struct kiocb *iocb, | |||
628 | struct inode *inode = file_inode(iocb->ki_filp); | 628 | struct inode *inode = file_inode(iocb->ki_filp); |
629 | int level; | 629 | int level; |
630 | 630 | ||
631 | if (bytes <= 0) | ||
632 | return 0; | ||
633 | |||
631 | /* this io's submitter should not have unlocked this before we could */ | 634 | /* this io's submitter should not have unlocked this before we could */ |
632 | BUG_ON(!ocfs2_iocb_is_rw_locked(iocb)); | 635 | BUG_ON(!ocfs2_iocb_is_rw_locked(iocb)); |
633 | 636 | ||
@@ -644,6 +647,8 @@ static void ocfs2_dio_end_io(struct kiocb *iocb, | |||
644 | level = ocfs2_iocb_rw_locked_level(iocb); | 647 | level = ocfs2_iocb_rw_locked_level(iocb); |
645 | ocfs2_rw_unlock(inode, level); | 648 | ocfs2_rw_unlock(inode, level); |
646 | } | 649 | } |
650 | |||
651 | return 0; | ||
647 | } | 652 | } |
648 | 653 | ||
649 | static int ocfs2_releasepage(struct page *page, gfp_t wait) | 654 | static int ocfs2_releasepage(struct page *page, gfp_t wait) |
diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 379c089fb051..295aaffea78e 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c | |||
@@ -1645,7 +1645,7 @@ out_end_io: | |||
1645 | * case the completion can be called in interrupt context, whereas if we have an | 1645 | * case the completion can be called in interrupt context, whereas if we have an |
1646 | * ioend we will always be called in task context (i.e. from a workqueue). | 1646 | * ioend we will always be called in task context (i.e. from a workqueue). |
1647 | */ | 1647 | */ |
1648 | STATIC void | 1648 | STATIC int |
1649 | xfs_end_io_direct_write( | 1649 | xfs_end_io_direct_write( |
1650 | struct kiocb *iocb, | 1650 | struct kiocb *iocb, |
1651 | loff_t offset, | 1651 | loff_t offset, |
@@ -1655,15 +1655,19 @@ xfs_end_io_direct_write( | |||
1655 | struct inode *inode = file_inode(iocb->ki_filp); | 1655 | struct inode *inode = file_inode(iocb->ki_filp); |
1656 | struct xfs_ioend *ioend = private; | 1656 | struct xfs_ioend *ioend = private; |
1657 | 1657 | ||
1658 | if (size <= 0) | ||
1659 | return 0; | ||
1660 | |||
1658 | trace_xfs_gbmap_direct_endio(XFS_I(inode), offset, size, | 1661 | trace_xfs_gbmap_direct_endio(XFS_I(inode), offset, size, |
1659 | ioend ? ioend->io_type : 0, NULL); | 1662 | ioend ? ioend->io_type : 0, NULL); |
1660 | 1663 | ||
1661 | if (!ioend) { | 1664 | if (!ioend) { |
1662 | ASSERT(offset + size <= i_size_read(inode)); | 1665 | ASSERT(offset + size <= i_size_read(inode)); |
1663 | return; | 1666 | return 0; |
1664 | } | 1667 | } |
1665 | 1668 | ||
1666 | __xfs_end_io_direct_write(inode, ioend, offset, size); | 1669 | __xfs_end_io_direct_write(inode, ioend, offset, size); |
1670 | return 0; | ||
1667 | } | 1671 | } |
1668 | 1672 | ||
1669 | static inline ssize_t | 1673 | static inline ssize_t |
@@ -1672,10 +1676,7 @@ xfs_vm_do_dio( | |||
1672 | struct kiocb *iocb, | 1676 | struct kiocb *iocb, |
1673 | struct iov_iter *iter, | 1677 | struct iov_iter *iter, |
1674 | loff_t offset, | 1678 | loff_t offset, |
1675 | void (*endio)(struct kiocb *iocb, | 1679 | dio_iodone_t endio, |
1676 | loff_t offset, | ||
1677 | ssize_t size, | ||
1678 | void *private), | ||
1679 | int flags) | 1680 | int flags) |
1680 | { | 1681 | { |
1681 | struct block_device *bdev; | 1682 | struct block_device *bdev; |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 1a2046275cdf..d7f37bfcbdce 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -70,7 +70,7 @@ extern int sysctl_protected_hardlinks; | |||
70 | struct buffer_head; | 70 | struct buffer_head; |
71 | typedef int (get_block_t)(struct inode *inode, sector_t iblock, | 71 | typedef int (get_block_t)(struct inode *inode, sector_t iblock, |
72 | struct buffer_head *bh_result, int create); | 72 | struct buffer_head *bh_result, int create); |
73 | typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset, | 73 | typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset, |
74 | ssize_t bytes, void *private); | 74 | ssize_t bytes, void *private); |
75 | typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); | 75 | typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); |
76 | 76 | ||