git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'for_paulus' of master.kernel.org:/pub/scm/linux/kernel/git/galak/powerpc
[pandora-kernel.git]
/
kernel
/
user.c
diff --git
a/kernel/user.c
b/kernel/user.c
index
d9deae4
..
6408c04
100644
(file)
--- a/
kernel/user.c
+++ b/
kernel/user.c
@@
-105,15
+105,19
@@
void free_uid(struct user_struct *up)
{
unsigned long flags;
{
unsigned long flags;
+ if (!up)
+ return;
+
local_irq_save(flags);
local_irq_save(flags);
- if (
up &&
atomic_dec_and_lock(&up->__count, &uidhash_lock)) {
+ if (atomic_dec_and_lock(&up->__count, &uidhash_lock)) {
uid_hash_remove(up);
uid_hash_remove(up);
+ spin_unlock_irqrestore(&uidhash_lock, flags);
key_put(up->uid_keyring);
key_put(up->session_keyring);
kmem_cache_free(uid_cachep, up);
key_put(up->uid_keyring);
key_put(up->session_keyring);
kmem_cache_free(uid_cachep, up);
- spin_unlock(&uidhash_lock);
+ } else {
+ local_irq_restore(flags);
}
}
- local_irq_restore(flags);
}
struct user_struct * alloc_uid(uid_t uid)
}
struct user_struct * alloc_uid(uid_t uid)
@@
-136,7
+140,7
@@
struct user_struct * alloc_uid(uid_t uid)
atomic_set(&new->processes, 0);
atomic_set(&new->files, 0);
atomic_set(&new->sigpending, 0);
atomic_set(&new->processes, 0);
atomic_set(&new->files, 0);
atomic_set(&new->sigpending, 0);
-#ifdef CONFIG_INOTIFY
+#ifdef CONFIG_INOTIFY
_USER
atomic_set(&new->inotify_watches, 0);
atomic_set(&new->inotify_devs, 0);
#endif
atomic_set(&new->inotify_watches, 0);
atomic_set(&new->inotify_devs, 0);
#endif
@@
-144,7
+148,7
@@
struct user_struct * alloc_uid(uid_t uid)
new->mq_bytes = 0;
new->locked_shm = 0;
new->mq_bytes = 0;
new->locked_shm = 0;
- if (alloc_uid_keyring(new) < 0) {
+ if (alloc_uid_keyring(new
, current
) < 0) {
kmem_cache_free(uid_cachep, new);
return NULL;
}
kmem_cache_free(uid_cachep, new);
return NULL;
}