From: Badari Pulavarty 1) blkdev_direct_IO() calls blockdev_direct_IO() instead of blockdev_direct_IO_no_locking(). 2) writev entry point is generic_file_writev() which grabs i_sem. It should use generic_file_write_nolock() instead. --- 25-akpm/fs/block_dev.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff -puN fs/block_dev.c~blockdev-direct-io-speedup fs/block_dev.c --- 25/fs/block_dev.c~blockdev-direct-io-speedup 2004-04-03 03:00:09.861732344 -0800 +++ 25-akpm/fs/block_dev.c 2004-04-03 03:00:09.865731736 -0800 @@ -155,8 +155,8 @@ blkdev_direct_IO(int rw, struct kiocb *i struct file *file = iocb->ki_filp; struct inode *inode = file->f_mapping->host; - return blockdev_direct_IO(rw, iocb, inode, I_BDEV(inode), iov, offset, - nr_segs, blkdev_get_blocks, NULL); + return blockdev_direct_IO_no_locking(rw, iocb, inode, I_BDEV(inode), + iov, offset, nr_segs, blkdev_get_blocks, NULL); } static int blkdev_writepage(struct page *page, struct writeback_control *wbc) @@ -796,7 +796,7 @@ struct file_operations def_blk_fops = { .fsync = block_fsync, .ioctl = block_ioctl, .readv = generic_file_readv, - .writev = generic_file_writev, + .writev = generic_file_write_nolock, .sendfile = generic_file_sendfile, }; _