Commit 5e971dce authored by Alexey Dobriyan's avatar Alexey Dobriyan Committed by Linus Torvalds

proc: drop several "PDE valid/invalid" checks

proc-misc code is noticeably full of "if (de)" checks when PDE passed is
always valid.  Remove them.

Addition of such check in proc_lookup_de() is for failed lookup case.
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 7cee4e00
...@@ -388,20 +388,18 @@ struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *dir, ...@@ -388,20 +388,18 @@ struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *dir,
lock_kernel(); lock_kernel();
spin_lock(&proc_subdir_lock); spin_lock(&proc_subdir_lock);
if (de) { for (de = de->subdir; de ; de = de->next) {
for (de = de->subdir; de ; de = de->next) { if (de->namelen != dentry->d_name.len)
if (de->namelen != dentry->d_name.len) continue;
continue; if (!memcmp(dentry->d_name.name, de->name, de->namelen)) {
if (!memcmp(dentry->d_name.name, de->name, de->namelen)) { unsigned int ino;
unsigned int ino;
ino = de->low_ino;
ino = de->low_ino; de_get(de);
de_get(de); spin_unlock(&proc_subdir_lock);
spin_unlock(&proc_subdir_lock); error = -EINVAL;
error = -EINVAL; inode = proc_get_inode(dir->i_sb, ino, de);
inode = proc_get_inode(dir->i_sb, ino, de); goto out_unlock;
goto out_unlock;
}
} }
} }
spin_unlock(&proc_subdir_lock); spin_unlock(&proc_subdir_lock);
...@@ -413,7 +411,8 @@ out_unlock: ...@@ -413,7 +411,8 @@ out_unlock:
d_add(dentry, inode); d_add(dentry, inode);
return NULL; return NULL;
} }
de_put(de); if (de)
de_put(de);
return ERR_PTR(error); return ERR_PTR(error);
} }
...@@ -443,10 +442,6 @@ int proc_readdir_de(struct proc_dir_entry *de, struct file *filp, void *dirent, ...@@ -443,10 +442,6 @@ int proc_readdir_de(struct proc_dir_entry *de, struct file *filp, void *dirent,
lock_kernel(); lock_kernel();
ino = inode->i_ino; ino = inode->i_ino;
if (!de) {
ret = -EINVAL;
goto out;
}
i = filp->f_pos; i = filp->f_pos;
switch (i) { switch (i) {
case 0: case 0:
......
...@@ -25,8 +25,7 @@ ...@@ -25,8 +25,7 @@
struct proc_dir_entry *de_get(struct proc_dir_entry *de) struct proc_dir_entry *de_get(struct proc_dir_entry *de)
{ {
if (de) atomic_inc(&de->count);
atomic_inc(&de->count);
return de; return de;
} }
...@@ -35,18 +34,16 @@ struct proc_dir_entry *de_get(struct proc_dir_entry *de) ...@@ -35,18 +34,16 @@ struct proc_dir_entry *de_get(struct proc_dir_entry *de)
*/ */
void de_put(struct proc_dir_entry *de) void de_put(struct proc_dir_entry *de)
{ {
if (de) { lock_kernel();
lock_kernel(); if (!atomic_read(&de->count)) {
if (!atomic_read(&de->count)) { printk("de_put: entry %s already free!\n", de->name);
printk("de_put: entry %s already free!\n", de->name);
unlock_kernel();
return;
}
if (atomic_dec_and_test(&de->count))
free_proc_entry(de);
unlock_kernel(); unlock_kernel();
return;
} }
if (atomic_dec_and_test(&de->count))
free_proc_entry(de);
unlock_kernel();
} }
/* /*
...@@ -392,7 +389,7 @@ struct inode *proc_get_inode(struct super_block *sb, unsigned int ino, ...@@ -392,7 +389,7 @@ struct inode *proc_get_inode(struct super_block *sb, unsigned int ino,
{ {
struct inode * inode; struct inode * inode;
if (de != NULL && !try_module_get(de->owner)) if (!try_module_get(de->owner))
goto out_mod; goto out_mod;
inode = iget_locked(sb, ino); inode = iget_locked(sb, ino);
...@@ -402,30 +399,29 @@ struct inode *proc_get_inode(struct super_block *sb, unsigned int ino, ...@@ -402,30 +399,29 @@ struct inode *proc_get_inode(struct super_block *sb, unsigned int ino,
inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
PROC_I(inode)->fd = 0; PROC_I(inode)->fd = 0;
PROC_I(inode)->pde = de; PROC_I(inode)->pde = de;
if (de) {
if (de->mode) { if (de->mode) {
inode->i_mode = de->mode; inode->i_mode = de->mode;
inode->i_uid = de->uid; inode->i_uid = de->uid;
inode->i_gid = de->gid; inode->i_gid = de->gid;
} }
if (de->size) if (de->size)
inode->i_size = de->size; inode->i_size = de->size;
if (de->nlink) if (de->nlink)
inode->i_nlink = de->nlink; inode->i_nlink = de->nlink;
if (de->proc_iops) if (de->proc_iops)
inode->i_op = de->proc_iops; inode->i_op = de->proc_iops;
if (de->proc_fops) { if (de->proc_fops) {
if (S_ISREG(inode->i_mode)) { if (S_ISREG(inode->i_mode)) {
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
if (!de->proc_fops->compat_ioctl) if (!de->proc_fops->compat_ioctl)
inode->i_fop = inode->i_fop =
&proc_reg_file_ops_no_compat; &proc_reg_file_ops_no_compat;
else else
#endif #endif
inode->i_fop = &proc_reg_file_ops; inode->i_fop = &proc_reg_file_ops;
} else { } else {
inode->i_fop = de->proc_fops; inode->i_fop = de->proc_fops;
}
} }
} }
unlock_new_inode(inode); unlock_new_inode(inode);
...@@ -433,8 +429,7 @@ struct inode *proc_get_inode(struct super_block *sb, unsigned int ino, ...@@ -433,8 +429,7 @@ struct inode *proc_get_inode(struct super_block *sb, unsigned int ino,
return inode; return inode;
out_ino: out_ino:
if (de != NULL) module_put(de->owner);
module_put(de->owner);
out_mod: out_mod:
return NULL; return NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment