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 05b36b2..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;