diff options
Diffstat (limited to 'fs/ext4/inode.c')
| -rw-r--r-- | fs/ext4/inode.c | 10 | 
1 files changed, 7 insertions, 3 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 42272d67955..0afc8c1d8cf 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)  }  static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, -			    ssize_t size, void *private) +			    ssize_t size, void *private, int ret, +			    bool is_async)  {          ext4_io_end_t *io_end = iocb->private;  	struct workqueue_struct *wq; @@ -3784,7 +3785,7 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,  	/* if not async direct IO or dio with 0 bytes write, just return */  	if (!io_end || !size) -		return; +		goto out;  	ext_debug("ext4_end_io_dio(): io_end 0x%p"  		  "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,  	if (io_end->flag != EXT4_IO_UNWRITTEN){  		ext4_free_io_end(io_end);  		iocb->private = NULL; -		return; +		goto out;  	}  	io_end->offset = offset; @@ -3812,6 +3813,9 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,  	list_add_tail(&io_end->list, &ei->i_completed_io_list);  	spin_unlock_irqrestore(&ei->i_completed_io_lock, flags);  	iocb->private = NULL; +out: +	if (is_async) +		aio_complete(iocb, ret, 0);  }  static void ext4_end_io_buffer_write(struct buffer_head *bh, int uptodate)  | 
