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;