diff -urN o_direct-ref/fs/block_dev.c o_direct/fs/block_dev.c --- o_direct-ref/fs/block_dev.c Thu Oct 11 04:42:55 2001 +++ o_direct/fs/block_dev.c Thu Oct 11 04:43:09 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 Thu Oct 11 04:42:55 2001 +++ o_direct/mm/filemap.c Thu Oct 11 04:43:10 2001 @@ -1377,13 +1377,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 = 1 << inode->i_blkbits; + blocksize_bits = inode->i_blkbits; blocksize_mask = blocksize - 1; chunk_size = KIO_MAX_ATOMIC_IO << 10; @@ -1507,7 +1502,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;