procfs: make /self and /thread_self dentries persistent
... and there's no need to remember those pointers anywhere - ->kill_sb() no longer needs to bother since kill_anon_super() will take care of them anyway and proc_pid_readdir() only wants the inumbers, which we had in a couple of static variables all along. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>pull/1354/merge
parent
2313598222
commit
23cbc7a795
|
|
@ -3585,14 +3585,12 @@ int proc_pid_readdir(struct file *file, struct dir_context *ctx)
|
|||
return 0;
|
||||
|
||||
if (pos == TGID_OFFSET - 2) {
|
||||
struct inode *inode = d_inode(fs_info->proc_self);
|
||||
if (!dir_emit(ctx, "self", 4, inode->i_ino, DT_LNK))
|
||||
if (!dir_emit(ctx, "self", 4, self_inum, DT_LNK))
|
||||
return 0;
|
||||
ctx->pos = pos = pos + 1;
|
||||
}
|
||||
if (pos == TGID_OFFSET - 1) {
|
||||
struct inode *inode = d_inode(fs_info->proc_thread_self);
|
||||
if (!dir_emit(ctx, "thread-self", 11, inode->i_ino, DT_LNK))
|
||||
if (!dir_emit(ctx, "thread-self", 11, thread_self_inum, DT_LNK))
|
||||
return 0;
|
||||
ctx->pos = pos = pos + 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -373,6 +373,7 @@ static inline void proc_tty_init(void) {}
|
|||
extern struct proc_dir_entry proc_root;
|
||||
|
||||
extern void proc_self_init(void);
|
||||
extern unsigned self_inum, thread_self_inum;
|
||||
|
||||
/*
|
||||
* task_[no]mmu.c
|
||||
|
|
|
|||
|
|
@ -347,17 +347,11 @@ static void proc_kill_sb(struct super_block *sb)
|
|||
{
|
||||
struct proc_fs_info *fs_info = proc_sb_info(sb);
|
||||
|
||||
if (!fs_info) {
|
||||
kill_anon_super(sb);
|
||||
return;
|
||||
}
|
||||
|
||||
dput(fs_info->proc_self);
|
||||
dput(fs_info->proc_thread_self);
|
||||
|
||||
kill_anon_super(sb);
|
||||
put_pid_ns(fs_info->pid_ns);
|
||||
kfree_rcu(fs_info, rcu);
|
||||
if (fs_info) {
|
||||
put_pid_ns(fs_info->pid_ns);
|
||||
kfree_rcu(fs_info, rcu);
|
||||
}
|
||||
}
|
||||
|
||||
static struct file_system_type proc_fs_type = {
|
||||
|
|
|
|||
|
|
@ -31,12 +31,11 @@ static const struct inode_operations proc_self_inode_operations = {
|
|||
.get_link = proc_self_get_link,
|
||||
};
|
||||
|
||||
static unsigned self_inum __ro_after_init;
|
||||
unsigned self_inum __ro_after_init;
|
||||
|
||||
int proc_setup_self(struct super_block *s)
|
||||
{
|
||||
struct inode *root_inode = d_inode(s->s_root);
|
||||
struct proc_fs_info *fs_info = proc_sb_info(s);
|
||||
struct dentry *self;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
|
|
@ -51,18 +50,15 @@ int proc_setup_self(struct super_block *s)
|
|||
inode->i_uid = GLOBAL_ROOT_UID;
|
||||
inode->i_gid = GLOBAL_ROOT_GID;
|
||||
inode->i_op = &proc_self_inode_operations;
|
||||
d_add(self, inode);
|
||||
d_make_persistent(self, inode);
|
||||
ret = 0;
|
||||
} else {
|
||||
dput(self);
|
||||
}
|
||||
dput(self);
|
||||
}
|
||||
inode_unlock(root_inode);
|
||||
|
||||
if (ret)
|
||||
pr_err("proc_fill_super: can't allocate /proc/self\n");
|
||||
else
|
||||
fs_info->proc_self = self;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,12 +31,11 @@ static const struct inode_operations proc_thread_self_inode_operations = {
|
|||
.get_link = proc_thread_self_get_link,
|
||||
};
|
||||
|
||||
static unsigned thread_self_inum __ro_after_init;
|
||||
unsigned thread_self_inum __ro_after_init;
|
||||
|
||||
int proc_setup_thread_self(struct super_block *s)
|
||||
{
|
||||
struct inode *root_inode = d_inode(s->s_root);
|
||||
struct proc_fs_info *fs_info = proc_sb_info(s);
|
||||
struct dentry *thread_self;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
|
|
@ -51,19 +50,15 @@ int proc_setup_thread_self(struct super_block *s)
|
|||
inode->i_uid = GLOBAL_ROOT_UID;
|
||||
inode->i_gid = GLOBAL_ROOT_GID;
|
||||
inode->i_op = &proc_thread_self_inode_operations;
|
||||
d_add(thread_self, inode);
|
||||
d_make_persistent(thread_self, inode);
|
||||
ret = 0;
|
||||
} else {
|
||||
dput(thread_self);
|
||||
}
|
||||
dput(thread_self);
|
||||
}
|
||||
inode_unlock(root_inode);
|
||||
|
||||
if (ret)
|
||||
pr_err("proc_fill_super: can't allocate /proc/thread-self\n");
|
||||
else
|
||||
fs_info->proc_thread_self = thread_self;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -66,8 +66,6 @@ enum proc_pidonly {
|
|||
|
||||
struct proc_fs_info {
|
||||
struct pid_namespace *pid_ns;
|
||||
struct dentry *proc_self; /* For /proc/self */
|
||||
struct dentry *proc_thread_self; /* For /proc/thread-self */
|
||||
kgid_t pid_gid;
|
||||
enum proc_hidepid hide_pid;
|
||||
enum proc_pidonly pidonly;
|
||||
|
|
|
|||
Loading…
Reference in New Issue