]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/proc/generic.c
Merge remote-tracking branch 'dwmw2/master'
[karo-tx-linux.git] / fs / proc / generic.c
index 76ddae83daa58e2b086dd286c847c47de71f1124..4b3b3ffb52f14e234aa3ec99abde281ca41e1817 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/mm.h>
 #include <linux/module.h>
 #include <linux/slab.h>
+#include <linux/printk.h>
 #include <linux/mount.h>
 #include <linux/init.h>
 #include <linux/idr.h>
@@ -42,7 +43,7 @@ static ssize_t
 __proc_file_read(struct file *file, char __user *buf, size_t nbytes,
               loff_t *ppos)
 {
-       struct inode * inode = file->f_path.dentry->d_inode;
+       struct inode * inode = file_inode(file);
        char    *page;
        ssize_t retval=0;
        int     eof=0;
@@ -132,11 +133,8 @@ __proc_file_read(struct file *file, char __user *buf, size_t nbytes,
                }
 
                if (start == NULL) {
-                       if (n > PAGE_SIZE) {
-                               printk(KERN_ERR
-                                      "proc_file_read: Apparent buffer overflow!\n");
+                       if (n > PAGE_SIZE)      /* Apparent buffer overflow */
                                n = PAGE_SIZE;
-                       }
                        n -= *ppos;
                        if (n <= 0)
                                break;
@@ -144,26 +142,19 @@ __proc_file_read(struct file *file, char __user *buf, size_t nbytes,
                                n = count;
                        start = page + *ppos;
                } else if (start < page) {
-                       if (n > PAGE_SIZE) {
-                               printk(KERN_ERR
-                                      "proc_file_read: Apparent buffer overflow!\n");
+                       if (n > PAGE_SIZE)      /* Apparent buffer overflow */
                                n = PAGE_SIZE;
-                       }
                        if (n > count) {
                                /*
                                 * Don't reduce n because doing so might
                                 * cut off part of a data block.
                                 */
-                               printk(KERN_WARNING
-                                      "proc_file_read: Read count exceeded\n");
+                               pr_warn("proc_file_read: count exceeded\n");
                        }
                } else /* start >= page */ {
                        unsigned long startoff = (unsigned long)(start - page);
-                       if (n > (PAGE_SIZE - startoff)) {
-                               printk(KERN_ERR
-                                      "proc_file_read: Apparent buffer overflow!\n");
+                       if (n > (PAGE_SIZE - startoff)) /* buffer overflow? */
                                n = PAGE_SIZE - startoff;
-                       }
                        if (n > count)
                                n = count;
                }
@@ -188,7 +179,7 @@ static ssize_t
 proc_file_read(struct file *file, char __user *buf, size_t nbytes,
               loff_t *ppos)
 {
-       struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode);
+       struct proc_dir_entry *pde = PDE(file_inode(file));
        ssize_t rv = -EIO;
 
        spin_lock(&pde->pde_unload_lock);
@@ -209,7 +200,7 @@ static ssize_t
 proc_file_write(struct file *file, const char __user *buffer,
                size_t count, loff_t *ppos)
 {
-       struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode);
+       struct proc_dir_entry *pde = PDE(file_inode(file));
        ssize_t rv = -EIO;
 
        if (pde->write_proc) {
@@ -412,8 +403,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 +412,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;
+                       if (!inode)
+                               return ERR_PTR(-ENOMEM);
+                       d_set_d_op(dentry, &proc_dentry_operations);
+                       d_add(dentry, inode);
+                       return NULL;
                }
        }
        spin_unlock(&proc_subdir_lock);
-out_unlock:
-
-       if (inode) {
-               d_set_d_op(dentry, &proc_dentry_operations);
-               d_add(dentry, inode);
-               return NULL;
-       }
-       if (de)
-               pde_put(de);
-       return ERR_PTR(error);
+       return ERR_PTR(-ENOENT);
 }
 
 struct dentry *proc_lookup(struct inode *dir, struct dentry *dentry,
@@ -460,7 +444,7 @@ int proc_readdir_de(struct proc_dir_entry *de, struct file *filp, void *dirent,
 {
        unsigned int ino;
        int i;
-       struct inode *inode = filp->f_path.dentry->d_inode;
+       struct inode *inode = file_inode(filp);
        int ret = 0;
 
        ino = inode->i_ino;
@@ -522,7 +506,7 @@ out:
 
 int proc_readdir(struct file *filp, void *dirent, filldir_t filldir)
 {
-       struct inode *inode = filp->f_path.dentry->d_inode;
+       struct inode *inode = file_inode(filp);
 
        return proc_readdir_de(PDE(inode), filp, dirent, filldir);
 }
@@ -576,7 +560,7 @@ static int proc_register(struct proc_dir_entry * dir, struct proc_dir_entry * dp
 
        for (tmp = dir->subdir; tmp; tmp = tmp->next)
                if (strcmp(tmp->name, dp->name) == 0) {
-                       WARN(1, KERN_WARNING "proc_dir_entry '%s/%s' already registered\n",
+                       WARN(1, "proc_dir_entry '%s/%s' already registered\n",
                                dir->name, dp->name);
                        break;
                }
@@ -837,9 +821,9 @@ void remove_proc_entry(const char *name, struct proc_dir_entry *parent)
        if (S_ISDIR(de->mode))
                parent->nlink--;
        de->nlink = 0;
-       WARN(de->subdir, KERN_WARNING "%s: removing non-empty directory "
-                       "'%s/%s', leaking at least '%s'\n", __func__,
-                       de->parent->name, de->name, de->subdir->name);
+       WARN(de->subdir, "%s: removing non-empty directory "
+                        "'%s/%s', leaking at least '%s'\n", __func__,
+                        de->parent->name, de->name, de->subdir->name);
        pde_put(de);
 }
 EXPORT_SYMBOL(remove_proc_entry);