summaryrefslogtreecommitdiffstats
path: root/security/keys/request_key.c
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2005-06-24 07:00:53 +0200
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-06-24 09:05:18 +0200
commit8589b4e00e352f983259140f25a262d973be6bc5 (patch)
treed53c9b43ee0aaa2d7518a023c4b6373422117506 /security/keys/request_key.c
parent[PATCH] Keys: Pass session keyring to call_usermodehelper() (diff)
downloadlinux-8589b4e00e352f983259140f25a262d973be6bc5.tar.xz
linux-8589b4e00e352f983259140f25a262d973be6bc5.zip
[PATCH] Keys: Use RCU to manage session keyring pointer
The attached patch uses RCU to manage the session keyring pointer in struct signal_struct. This means that searching need not disable interrupts and get a the sighand spinlock to access this pointer. Furthermore, by judicious use of rcu_read_(un)lock(), this patch also avoids the need to take and put refcounts on the session keyring itself, thus saving on even more atomic ops. Signed-Off-By: David Howells <dhowells@redhat.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'security/keys/request_key.c')
-rw-r--r--security/keys/request_key.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/security/keys/request_key.c b/security/keys/request_key.c
index 1919540f047d..54aa7b70e63b 100644
--- a/security/keys/request_key.c
+++ b/security/keys/request_key.c
@@ -175,13 +175,12 @@ static struct key *__request_key_construction(struct key_type *type,
key->expiry = now.tv_sec + key_negative_timeout;
if (current->signal->session_keyring) {
- unsigned long flags;
struct key *keyring;
- spin_lock_irqsave(&current->sighand->siglock, flags);
- keyring = current->signal->session_keyring;
+ rcu_read_lock();
+ keyring = rcu_dereference(current->signal->session_keyring);
atomic_inc(&keyring->usage);
- spin_unlock_irqrestore(&current->sighand->siglock, flags);
+ rcu_read_unlock();
key_link(keyring, key);
key_put(keyring);