diff options
Diffstat (limited to 'fs/proc/namespaces.c')
| -rw-r--r-- | fs/proc/namespaces.c | 24 | 
1 files changed, 9 insertions, 15 deletions
diff --git a/fs/proc/namespaces.c b/fs/proc/namespaces.c index 59b17e509f46..dd2b35f78b09 100644 --- a/fs/proc/namespaces.c +++ b/fs/proc/namespaces.c @@ -87,28 +87,24 @@ static const struct inode_operations proc_ns_link_inode_operations = {  	.setattr	= proc_setattr,  }; -static int proc_ns_instantiate(struct inode *dir, -	struct dentry *dentry, struct task_struct *task, const void *ptr) +static struct dentry *proc_ns_instantiate(struct dentry *dentry, +	struct task_struct *task, const void *ptr)  {  	const struct proc_ns_operations *ns_ops = ptr;  	struct inode *inode;  	struct proc_inode *ei; -	inode = proc_pid_make_inode(dir->i_sb, task, S_IFLNK | S_IRWXUGO); +	inode = proc_pid_make_inode(dentry->d_sb, task, S_IFLNK | S_IRWXUGO);  	if (!inode) -		goto out; +		return ERR_PTR(-ENOENT);  	ei = PROC_I(inode);  	inode->i_op = &proc_ns_link_inode_operations;  	ei->ns_ops = ns_ops; +	pid_update_inode(task, inode);  	d_set_d_op(dentry, &pid_dentry_operations); -	d_add(dentry, inode); -	/* Close the race of the process dying before we return the dentry */ -	if (pid_revalidate(dentry, 0)) -		return 0; -out: -	return -ENOENT; +	return d_splice_alias(inode, dentry);  }  static int proc_ns_dir_readdir(struct file *file, struct dir_context *ctx) @@ -147,12 +143,10 @@ const struct file_operations proc_ns_dir_operations = {  static struct dentry *proc_ns_dir_lookup(struct inode *dir,  				struct dentry *dentry, unsigned int flags)  { -	int error;  	struct task_struct *task = get_proc_task(dir);  	const struct proc_ns_operations **entry, **last;  	unsigned int len = dentry->d_name.len; - -	error = -ENOENT; +	struct dentry *res = ERR_PTR(-ENOENT);  	if (!task)  		goto out_no_task; @@ -167,11 +161,11 @@ static struct dentry *proc_ns_dir_lookup(struct inode *dir,  	if (entry == last)  		goto out; -	error = proc_ns_instantiate(dir, dentry, task, *entry); +	res = proc_ns_instantiate(dentry, task, *entry);  out:  	put_task_struct(task);  out_no_task: -	return ERR_PTR(error); +	return res;  }  const struct inode_operations proc_ns_dir_inode_operations = {  |