mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-17 01:34:00 +08:00
namei: get rid of nameidata->base
we can do fdput() under rcu_read_lock() just fine; all we need to take care of is fetching nd->inode value first. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
8bcb77fabd
commit
34a26b99b7
13
fs/namei.c
13
fs/namei.c
@ -503,7 +503,6 @@ struct nameidata {
|
|||||||
int last_type;
|
int last_type;
|
||||||
unsigned depth;
|
unsigned depth;
|
||||||
int total_link_count;
|
int total_link_count;
|
||||||
struct file *base;
|
|
||||||
struct saved {
|
struct saved {
|
||||||
struct path link;
|
struct path link;
|
||||||
void *cookie;
|
void *cookie;
|
||||||
@ -1872,7 +1871,6 @@ static int path_init(int dfd, const struct filename *name, unsigned int flags,
|
|||||||
nd->last_type = LAST_ROOT; /* if there are only slashes... */
|
nd->last_type = LAST_ROOT; /* if there are only slashes... */
|
||||||
nd->flags = flags | LOOKUP_JUMPED | LOOKUP_PARENT;
|
nd->flags = flags | LOOKUP_JUMPED | LOOKUP_PARENT;
|
||||||
nd->depth = 0;
|
nd->depth = 0;
|
||||||
nd->base = NULL;
|
|
||||||
if (flags & LOOKUP_ROOT) {
|
if (flags & LOOKUP_ROOT) {
|
||||||
struct dentry *root = nd->root.dentry;
|
struct dentry *root = nd->root.dentry;
|
||||||
struct inode *inode = root->d_inode;
|
struct inode *inode = root->d_inode;
|
||||||
@ -1941,14 +1939,15 @@ static int path_init(int dfd, const struct filename *name, unsigned int flags,
|
|||||||
|
|
||||||
nd->path = f.file->f_path;
|
nd->path = f.file->f_path;
|
||||||
if (flags & LOOKUP_RCU) {
|
if (flags & LOOKUP_RCU) {
|
||||||
if (f.flags & FDPUT_FPUT)
|
|
||||||
nd->base = f.file;
|
|
||||||
nd->seq = __read_seqcount_begin(&nd->path.dentry->d_seq);
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
|
nd->inode = nd->path.dentry->d_inode;
|
||||||
|
nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq);
|
||||||
} else {
|
} else {
|
||||||
path_get(&nd->path);
|
path_get(&nd->path);
|
||||||
fdput(f);
|
nd->inode = nd->path.dentry->d_inode;
|
||||||
}
|
}
|
||||||
|
fdput(f);
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
nd->inode = nd->path.dentry->d_inode;
|
nd->inode = nd->path.dentry->d_inode;
|
||||||
@ -1971,8 +1970,6 @@ static void path_cleanup(struct nameidata *nd)
|
|||||||
path_put(&nd->root);
|
path_put(&nd->root);
|
||||||
nd->root.mnt = NULL;
|
nd->root.mnt = NULL;
|
||||||
}
|
}
|
||||||
if (unlikely(nd->base))
|
|
||||||
fput(nd->base);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int trailing_symlink(struct nameidata *nd)
|
static int trailing_symlink(struct nameidata *nd)
|
||||||
|
Loading…
Reference in New Issue
Block a user