--- fs/block_dev.c.vanilla Sat Dec 8 22:46:15 2001 +++ fs/block_dev.c Sat Dec 8 23:30:53 2001 @@ -115,7 +115,28 @@ static int blkdev_direct_IO(int rw, struct inode * inode, struct kiobuf * iobuf, unsigned long blocknr, int blocksize) { - return generic_direct_IO(rw, inode, iobuf, blocknr, blocksize, blkdev_get_block); + int i, nr_blocks, retval, dev = inode->i_rdev; + unsigned long * blocks = iobuf->blocks; + + if (blocksize != BUFFERED_BLOCKSIZE) + BUG(); + + nr_blocks = iobuf->length >> BUFFERED_BLOCKSIZE_BITS; + /* build the blocklist */ + for (i = 0; i < nr_blocks; i++, blocknr++) { + struct buffer_head bh; + + retval = blkdev_get_block(inode, blocknr, &bh, 0); + if (retval) + goto out; + + blocks[i] = bh.b_blocknr; + } + + retval = brw_kiovec(rw, 1, &iobuf, dev, iobuf->blocks, blocksize); + + out: + return retval; } static int blkdev_writepage(struct page * page) --- include/linux/fs.h.vanilla Sat Dec 8 23:08:37 2001 +++ include/linux/fs.h Sat Dec 8 23:08:02 2001 @@ -46,6 +46,10 @@ #define BLOCK_SIZE_BITS 10 #define BLOCK_SIZE (1<