diff -urN o_direct-ref/fs/block_dev.c o_direct/fs/block_dev.c --- o_direct-ref/fs/block_dev.c Sun Sep 30 18:44:00 2001 +++ o_direct/fs/block_dev.c Sun Sep 30 18:48:59 2001 @@ -136,6 +136,11 @@ return 0; } +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); +} + static int blkdev_writepage(struct page * page) { return block_write_full_page(page, blkdev_get_block); diff -urN o_direct-ref/mm/filemap.c o_direct/mm/filemap.c --- o_direct-ref/mm/filemap.c Sun Sep 30 18:44:00 2001 +++ o_direct/mm/filemap.c Sun Sep 30 18:49:28 2001 @@ -1380,13 +1380,8 @@ new_iobuf = 1; } - if (!S_ISBLK(inode->i_mode)) { - blocksize = inode->i_sb->s_blocksize; - blocksize_bits = inode->i_sb->s_blocksize_bits; - } else { - blocksize = BUFFERED_BLOCKSIZE; - blocksize_bits = BUFFERED_BLOCKSIZE_BITS; - } + blocksize = inode->i_sb->s_blocksize; + blocksize_bits = inode->i_sb->s_blocksize_bits; blocksize_mask = blocksize - 1; chunk_size = KIO_MAX_ATOMIC_IO << 10; @@ -1510,7 +1505,7 @@ retval = 0; if (!count) goto out; /* skip atime */ - size = calc_rsize(inode); + size = inode->i_size; if (pos < size) { if (pos + count > size) count = size - pos;