diff -druN Linux-2.4.16/fs/block_dev.c linux-2.4.16-odirect/fs/block_dev.c
--- Linux-2.4.16/fs/block_dev.c	Tue Dec  4 13:29:37 2001
+++ linux-2.4.16-odirect/fs/block_dev.c	Fri Dec 14 11:43:25 2001
@@ -113,9 +113,9 @@
 	return 0;
 }
 
-static int blkdev_direct_IO(int rw, struct inode * inode, struct kiobuf * iobuf, unsigned long blocknr, int blocksize)
+static int blkdev_direct_IO(int rw, struct file * file, struct kiobuf * iobuf, unsigned long blocknr, int blocksize)
 {
-	return generic_direct_IO(rw, inode, iobuf, blocknr, blocksize, blkdev_get_block);
+	return generic_direct_IO(rw, file, iobuf, blocknr, blocksize, blkdev_get_block);
 }
 
 static int blkdev_writepage(struct page * page)
diff -druN Linux-2.4.16/fs/buffer.c linux-2.4.16-odirect/fs/buffer.c
--- Linux-2.4.16/fs/buffer.c	Tue Dec  4 13:29:37 2001
+++ linux-2.4.16-odirect/fs/buffer.c	Fri Dec 14 11:43:25 2001
@@ -1998,10 +1998,11 @@
 	return tmp.b_blocknr;
 }
 
-int generic_direct_IO(int rw, struct inode * inode, struct kiobuf * iobuf, unsigned long blocknr, int blocksize, get_block_t * get_block)
+int generic_direct_IO(int rw, struct file * filp, struct kiobuf * iobuf, unsigned long blocknr, int blocksize, get_block_t * get_block)
 {
 	int i, nr_blocks, retval;
 	unsigned long * blocks = iobuf->blocks;
+	struct inode * inode = filp->f_dentry->d_inode;
 
 	nr_blocks = iobuf->length / blocksize;
 	/* build the blocklist */
diff -druN Linux-2.4.16/fs/ext2/inode.c linux-2.4.16-odirect/fs/ext2/inode.c
--- Linux-2.4.16/fs/ext2/inode.c	Tue Dec  4 13:29:37 2001
+++ linux-2.4.16-odirect/fs/ext2/inode.c	Fri Dec 14 11:43:25 2001
@@ -592,9 +592,9 @@
 {
 	return generic_block_bmap(mapping,block,ext2_get_block);
 }
-static int ext2_direct_IO(int rw, struct inode * inode, struct kiobuf * iobuf, unsigned long blocknr, int blocksize)
+static int ext2_direct_IO(int rw, struct file * file, struct kiobuf * iobuf, unsigned long blocknr, int blocksize)
 {
-	return generic_direct_IO(rw, inode, iobuf, blocknr, blocksize, ext2_get_block);
+	return generic_direct_IO(rw, file, iobuf, blocknr, blocksize, ext2_get_block);
 }
 struct address_space_operations ext2_aops = {
 	readpage: ext2_readpage,
diff -druN Linux-2.4.16/include/linux/fs.h linux-2.4.16-odirect/include/linux/fs.h
--- Linux-2.4.16/include/linux/fs.h	Tue Dec  4 13:29:37 2001
+++ linux-2.4.16-odirect/include/linux/fs.h	Fri Dec 14 11:46:48 2001
@@ -390,7 +390,7 @@
 	int (*flushpage) (struct page *, unsigned long);
 	int (*releasepage) (struct page *, int);
 #define KERNEL_HAS_O_DIRECT /* this is for modules out of the kernel */
-	int (*direct_IO)(int, struct inode *, struct kiobuf *, unsigned long, int);
+	int (*direct_IO)(int, struct file *, struct kiobuf *, unsigned long, int);
 };
 
 struct address_space {
@@ -1387,7 +1387,7 @@
 int generic_block_bmap(struct address_space *, long, get_block_t *);
 int generic_commit_write(struct file *, struct page *, unsigned, unsigned);
 int block_truncate_page(struct address_space *, loff_t, get_block_t *);
-extern int generic_direct_IO(int, struct inode *, struct kiobuf *, unsigned long, int, get_block_t *);
+extern int generic_direct_IO(int, struct file *, struct kiobuf *, unsigned long, int, get_block_t *);
 
 extern int waitfor_one_page(struct page*);
 extern int generic_file_mmap(struct file *, struct vm_area_struct *);
diff -druN Linux-2.4.16/mm/filemap.c linux-2.4.16-odirect/mm/filemap.c
--- Linux-2.4.16/mm/filemap.c	Tue Dec  4 13:29:37 2001
+++ linux-2.4.16-odirect/mm/filemap.c	Fri Dec 14 11:43:25 2001
@@ -1539,7 +1539,7 @@
 		if (retval)
 			break;
 
-		retval = mapping->a_ops->direct_IO(rw, inode, iobuf, (offset+progress) >> blocksize_bits, blocksize);
+		retval = mapping->a_ops->direct_IO(rw, filp, iobuf, (offset+progress) >> blocksize_bits, blocksize);
 
 		if (rw == READ && retval > 0)
 			mark_dirty_kiobuf(iobuf, retval);
