Merge branch 'akpm' (Andrew's patch-bomb)
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 18 May 2012 22:56:25 +0000 (15:56 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 18 May 2012 22:56:25 +0000 (15:56 -0700)
Merge misc fixes from Andrew Morton.

* emailed from Andrew Morton <akpm@linux-foundation.org>: (4 patches)
  frv: delete incorrect task prototypes causing compile fail
  slub: missing test for partial pages flush work in flush_all()
  fs, proc: fix ABBA deadlock in case of execution attempt of map_files/ entries
  drivers/rtc/rtc-pl031.c: configure correct wday for 2000-01-01

1  2 
fs/proc/base.c

diff --combined fs/proc/base.c
@@@ -1799,15 -1799,10 +1799,15 @@@ static int tid_fd_revalidate(struct den
        if (task) {
                files = get_files_struct(task);
                if (files) {
 +                      struct file *file;
                        rcu_read_lock();
 -                      if (fcheck_files(files, fd)) {
 +                      file = fcheck_files(files, fd);
 +                      if (file) {
 +                              unsigned i_mode, f_mode = file->f_mode;
 +
                                rcu_read_unlock();
                                put_files_struct(files);
 +
                                if (task_dumpable(task)) {
                                        rcu_read_lock();
                                        cred = __task_cred(task);
                                        inode->i_uid = 0;
                                        inode->i_gid = 0;
                                }
 -                              inode->i_mode &= ~(S_ISUID | S_ISGID);
 +
 +                              i_mode = S_IFLNK;
 +                              if (f_mode & FMODE_READ)
 +                                      i_mode |= S_IRUSR | S_IXUSR;
 +                              if (f_mode & FMODE_WRITE)
 +                                      i_mode |= S_IWUSR | S_IXUSR;
 +                              inode->i_mode = i_mode;
 +
                                security_task_to_inode(task, inode);
                                put_task_struct(task);
                                return 1;
@@@ -1849,6 -1837,8 +1849,6 @@@ static struct dentry *proc_fd_instantia
        struct dentry *dentry, struct task_struct *task, const void *ptr)
  {
        unsigned fd = *(const unsigned *)ptr;
 -      struct file *file;
 -      struct files_struct *files;
        struct inode *inode;
        struct proc_inode *ei;
        struct dentry *error = ERR_PTR(-ENOENT);
                goto out;
        ei = PROC_I(inode);
        ei->fd = fd;
 -      files = get_files_struct(task);
 -      if (!files)
 -              goto out_iput;
 -      inode->i_mode = S_IFLNK;
 -
 -      /*
 -       * We are not taking a ref to the file structure, so we must
 -       * hold ->file_lock.
 -       */
 -      spin_lock(&files->file_lock);
 -      file = fcheck_files(files, fd);
 -      if (!file)
 -              goto out_unlock;
 -      if (file->f_mode & FMODE_READ)
 -              inode->i_mode |= S_IRUSR | S_IXUSR;
 -      if (file->f_mode & FMODE_WRITE)
 -              inode->i_mode |= S_IWUSR | S_IXUSR;
 -      spin_unlock(&files->file_lock);
 -      put_files_struct(files);
  
        inode->i_op = &proc_pid_link_inode_operations;
        inode->i_size = 64;
  
   out:
        return error;
 -out_unlock:
 -      spin_unlock(&files->file_lock);
 -      put_files_struct(files);
 -out_iput:
 -      iput(inode);
 -      goto out;
  }
  
  static struct dentry *proc_lookupfd_common(struct inode *dir,
@@@ -2162,16 -2177,16 +2162,16 @@@ static struct dentry *proc_map_files_lo
                goto out;
  
        result = ERR_PTR(-EACCES);
-       if (lock_trace(task))
+       if (!ptrace_may_access(task, PTRACE_MODE_READ))
                goto out_put_task;
  
        result = ERR_PTR(-ENOENT);
        if (dname_to_vma_addr(dentry, &vm_start, &vm_end))
-               goto out_unlock;
+               goto out_put_task;
  
        mm = get_task_mm(task);
        if (!mm)
-               goto out_unlock;
+               goto out_put_task;
  
        down_read(&mm->mmap_sem);
        vma = find_exact_vma(mm, vm_start, vm_end);
  out_no_vma:
        up_read(&mm->mmap_sem);
        mmput(mm);
- out_unlock:
-       unlock_trace(task);
  out_put_task:
        put_task_struct(task);
  out:
@@@ -2218,7 -2231,7 +2216,7 @@@ proc_map_files_readdir(struct file *fil
                goto out;
  
        ret = -EACCES;
-       if (lock_trace(task))
+       if (!ptrace_may_access(task, PTRACE_MODE_READ))
                goto out_put_task;
  
        ret = 0;
        case 0:
                ino = inode->i_ino;
                if (filldir(dirent, ".", 1, 0, ino, DT_DIR) < 0)
-                       goto out_unlock;
+                       goto out_put_task;
                filp->f_pos++;
        case 1:
                ino = parent_ino(dentry);
                if (filldir(dirent, "..", 2, 1, ino, DT_DIR) < 0)
-                       goto out_unlock;
+                       goto out_put_task;
                filp->f_pos++;
        default:
        {
  
                mm = get_task_mm(task);
                if (!mm)
-                       goto out_unlock;
+                       goto out_put_task;
                down_read(&mm->mmap_sem);
  
                nr_files = 0;
                                        flex_array_free(fa);
                                up_read(&mm->mmap_sem);
                                mmput(mm);
-                               goto out_unlock;
+                               goto out_put_task;
                        }
                        for (i = 0, vma = mm->mmap, pos = 2; vma;
                                        vma = vma->vm_next) {
        }
        }
  
- out_unlock:
-       unlock_trace(task);
  out_put_task:
        put_task_struct(task);
  out: