diff options
| author | Chuck Lever <cel@citi.umich.edu> | 2002-10-06 19:35:02 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-10-06 19:35:02 -0700 |
| commit | 3a453bd45ad56f395eabc85b07605ca1b9841b90 (patch) | |
| tree | 8dd28122c263f47adf555113cc81a06d84776e9f | |
| parent | 7570df54ef8cc5b42500d26562ff50fcbe265aa2 (diff) | |
[PATCH] add struct file* to ->direct_IO addr space op
This makes file credentials available to the ->direct_IO address space
operation by replacing its struct inode* argument with a struct file*
argument. this patch is a prerequisite for NFS direct I/O support. it
breaks the raw device driver.
| -rw-r--r-- | drivers/char/raw.c | 2 | ||||
| -rw-r--r-- | fs/block_dev.c | 4 | ||||
| -rw-r--r-- | fs/direct-io.c | 10 | ||||
| -rw-r--r-- | fs/ext2/inode.c | 4 | ||||
| -rw-r--r-- | fs/ext3/inode.c | 3 | ||||
| -rw-r--r-- | fs/jfs/inode.c | 4 | ||||
| -rw-r--r-- | fs/xfs/linux/xfs_aops.c | 4 | ||||
| -rw-r--r-- | include/linux/fs.h | 5 | ||||
| -rw-r--r-- | include/linux/nfs_fs.h | 7 | ||||
| -rw-r--r-- | kernel/ksyms.c | 1 | ||||
| -rw-r--r-- | mm/filemap.c | 4 |
11 files changed, 33 insertions, 15 deletions
diff --git a/drivers/char/raw.c b/drivers/char/raw.c index 2b08e77a18bb..e46835a29d94 100644 --- a/drivers/char/raw.c +++ b/drivers/char/raw.c @@ -222,7 +222,7 @@ rw_raw_dev(int rw, struct file *filp, const struct iovec *iov, unsigned long nr_ count = inode->i_size - *offp; nr_segs = iov_shorten((struct iovec *)iov, nr_segs, count); } - ret = generic_file_direct_IO(rw, inode, iov, *offp, nr_segs); + ret = generic_file_direct_IO(rw, filp, iov, *offp, nr_segs); if (ret > 0) *offp += ret; diff --git a/fs/block_dev.c b/fs/block_dev.c index e68b7c4434a5..3b95ff2d40a4 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -116,9 +116,11 @@ blkdev_get_blocks(struct inode *inode, sector_t iblock, } static int -blkdev_direct_IO(int rw, struct inode *inode, const struct iovec *iov, +blkdev_direct_IO(int rw, struct file *file, const struct iovec *iov, loff_t offset, unsigned long nr_segs) { + struct inode *inode = file->f_dentry->d_inode->i_mapping->host; + return generic_direct_IO(rw, inode, iov, offset, nr_segs, blkdev_get_blocks); } diff --git a/fs/direct-io.c b/fs/direct-io.c index 9fd5459ca757..de1b6c09e36b 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -646,14 +646,14 @@ out: } ssize_t -generic_file_direct_IO(int rw, struct inode *inode, const struct iovec *iov, +generic_file_direct_IO(int rw, struct file *file, const struct iovec *iov, loff_t offset, unsigned long nr_segs) { - struct address_space *mapping = inode->i_mapping; + struct address_space *mapping = file->f_dentry->d_inode->i_mapping; ssize_t retval; - retval = mapping->a_ops->direct_IO(rw, inode, iov, offset, nr_segs); - if (inode->i_mapping->nrpages) - invalidate_inode_pages2(inode->i_mapping); + retval = mapping->a_ops->direct_IO(rw, file, iov, offset, nr_segs); + if (mapping->nrpages) + invalidate_inode_pages2(mapping); return retval; } diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 99627183120e..e839532c3c14 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -619,9 +619,11 @@ ext2_get_blocks(struct inode *inode, sector_t iblock, unsigned long max_blocks, } static int -ext2_direct_IO(int rw, struct inode *inode, const struct iovec *iov, +ext2_direct_IO(int rw, struct file *file, const struct iovec *iov, loff_t offset, unsigned long nr_segs) { + struct inode *inode = file->f_dentry->d_inode->i_mapping->host; + return generic_direct_IO(rw, inode, iov, offset, nr_segs, ext2_get_blocks); } diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index 978e9e60d070..1dbd4f18f795 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c @@ -1399,10 +1399,11 @@ static int ext3_releasepage(struct page *page, int wait) * If the O_DIRECT write is intantiating holes inside i_size and the machine * crashes then stale disk data _may_ be exposed inside the file. */ -static int ext3_direct_IO(int rw, struct inode *inode, +static int ext3_direct_IO(int rw, struct file *file, const struct iovec *iov, loff_t offset, unsigned long nr_segs) { + struct inode *inode = file->f_dentry->d_inode->i_mapping->host; struct ext3_inode_info *ei = EXT3_I(inode); handle_t *handle = NULL; int ret; diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c index 91ab1b3f723f..b718fa7476de 100644 --- a/fs/jfs/inode.c +++ b/fs/jfs/inode.c @@ -310,9 +310,11 @@ static int jfs_bmap(struct address_space *mapping, long block) return generic_block_bmap(mapping, block, jfs_get_block); } -static int jfs_direct_IO(int rw, struct inode *inode, const struct iovec *iov, +static int jfs_direct_IO(int rw, struct file *file, const struct iovec *iov, loff_t offset, unsigned long nr_segs) { + struct inode *inode = file->f_dentry->d_inode->i_mapping->host; + return generic_direct_IO(rw, inode, iov, offset, nr_segs, jfs_get_blocks); } diff --git a/fs/xfs/linux/xfs_aops.c b/fs/xfs/linux/xfs_aops.c index 7eedce692a9a..5712ac810c4f 100644 --- a/fs/xfs/linux/xfs_aops.c +++ b/fs/xfs/linux/xfs_aops.c @@ -681,11 +681,13 @@ linvfs_get_blocks_direct( STATIC int linvfs_direct_IO( int rw, - struct inode *inode, + struct file *file, const struct iovec *iov, loff_t offset, unsigned long nr_segs) { + struct inode *inode = file->f_dentry->d_inode->i_mapping->host; + return generic_direct_IO(rw, inode, iov, offset, nr_segs, linvfs_get_blocks_direct); } diff --git a/include/linux/fs.h b/include/linux/fs.h index 56f2bab87d7f..85eae7f44f29 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -308,7 +308,8 @@ struct address_space_operations { int (*bmap)(struct address_space *, long); int (*invalidatepage) (struct page *, unsigned long); int (*releasepage) (struct page *, int); - int (*direct_IO)(int, struct inode *, const struct iovec *iov, loff_t offset, unsigned long nr_segs); + int (*direct_IO)(int, struct file *, const struct iovec *iov, + loff_t offset, unsigned long nr_segs); }; struct backing_dev_info; @@ -1247,7 +1248,7 @@ ssize_t generic_file_write_nolock(struct file *file, const struct iovec *iov, unsigned long nr_segs, loff_t *ppos); extern ssize_t generic_file_sendfile(struct file *, struct file *, loff_t *, size_t); extern void do_generic_file_read(struct file *, loff_t *, read_descriptor_t *, read_actor_t); -extern ssize_t generic_file_direct_IO(int rw, struct inode *inode, +extern ssize_t generic_file_direct_IO(int rw, struct file *file, const struct iovec *iov, loff_t offset, unsigned long nr_segs); extern int generic_direct_IO(int rw, struct inode *inode, const struct iovec *iov, loff_t offset, unsigned long nr_segs, get_blocks_t *get_blocks); diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index 16b3e1be73e3..c77fa88af5db 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h @@ -14,6 +14,7 @@ #include <linux/mm.h> #include <linux/pagemap.h> #include <linux/wait.h> +#include <linux/uio.h> #include <linux/nfs_fs_sb.h> @@ -284,6 +285,12 @@ nfs_file_cred(struct file *file) } /* + * linux/fs/nfs/direct.c + */ +extern int nfs_direct_IO(int, struct file *, const struct iovec *, loff_t, + unsigned long); + +/* * linux/fs/nfs/dir.c */ extern struct inode_operations nfs_dir_inode_operations; diff --git a/kernel/ksyms.c b/kernel/ksyms.c index 64069e405af5..4ad7fed0f601 100644 --- a/kernel/ksyms.c +++ b/kernel/ksyms.c @@ -192,6 +192,7 @@ EXPORT_SYMBOL(invalidate_bdev); EXPORT_SYMBOL(invalidate_inodes); EXPORT_SYMBOL(invalidate_device); EXPORT_SYMBOL(invalidate_inode_pages); +EXPORT_SYMBOL_GPL(invalidate_inode_pages2); EXPORT_SYMBOL(truncate_inode_pages); EXPORT_SYMBOL(fsync_bdev); EXPORT_SYMBOL(permission); diff --git a/mm/filemap.c b/mm/filemap.c index 066083f7ce63..bc7d653eba3f 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1158,7 +1158,7 @@ __generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, nr_segs = iov_shorten((struct iovec *)iov, nr_segs, count); } - retval = generic_file_direct_IO(READ, inode, + retval = generic_file_direct_IO(READ, filp, iov, pos, nr_segs); if (retval > 0) *ppos = pos + retval; @@ -1840,7 +1840,7 @@ generic_file_write_nolock(struct file *file, const struct iovec *iov, if (count != ocount) nr_segs = iov_shorten((struct iovec *)iov, nr_segs, count); - written = generic_file_direct_IO(WRITE, inode, + written = generic_file_direct_IO(WRITE, file, iov, pos, nr_segs); if (written > 0) { loff_t end = pos + written; |
