From: Christoph Hellwig XFS will have to look at iocb->private to fix aio+dio. No other filesystem is using the blockdev_direct_IO* end_io callback. Signed-off-by: Christoph Hellwig Signed-off-by: Andrew Morton --- fs/direct-io.c | 2 +- fs/xfs/linux-2.6/xfs_aops.c | 3 ++- include/linux/fs.h | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff -puN fs/direct-io.c~pass-iocb-to-dio_iodone_t fs/direct-io.c --- 25/fs/direct-io.c~pass-iocb-to-dio_iodone_t 2005-06-10 17:49:51.000000000 -0700 +++ 25-akpm/fs/direct-io.c 2005-06-10 17:49:51.000000000 -0700 @@ -215,7 +215,7 @@ static struct page *dio_get_page(struct static void dio_complete(struct dio *dio, loff_t offset, ssize_t bytes) { if (dio->end_io && dio->result) - dio->end_io(dio->inode, offset, bytes, dio->map_bh.b_private); + dio->end_io(dio->iocb, offset, bytes, dio->map_bh.b_private); if (dio->lock_type == DIO_LOCKING) up_read(&dio->inode->i_alloc_sem); } diff -puN fs/xfs/linux-2.6/xfs_aops.c~pass-iocb-to-dio_iodone_t fs/xfs/linux-2.6/xfs_aops.c --- 25/fs/xfs/linux-2.6/xfs_aops.c~pass-iocb-to-dio_iodone_t 2005-06-10 17:49:51.000000000 -0700 +++ 25-akpm/fs/xfs/linux-2.6/xfs_aops.c 2005-06-10 17:49:51.000000000 -0700 @@ -149,11 +149,12 @@ linvfs_unwritten_convert( */ STATIC void linvfs_unwritten_convert_direct( - struct inode *inode, + struct kiocb *iocb, loff_t offset, ssize_t size, void *private) { + struct inode *inode = iocb->ki_filp->f_dentry->d_inode; ASSERT(!private || inode == (struct inode *)private); /* private indicates an unwritten extent lay beneath this IO */ diff -puN include/linux/fs.h~pass-iocb-to-dio_iodone_t include/linux/fs.h --- 25/include/linux/fs.h~pass-iocb-to-dio_iodone_t 2005-06-10 17:49:51.000000000 -0700 +++ 25-akpm/include/linux/fs.h 2005-06-10 17:49:51.000000000 -0700 @@ -221,6 +221,7 @@ extern int dir_notify_enable; struct iovec; struct nameidata; +struct kiocb; struct pipe_inode_info; struct poll_table_struct; struct kstatfs; @@ -241,7 +242,7 @@ typedef int (get_block_t)(struct inode * typedef int (get_blocks_t)(struct inode *inode, sector_t iblock, unsigned long max_blocks, struct buffer_head *bh_result, int create); -typedef void (dio_iodone_t)(struct inode *inode, loff_t offset, +typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset, ssize_t bytes, void *private); /* @@ -303,7 +304,6 @@ struct iattr { struct page; struct address_space; struct writeback_control; -struct kiocb; struct address_space_operations { int (*writepage)(struct page *page, struct writeback_control *wbc); _