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>
This commit is contained in:
parent
5e608671df
commit
dd37978c50
3 changed files with 6 additions and 2 deletions
|
@ -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)
|
||||||
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,
|
||||||
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,
|
||||||
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 {
|
||||||
} 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)
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue