From c69f289480b185efa8c23bca2154473c21407bf0 Mon Sep 17 00:00:00 2001 From: Jamie Lokier Date: Wed, 8 Oct 2003 04:59:16 -0700 Subject: [PATCH] [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. --- fs/dnotify.c | 2 +- fs/locks.c | 2 +- kernel/futex.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/dnotify.c b/fs/dnotify.c index 4a385a71a48..f5eb816a814 100644 --- a/fs/dnotify.c +++ b/fs/dnotify.c @@ -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; diff --git a/fs/locks.c b/fs/locks.c index 70176dc909b..6ba8af8a7f3 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -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; diff --git a/kernel/futex.c b/kernel/futex.c index db0a81a810d..7b1e11a0825 100644 --- a/kernel/futex.c +++ b/kernel/futex.c @@ -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); -- 2.11.4.GIT