|
@@ -116,7 +116,7 @@ int f_setown(struct file *filp, unsigned long arg, int force)
|
|
|
struct pid *pid = NULL;
|
|
|
int who = arg, ret = 0;
|
|
|
|
|
|
- type = PIDTYPE_PID;
|
|
|
+ type = PIDTYPE_TGID;
|
|
|
if (who < 0) {
|
|
|
/* avoid overflow below */
|
|
|
if (who == INT_MIN)
|
|
@@ -143,7 +143,7 @@ EXPORT_SYMBOL(f_setown);
|
|
|
|
|
|
void f_delown(struct file *filp)
|
|
|
{
|
|
|
- f_modown(filp, NULL, PIDTYPE_PID, 1);
|
|
|
+ f_modown(filp, NULL, PIDTYPE_TGID, 1);
|
|
|
}
|
|
|
|
|
|
pid_t f_getown(struct file *filp)
|
|
@@ -171,11 +171,11 @@ static int f_setown_ex(struct file *filp, unsigned long arg)
|
|
|
|
|
|
switch (owner.type) {
|
|
|
case F_OWNER_TID:
|
|
|
- type = PIDTYPE_MAX;
|
|
|
+ type = PIDTYPE_PID;
|
|
|
break;
|
|
|
|
|
|
case F_OWNER_PID:
|
|
|
- type = PIDTYPE_PID;
|
|
|
+ type = PIDTYPE_TGID;
|
|
|
break;
|
|
|
|
|
|
case F_OWNER_PGRP:
|
|
@@ -206,11 +206,11 @@ static int f_getown_ex(struct file *filp, unsigned long arg)
|
|
|
read_lock(&filp->f_owner.lock);
|
|
|
owner.pid = pid_vnr(filp->f_owner.pid);
|
|
|
switch (filp->f_owner.pid_type) {
|
|
|
- case PIDTYPE_MAX:
|
|
|
+ case PIDTYPE_PID:
|
|
|
owner.type = F_OWNER_TID;
|
|
|
break;
|
|
|
|
|
|
- case PIDTYPE_PID:
|
|
|
+ case PIDTYPE_TGID:
|
|
|
owner.type = F_OWNER_PID;
|
|
|
break;
|
|
|
|
|
@@ -785,20 +785,25 @@ void send_sigio(struct fown_struct *fown, int fd, int band)
|
|
|
read_lock(&fown->lock);
|
|
|
|
|
|
type = fown->pid_type;
|
|
|
- if (type == PIDTYPE_MAX) {
|
|
|
+ if (type == PIDTYPE_PID)
|
|
|
group = 0;
|
|
|
- type = PIDTYPE_PID;
|
|
|
- }
|
|
|
|
|
|
pid = fown->pid;
|
|
|
if (!pid)
|
|
|
goto out_unlock_fown;
|
|
|
-
|
|
|
- read_lock(&tasklist_lock);
|
|
|
- do_each_pid_task(pid, type, p) {
|
|
|
+
|
|
|
+ if (type <= PIDTYPE_TGID) {
|
|
|
+ rcu_read_lock();
|
|
|
+ p = pid_task(pid, PIDTYPE_PID);
|
|
|
send_sigio_to_task(p, fown, fd, band, group);
|
|
|
- } while_each_pid_task(pid, type, p);
|
|
|
- read_unlock(&tasklist_lock);
|
|
|
+ rcu_read_unlock();
|
|
|
+ } else {
|
|
|
+ read_lock(&tasklist_lock);
|
|
|
+ do_each_pid_task(pid, type, p) {
|
|
|
+ send_sigio_to_task(p, fown, fd, band, group);
|
|
|
+ } while_each_pid_task(pid, type, p);
|
|
|
+ read_unlock(&tasklist_lock);
|
|
|
+ }
|
|
|
out_unlock_fown:
|
|
|
read_unlock(&fown->lock);
|
|
|
}
|
|
@@ -821,22 +826,27 @@ int send_sigurg(struct fown_struct *fown)
|
|
|
read_lock(&fown->lock);
|
|
|
|
|
|
type = fown->pid_type;
|
|
|
- if (type == PIDTYPE_MAX) {
|
|
|
+ if (type == PIDTYPE_PID)
|
|
|
group = 0;
|
|
|
- type = PIDTYPE_PID;
|
|
|
- }
|
|
|
|
|
|
pid = fown->pid;
|
|
|
if (!pid)
|
|
|
goto out_unlock_fown;
|
|
|
|
|
|
ret = 1;
|
|
|
-
|
|
|
- read_lock(&tasklist_lock);
|
|
|
- do_each_pid_task(pid, type, p) {
|
|
|
+
|
|
|
+ if (type <= PIDTYPE_TGID) {
|
|
|
+ rcu_read_lock();
|
|
|
+ p = pid_task(pid, PIDTYPE_PID);
|
|
|
send_sigurg_to_task(p, fown, group);
|
|
|
- } while_each_pid_task(pid, type, p);
|
|
|
- read_unlock(&tasklist_lock);
|
|
|
+ rcu_read_unlock();
|
|
|
+ } else {
|
|
|
+ read_lock(&tasklist_lock);
|
|
|
+ do_each_pid_task(pid, type, p) {
|
|
|
+ send_sigurg_to_task(p, fown, group);
|
|
|
+ } while_each_pid_task(pid, type, p);
|
|
|
+ read_unlock(&tasklist_lock);
|
|
|
+ }
|
|
|
out_unlock_fown:
|
|
|
read_unlock(&fown->lock);
|
|
|
return ret;
|