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

Commit d3d009cb authored by Al Viro's avatar Al Viro
Browse files

saner proc_get_inode() calling conventions



Make it drop the pde in *all* cases when no new reference to it is
put into an inode - both when an inode had already been set up
(as we were already doing) and when inode allocation has failed.
Makes for simpler logics in callers...

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 87e0aab3
Loading
Loading
Loading
Loading
+7 −14
Original line number Diff line number Diff line
@@ -412,8 +412,7 @@ static const struct dentry_operations proc_dentry_operations =
struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *dir,
		struct dentry *dentry)
{
	struct inode *inode = NULL;
	int error = -ENOENT;
	struct inode *inode;

	spin_lock(&proc_subdir_lock);
	for (de = de->subdir; de ; de = de->next) {
@@ -422,22 +421,16 @@ struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *dir,
		if (!memcmp(dentry->d_name.name, de->name, de->namelen)) {
			pde_get(de);
			spin_unlock(&proc_subdir_lock);
			error = -ENOMEM;
			inode = proc_get_inode(dir->i_sb, de);
			goto out_unlock;
		}
	}
	spin_unlock(&proc_subdir_lock);
out_unlock:

	if (inode) {
			if (!inode)
				return ERR_PTR(-ENOMEM);
			d_set_d_op(dentry, &proc_dentry_operations);
			d_add(dentry, inode);
			return NULL;
		}
	if (de)
		pde_put(de);
	return ERR_PTR(error);
	}
	spin_unlock(&proc_subdir_lock);
	return ERR_PTR(-ENOENT);
}

struct dentry *proc_lookup(struct inode *dir, struct dentry *dentry,
+3 −7
Original line number Diff line number Diff line
@@ -445,12 +445,9 @@ static const struct file_operations proc_reg_file_ops_no_compat = {

struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de)
{
	struct inode * inode;
	struct inode *inode = iget_locked(sb, de->low_ino);

	inode = iget_locked(sb, de->low_ino);
	if (!inode)
		return NULL;
	if (inode->i_state & I_NEW) {
	if (inode && (inode->i_state & I_NEW)) {
		inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
		PROC_I(inode)->pde = de;

@@ -499,7 +496,6 @@ int proc_fill_super(struct super_block *s)
	root_inode = proc_get_inode(s, &proc_root);
	if (!root_inode) {
		printk(KERN_ERR "proc_fill_super: get root inode failed\n");
		pde_put(&proc_root);
		return -ENOMEM;
	}