Commit dd37978c authored by Al Viro's avatar Al Viro

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: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 5e608671
...@@ -176,6 +176,7 @@ struct file *alloc_file(struct path *path, fmode_t mode, ...@@ -176,6 +176,7 @@ struct file *alloc_file(struct path *path, fmode_t mode,
return file; return file;
file->f_path = *path; file->f_path = *path;
file->f_inode = path->dentry->d_inode;
file->f_mapping = path->dentry->d_inode->i_mapping; file->f_mapping = path->dentry->d_inode->i_mapping;
file->f_mode = mode; file->f_mode = mode;
file->f_op = fop; file->f_op = fop;
...@@ -258,6 +259,7 @@ static void __fput(struct file *file) ...@@ -258,6 +259,7 @@ static void __fput(struct file *file)
drop_file_write_access(file); drop_file_write_access(file);
file->f_path.dentry = NULL; file->f_path.dentry = NULL;
file->f_path.mnt = NULL; file->f_path.mnt = NULL;
file->f_inode = NULL;
file_free(file); file_free(file);
dput(dentry); dput(dentry);
mntput(mnt); mntput(mnt);
......
...@@ -689,7 +689,7 @@ static int do_dentry_open(struct file *f, ...@@ -689,7 +689,7 @@ static int do_dentry_open(struct file *f,
f->f_mode = FMODE_PATH; f->f_mode = FMODE_PATH;
path_get(&f->f_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) { if (f->f_mode & FMODE_WRITE) {
error = __get_file_write_access(inode, f->f_path.mnt); error = __get_file_write_access(inode, f->f_path.mnt);
if (error) if (error)
...@@ -752,6 +752,7 @@ static int do_dentry_open(struct file *f, ...@@ -752,6 +752,7 @@ static int do_dentry_open(struct file *f,
path_put(&f->f_path); path_put(&f->f_path);
f->f_path.mnt = NULL; f->f_path.mnt = NULL;
f->f_path.dentry = NULL; f->f_path.dentry = NULL;
f->f_inode = NULL;
return error; return error;
} }
......
...@@ -769,6 +769,7 @@ struct file { ...@@ -769,6 +769,7 @@ struct file {
} f_u; } f_u;
struct path f_path; struct path f_path;
#define f_dentry f_path.dentry #define f_dentry f_path.dentry
struct inode *f_inode; /* cached value */
const struct file_operations *f_op; const struct file_operations *f_op;
/* /*
...@@ -2217,7 +2218,7 @@ static inline bool execute_ok(struct inode *inode) ...@@ -2217,7 +2218,7 @@ static inline bool execute_ok(struct inode *inode)
static inline struct inode *file_inode(struct file *f) static inline struct inode *file_inode(struct file *f)
{ {
return f->f_path.dentry->d_inode; return f->f_inode;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment