aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2010-07-27 11:56:06 -0400
committerTheodore Ts'o <tytso@mit.edu>2010-07-27 11:56:06 -0400
commit552ef8024f909d9b3a7442d0ab0d48a22de24e9e (patch)
tree868af331b76e12c8d17b8449094065a069e0d759 /fs/ext4
parent5c521830cf3dfcf7638d409d8e02ed21020c064f (diff)
direct-io: move aio_complete into ->end_io
Filesystems with unwritten extent support must not complete an AIO request until the transaction to convert the extent has been commited. That means the aio_complete calls needs to be moved into the ->end_io callback so that the filesystem can control when to call it exactly. This makes a bit of a mess out of dio_complete and the ->end_io callback prototype even more complicated. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Jan Kara <jack@suse.cz> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4')
-rw-r--r--fs/ext4/inode.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 699d1d01c5df..609159e990de 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -3775,7 +3775,8 @@ static ext4_io_end_t *ext4_init_io_end (struct inode *inode, gfp_t flags)
3775} 3775}
3776 3776
3777static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, 3777static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,
3778 ssize_t size, void *private) 3778 ssize_t size, void *private, int ret,
3779 bool is_async)
3779{ 3780{
3780 ext4_io_end_t *io_end = iocb->private; 3781 ext4_io_end_t *io_end = iocb->private;
3781 struct workqueue_struct *wq; 3782 struct workqueue_struct *wq;
@@ -3784,7 +3785,7 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,
3784 3785
3785 /* if not async direct IO or dio with 0 bytes write, just return */ 3786 /* if not async direct IO or dio with 0 bytes write, just return */
3786 if (!io_end || !size) 3787 if (!io_end || !size)
3787 return; 3788 goto out;
3788 3789
3789 ext_debug("ext4_end_io_dio(): io_end 0x%p" 3790 ext_debug("ext4_end_io_dio(): io_end 0x%p"
3790 "for inode %lu, iocb 0x%p, offset %llu, size %llu\n", 3791 "for inode %lu, iocb 0x%p, offset %llu, size %llu\n",
@@ -3795,7 +3796,7 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,
3795 if (io_end->flag != EXT4_IO_UNWRITTEN){ 3796 if (io_end->flag != EXT4_IO_UNWRITTEN){
3796 ext4_free_io_end(io_end); 3797 ext4_free_io_end(io_end);
3797 iocb->private = NULL; 3798 iocb->private = NULL;
3798 return; 3799 goto out;
3799 } 3800 }
3800 3801
3801 io_end->offset = offset; 3802 io_end->offset = offset;
@@ -3812,6 +3813,9 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,
3812 list_add_tail(&io_end->list, &ei->i_completed_io_list); 3813 list_add_tail(&io_end->list, &ei->i_completed_io_list);
3813 spin_unlock_irqrestore(&ei->i_completed_io_lock, flags); 3814 spin_unlock_irqrestore(&ei->i_completed_io_lock, flags);
3814 iocb->private = NULL; 3815 iocb->private = NULL;
3816out:
3817 if (is_async)
3818 aio_complete(iocb, ret, 0);
3815} 3819}
3816 3820
3817static void ext4_end_io_buffer_write(struct buffer_head *bh, int uptodate) 3821static void ext4_end_io_buffer_write(struct buffer_head *bh, int uptodate)