Commit 23cbc7a7 authored by Al Viro's avatar Al Viro
Browse files

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: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 23135982
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -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;
	}
+1 −0
Original line number Diff line number Diff line
@@ -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
+4 −10
Original line number Diff line number Diff line
@@ -347,18 +347,12 @@ 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);
	if (fs_info) {
		put_pid_ns(fs_info->pid_ns);
		kfree_rcu(fs_info, rcu);
	}
}

static struct file_system_type proc_fs_type = {
	.name			= "proc",
+3 −7
Original line number Diff line number Diff line
@@ -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;
}
+3 −8
Original line number Diff line number Diff line
@@ -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;
}

Loading