Merge tag 'tag-chrome-platform-for-v5.12' of git://git.kernel.org/pub/scm/linux/kerne...
[linux-2.6-microblaze.git] / fs / fcntl.c
index 19ac5ba..483ef88 100644 (file)
@@ -148,11 +148,15 @@ void f_delown(struct file *filp)
 
 pid_t f_getown(struct file *filp)
 {
-       pid_t pid;
+       pid_t pid = 0;
        read_lock(&filp->f_owner.lock);
-       pid = pid_vnr(filp->f_owner.pid);
-       if (filp->f_owner.pid_type == PIDTYPE_PGID)
-               pid = -pid;
+       rcu_read_lock();
+       if (pid_task(filp->f_owner.pid, filp->f_owner.pid_type)) {
+               pid = pid_vnr(filp->f_owner.pid);
+               if (filp->f_owner.pid_type == PIDTYPE_PGID)
+                       pid = -pid;
+       }
+       rcu_read_unlock();
        read_unlock(&filp->f_owner.lock);
        return pid;
 }
@@ -200,11 +204,14 @@ static int f_setown_ex(struct file *filp, unsigned long arg)
 static int f_getown_ex(struct file *filp, unsigned long arg)
 {
        struct f_owner_ex __user *owner_p = (void __user *)arg;
-       struct f_owner_ex owner;
+       struct f_owner_ex owner = {};
        int ret = 0;
 
        read_lock(&filp->f_owner.lock);
-       owner.pid = pid_vnr(filp->f_owner.pid);
+       rcu_read_lock();
+       if (pid_task(filp->f_owner.pid, filp->f_owner.pid_type))
+               owner.pid = pid_vnr(filp->f_owner.pid);
+       rcu_read_unlock();
        switch (filp->f_owner.pid_type) {
        case PIDTYPE_PID:
                owner.type = F_OWNER_TID;
@@ -781,9 +788,10 @@ void send_sigio(struct fown_struct *fown, int fd, int band)
 {
        struct task_struct *p;
        enum pid_type type;
+       unsigned long flags;
        struct pid *pid;
        
-       read_lock(&fown->lock);
+       read_lock_irqsave(&fown->lock, flags);
 
        type = fown->pid_type;
        pid = fown->pid;
@@ -804,7 +812,7 @@ void send_sigio(struct fown_struct *fown, int fd, int band)
                read_unlock(&tasklist_lock);
        }
  out_unlock_fown:
-       read_unlock(&fown->lock);
+       read_unlock_irqrestore(&fown->lock, flags);
 }
 
 static void send_sigurg_to_task(struct task_struct *p,
@@ -819,9 +827,10 @@ int send_sigurg(struct fown_struct *fown)
        struct task_struct *p;
        enum pid_type type;
        struct pid *pid;
+       unsigned long flags;
        int ret = 0;
        
-       read_lock(&fown->lock);
+       read_lock_irqsave(&fown->lock, flags);
 
        type = fown->pid_type;
        pid = fown->pid;
@@ -844,7 +853,7 @@ int send_sigurg(struct fown_struct *fown)
                read_unlock(&tasklist_lock);
        }
  out_unlock_fown:
-       read_unlock(&fown->lock);
+       read_unlock_irqrestore(&fown->lock, flags);
        return ret;
 }