cache the value of file_inode() in struct file
Note that this thing does *not* contribute to inode refcount;
it's pinned down by dentry.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
diff --git a/fs/file_table.c b/fs/file_table.c
index aa07d36..cd4d87a 100644
--- a/fs/file_table.c
+++ b/fs/file_table.c
@@ -176,6 +176,7 @@
return file;
file->f_path = *path;
+ file->f_inode = path->dentry->d_inode;
file->f_mapping = path->dentry->d_inode->i_mapping;
file->f_mode = mode;
file->f_op = fop;
@@ -258,6 +259,7 @@
drop_file_write_access(file);
file->f_path.dentry = NULL;
file->f_path.mnt = NULL;
+ file->f_inode = NULL;
file_free(file);
dput(dentry);
mntput(mnt);
diff --git a/fs/open.c b/fs/open.c
index 62f907e..806d458 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -689,7 +689,7 @@
f->f_mode = FMODE_PATH;
path_get(&f->f_path);
- inode = file_inode(f);
+ inode = f->f_inode = f->f_path.dentry->d_inode;
if (f->f_mode & FMODE_WRITE) {
error = __get_file_write_access(inode, f->f_path.mnt);
if (error)
@@ -752,6 +752,7 @@
path_put(&f->f_path);
f->f_path.mnt = NULL;
f->f_path.dentry = NULL;
+ f->f_inode = NULL;
return error;
}
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 4e686a0..74a907b 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -769,6 +769,7 @@
} f_u;
struct path f_path;
#define f_dentry f_path.dentry
+ struct inode *f_inode; /* cached value */
const struct file_operations *f_op;
/*
@@ -2217,7 +2218,7 @@
static inline struct inode *file_inode(struct file *f)
{
- return f->f_path.dentry->d_inode;
+ return f->f_inode;
}
/*