Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d1b6e4e authored by Alexey Dobriyan's avatar Alexey Dobriyan Committed by Linus Torvalds
Browse files

proc: ->low_ino cleanup



- ->low_ino is write-once field -- reading it under locks is unnecessary.

- /proc/$PID stuff never reaches pde_put()/free_proc_entry() --
   PROC_DYNAMIC_FIRST check never triggers.

- in proc_get_inode(), inode number always matches proc dir entry, so
  save one parameter.

Signed-off-by: default avatarAlexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 9d6de12f
Loading
Loading
Loading
Loading
+2 −10
Original line number Diff line number Diff line
@@ -425,13 +425,10 @@ struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *dir,
		if (de->namelen != dentry->d_name.len)
			continue;
		if (!memcmp(dentry->d_name.name, de->name, de->namelen)) {
			unsigned int ino;

			ino = de->low_ino;
			pde_get(de);
			spin_unlock(&proc_subdir_lock);
			error = -EINVAL;
			inode = proc_get_inode(dir->i_sb, ino, de);
			inode = proc_get_inode(dir->i_sb, de);
			goto out_unlock;
		}
	}
@@ -768,12 +765,7 @@ EXPORT_SYMBOL(proc_create_data);

static void free_proc_entry(struct proc_dir_entry *de)
{
	unsigned int ino = de->low_ino;

	if (ino < PROC_DYNAMIC_FIRST)
		return;

	release_inode_number(ino);
	release_inode_number(de->low_ino);

	if (S_ISLNK(de->mode))
		kfree(de->data);
+3 −4
Original line number Diff line number Diff line
@@ -416,12 +416,11 @@ static const struct file_operations proc_reg_file_ops_no_compat = {
};
#endif

struct inode *proc_get_inode(struct super_block *sb, unsigned int ino,
				struct proc_dir_entry *de)
struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de)
{
	struct inode * inode;

	inode = iget_locked(sb, ino);
	inode = iget_locked(sb, de->low_ino);
	if (!inode)
		return NULL;
	if (inode->i_state & I_NEW) {
@@ -471,7 +470,7 @@ int proc_fill_super(struct super_block *s)
	s->s_time_gran = 1;
	
	pde_get(&proc_root);
	root_inode = proc_get_inode(s, PROC_ROOT_INO, &proc_root);
	root_inode = proc_get_inode(s, &proc_root);
	if (!root_inode)
		goto out_no_root;
	root_inode->i_uid = 0;
+1 −1
Original line number Diff line number Diff line
@@ -109,7 +109,7 @@ void pde_put(struct proc_dir_entry *pde);

extern struct vfsmount *proc_mnt;
int proc_fill_super(struct super_block *);
struct inode *proc_get_inode(struct super_block *, unsigned int, struct proc_dir_entry *);
struct inode *proc_get_inode(struct super_block *, struct proc_dir_entry *);

/*
 * These are generic /proc routines that use the internal