summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChuck Lever <cel@citi.umich.edu>2002-10-06 19:35:02 -0700
committerLinus Torvalds <torvalds@home.transmeta.com>2002-10-06 19:35:02 -0700
commit3a453bd45ad56f395eabc85b07605ca1b9841b90 (patch)
tree8dd28122c263f47adf555113cc81a06d84776e9f
parent7570df54ef8cc5b42500d26562ff50fcbe265aa2 (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.c2
-rw-r--r--fs/block_dev.c4
-rw-r--r--fs/direct-io.c10
-rw-r--r--fs/ext2/inode.c4
-rw-r--r--fs/ext3/inode.c3
-rw-r--r--fs/jfs/inode.c4
-rw-r--r--fs/xfs/linux/xfs_aops.c4
-rw-r--r--include/linux/fs.h5
-rw-r--r--include/linux/nfs_fs.h7
-rw-r--r--kernel/ksyms.c1
-rw-r--r--mm/filemap.c4
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;