projects
/
deliverable
/
linux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
pid namespaces: changes to show virtual ids to user
[deliverable/linux.git]
/
kernel
/
futex.c
diff --git
a/kernel/futex.c
b/kernel/futex.c
index d725676d84f3580813161678394bc9220630af82..86b2600381b616db0d157ac9e172a3fc55315be4 100644
(file)
--- a/
kernel/futex.c
+++ b/
kernel/futex.c
@@
-53,6
+53,9
@@
#include <linux/signal.h>
#include <linux/module.h>
#include <linux/magic.h>
#include <linux/signal.h>
#include <linux/module.h>
#include <linux/magic.h>
+#include <linux/pid.h>
+#include <linux/nsproxy.h>
+
#include <asm/futex.h>
#include "rtmutex_common.h"
#include <asm/futex.h>
#include "rtmutex_common.h"
@@
-293,7
+296,7
@@
EXPORT_SYMBOL_GPL(get_futex_key_refs);
*/
void drop_futex_key_refs(union futex_key *key)
{
*/
void drop_futex_key_refs(union futex_key *key)
{
- if (
key->both.ptr == 0
)
+ if (
!key->both.ptr
)
return;
switch (key->both.offset & (FUT_OFF_INODE|FUT_OFF_MMSHARED)) {
case FUT_OFF_INODE:
return;
switch (key->both.offset & (FUT_OFF_INODE|FUT_OFF_MMSHARED)) {
case FUT_OFF_INODE:
@@
-443,7
+446,8
@@
static struct task_struct * futex_find_get_task(pid_t pid)
struct task_struct *p;
rcu_read_lock();
struct task_struct *p;
rcu_read_lock();
- p = find_task_by_pid(pid);
+ p = find_task_by_pid_ns(pid,
+ current->nsproxy->pid_ns);
if (!p || ((current->euid != p->euid) && (current->euid != p->uid)))
p = ERR_PTR(-ESRCH);
if (!p || ((current->euid != p->euid) && (current->euid != p->uid)))
p = ERR_PTR(-ESRCH);
@@
-653,7
+657,7
@@
static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this)
if (!(uval & FUTEX_OWNER_DIED)) {
int ret = 0;
if (!(uval & FUTEX_OWNER_DIED)) {
int ret = 0;
- newval = FUTEX_WAITERS |
new_owner->pid
;
+ newval = FUTEX_WAITERS |
task_pid_vnr(new_owner)
;
curval = cmpxchg_futex_value_locked(uaddr, uval, newval);
curval = cmpxchg_futex_value_locked(uaddr, uval, newval);
@@
-1046,7
+1050,7
@@
static int unqueue_me(struct futex_q *q)
retry:
lock_ptr = q->lock_ptr;
barrier();
retry:
lock_ptr = q->lock_ptr;
barrier();
- if (lock_ptr !=
0
) {
+ if (lock_ptr !=
NULL
) {
spin_lock(lock_ptr);
/*
* q->lock_ptr can change between reading it and
spin_lock(lock_ptr);
/*
* q->lock_ptr can change between reading it and
@@
-1106,7
+1110,7
@@
static void unqueue_me_pi(struct futex_q *q)
static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,
struct task_struct *curr)
{
static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,
struct task_struct *curr)
{
- u32 newtid =
curr->pid
| FUTEX_WAITERS;
+ u32 newtid =
task_pid_vnr(curr)
| FUTEX_WAITERS;
struct futex_pi_state *pi_state = q->pi_state;
u32 uval, curval, newval;
int ret;
struct futex_pi_state *pi_state = q->pi_state;
u32 uval, curval, newval;
int ret;
@@
-1368,7
+1372,7
@@
static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared,
* (by doing a 0 -> TID atomic cmpxchg), while holding all
* the locks. It will most likely not succeed.
*/
* (by doing a 0 -> TID atomic cmpxchg), while holding all
* the locks. It will most likely not succeed.
*/
- newval =
current->pid
;
+ newval =
task_pid_vnr(current)
;
curval = cmpxchg_futex_value_locked(uaddr, 0, newval);
curval = cmpxchg_futex_value_locked(uaddr, 0, newval);
@@
-1379,7
+1383,7
@@
static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared,
* Detect deadlocks. In case of REQUEUE_PI this is a valid
* situation and we return success to user space.
*/
* Detect deadlocks. In case of REQUEUE_PI this is a valid
* situation and we return success to user space.
*/
- if (unlikely((curval & FUTEX_TID_MASK) ==
current->pid
)) {
+ if (unlikely((curval & FUTEX_TID_MASK) ==
task_pid_vnr(current)
)) {
ret = -EDEADLK;
goto out_unlock_release_sem;
}
ret = -EDEADLK;
goto out_unlock_release_sem;
}
@@
-1408,7
+1412,7
@@
static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared,
*/
if (unlikely(ownerdied || !(curval & FUTEX_TID_MASK))) {
/* Keep the OWNER_DIED bit */
*/
if (unlikely(ownerdied || !(curval & FUTEX_TID_MASK))) {
/* Keep the OWNER_DIED bit */
- newval = (curval & ~FUTEX_TID_MASK) |
current->pid
;
+ newval = (curval & ~FUTEX_TID_MASK) |
task_pid_vnr(current)
;
ownerdied = 0;
lock_taken = 1;
}
ownerdied = 0;
lock_taken = 1;
}
@@
-1587,7
+1591,7
@@
retry:
/*
* We release only a lock we actually own:
*/
/*
* We release only a lock we actually own:
*/
- if ((uval & FUTEX_TID_MASK) !=
current->pid
)
+ if ((uval & FUTEX_TID_MASK) !=
task_pid_vnr(current)
)
return -EPERM;
/*
* First take all the futex related locks:
return -EPERM;
/*
* First take all the futex related locks:
@@
-1608,7
+1612,7
@@
retry_unlocked:
* anyone else up:
*/
if (!(uval & FUTEX_OWNER_DIED))
* anyone else up:
*/
if (!(uval & FUTEX_OWNER_DIED))
- uval = cmpxchg_futex_value_locked(uaddr,
current->pid
, 0);
+ uval = cmpxchg_futex_value_locked(uaddr,
task_pid_vnr(current)
, 0);
if (unlikely(uval == -EFAULT))
if (unlikely(uval == -EFAULT))
@@
-1617,7
+1621,7
@@
retry_unlocked:
* Rare case: we managed to release the lock atomically,
* no need to wake anyone else up:
*/
* Rare case: we managed to release the lock atomically,
* no need to wake anyone else up:
*/
- if (unlikely(uval ==
current->pid
))
+ if (unlikely(uval ==
task_pid_vnr(current)
))
goto out_unlock;
/*
goto out_unlock;
/*
@@
-1854,7
+1858,8
@@
sys_get_robust_list(int pid, struct robust_list_head __user * __user *head_ptr,
ret = -ESRCH;
rcu_read_lock();
ret = -ESRCH;
rcu_read_lock();
- p = find_task_by_pid(pid);
+ p = find_task_by_pid_ns(pid,
+ current->nsproxy->pid_ns);
if (!p)
goto err_unlock;
ret = -EPERM;
if (!p)
goto err_unlock;
ret = -EPERM;
@@
-1887,7
+1892,7
@@
retry:
if (get_user(uval, uaddr))
return -1;
if (get_user(uval, uaddr))
return -1;
- if ((uval & FUTEX_TID_MASK) ==
curr->pid
) {
+ if ((uval & FUTEX_TID_MASK) ==
task_pid_vnr(curr)
) {
/*
* Ok, this dying thread is truly holding a futex
* of interest. Set the OWNER_DIED bit atomically
/*
* Ok, this dying thread is truly holding a futex
* of interest. Set the OWNER_DIED bit atomically
This page took
0.028291 seconds
and
5
git commands to generate.