Commit c69f2894 authored by Jamie Lokier's avatar Jamie Lokier Committed by Linus Torvalds

[PATCH] set sigio target to current->pid and only if not already set

1. send_sigio() sends to a specific thread, _not_ a process.
   (It can also send to a process group, but that's not relevant here).
   This is useful, and should stay as it is.

   Therefore it makes _no sense_ to call f_setown() with current->tgid.
   Presently the kernel is inconsistent about it, with some places using
   current->pid and some others using current->tgid.

   This patch changes f_setown() calls to use current->pid.

2. In some places, f_setown() is called not at the user's direct request,
   but as a side effect of another function.  Specifically: dnotify and
   file leases.

   It is good to allow a program the flexibility to specify a different
   pid than the default, using F_SETOWN.  Presently they can do this after
   the dnotify or lease call, but there is a small time window when it
   will be temporarily set to current->tgid (which as pointed out above,
   is not always right).

   The window is avoidable if the program can use F_SETOWN prior to the
   dnotify or lease call.  This is exactly what the "force" argument to
   f_setown() is for, and this patch changes it to zero in those callers.

   This change is not likely to affect any existing programs.
parent d9e033b3
......@@ -93,7 +93,7 @@ int fcntl_dirnotify(int fd, struct file *filp, unsigned long arg)
prev = &odn->dn_next;
}
error = f_setown(filp, current->tgid, 1);
error = f_setown(filp, current->pid, 0);
if (error)
goto out_free;
......
......@@ -1288,7 +1288,7 @@ int fcntl_setlease(unsigned int fd, struct file *filp, long arg)
locks_insert_lock(before, fl);
error = f_setown(filp, current->tgid, 1);
error = f_setown(filp, current->pid, 0);
out_unlock:
unlock_kernel();
return error;
......
......@@ -500,7 +500,7 @@ static int futex_fd(unsigned long uaddr, int signal)
if (signal) {
int err;
err = f_setown(filp, current->tgid, 1);
err = f_setown(filp, current->pid, 1);
if (err < 0) {
put_unused_fd(ret);
put_filp(filp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment