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);