]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/android/binder.c
Merge tag 'armsoc-drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
[linux.git] / drivers / android / binder.c
index b2dad43dbf82962b76c47c0a87d44bd15541e1de..a6b2082c24f8f1031d906469793270db1eb833c7 100644 (file)
@@ -2249,10 +2249,12 @@ static void binder_deferred_fd_close(int fd)
                return;
        init_task_work(&twcb->twork, binder_do_fd_close);
        __close_fd_get_file(fd, &twcb->file);
-       if (twcb->file)
+       if (twcb->file) {
+               filp_close(twcb->file, current->files);
                task_work_add(current, &twcb->twork, true);
-       else
+       } else {
                kfree(twcb);
+       }
 }
 
 static void binder_transaction_buffer_release(struct binder_proc *proc,
@@ -5199,10 +5201,11 @@ static int binder_mmap(struct file *filp, struct vm_area_struct *vma)
 
 static int binder_open(struct inode *nodp, struct file *filp)
 {
-       struct binder_proc *proc;
+       struct binder_proc *proc, *itr;
        struct binder_device *binder_dev;
        struct binderfs_info *info;
        struct dentry *binder_binderfs_dir_entry_proc = NULL;
+       bool existing_pid = false;
 
        binder_debug(BINDER_DEBUG_OPEN_CLOSE, "%s: %d:%d\n", __func__,
                     current->group_leader->pid, current->pid);
@@ -5235,19 +5238,24 @@ static int binder_open(struct inode *nodp, struct file *filp)
        filp->private_data = proc;
 
        mutex_lock(&binder_procs_lock);
+       hlist_for_each_entry(itr, &binder_procs, proc_node) {
+               if (itr->pid == proc->pid) {
+                       existing_pid = true;
+                       break;
+               }
+       }
        hlist_add_head(&proc->proc_node, &binder_procs);
        mutex_unlock(&binder_procs_lock);
 
-       if (binder_debugfs_dir_entry_proc) {
+       if (binder_debugfs_dir_entry_proc && !existing_pid) {
                char strbuf[11];
 
                snprintf(strbuf, sizeof(strbuf), "%u", proc->pid);
                /*
-                * proc debug entries are shared between contexts, so
-                * this will fail if the process tries to open the driver
-                * again with a different context. The priting code will
-                * anyway print all contexts that a given PID has, so this
-                * is not a problem.
+                * proc debug entries are shared between contexts.
+                * Only create for the first PID to avoid debugfs log spamming
+                * The printing code will anyway print all contexts for a given
+                * PID so this is not a problem.
                 */
                proc->debugfs_entry = debugfs_create_file(strbuf, 0444,
                        binder_debugfs_dir_entry_proc,
@@ -5255,19 +5263,16 @@ static int binder_open(struct inode *nodp, struct file *filp)
                        &proc_fops);
        }
 
-       if (binder_binderfs_dir_entry_proc) {
+       if (binder_binderfs_dir_entry_proc && !existing_pid) {
                char strbuf[11];
                struct dentry *binderfs_entry;
 
                snprintf(strbuf, sizeof(strbuf), "%u", proc->pid);
                /*
                 * Similar to debugfs, the process specific log file is shared
-                * between contexts. If the file has already been created for a
-                * process, the following binderfs_create_file() call will
-                * fail with error code EEXIST if another context of the same
-                * process invoked binder_open(). This is ok since same as
-                * debugfs, the log file will contain information on all
-                * contexts of a given PID.
+                * between contexts. Only create for the first PID.
+                * This is ok since same as debugfs, the log file will contain
+                * information on all contexts of a given PID.
                 */
                binderfs_entry = binderfs_create_file(binder_binderfs_dir_entry_proc,
                        strbuf, &proc_fops, (void *)(unsigned long)proc->pid);
@@ -5277,10 +5282,8 @@ static int binder_open(struct inode *nodp, struct file *filp)
                        int error;
 
                        error = PTR_ERR(binderfs_entry);
-                       if (error != -EEXIST) {
-                               pr_warn("Unable to create file %s in binderfs (error %d)\n",
-                                       strbuf, error);
-                       }
+                       pr_warn("Unable to create file %s in binderfs (error %d)\n",
+                               strbuf, error);
                }
        }