diff options
author | David Howells <dhowells@redhat.com> | 2011-11-16 11:15:54 +0000 |
---|---|---|
committer | James Morris <jmorris@namei.org> | 2011-11-17 09:35:32 +1100 |
commit | 7845bc3964756240863ae453ffe4f7ee27ddc954 (patch) | |
tree | 3a3b9bf568184a3ae82bc581b63e1576ce99d7c8 | |
parent | 24942c8e5cc8696064ee207ff29d4cf21f70dafc (diff) | |
download | linux-7845bc3964756240863ae453ffe4f7ee27ddc954.tar.bz2 |
KEYS: Give key types their own lockdep class for key->sem
Give keys their own lockdep class to differentiate them from each other in case
a key of one type has to refer to a key of another type.
Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: Mimi Zohar <zohar@us.ibm.com>
Signed-off-by: James Morris <jmorris@namei.org>
-rw-r--r-- | include/linux/key-type.h | 1 | ||||
-rw-r--r-- | security/keys/key.c | 3 |
2 files changed, 4 insertions, 0 deletions
diff --git a/include/linux/key-type.h b/include/linux/key-type.h index 9efd081bb31e..39e3c082c49d 100644 --- a/include/linux/key-type.h +++ b/include/linux/key-type.h @@ -92,6 +92,7 @@ struct key_type { /* internal fields */ struct list_head link; /* link in types list */ + struct lock_class_key lock_class; /* key->sem lock class */ }; extern struct key_type key_type_keyring; diff --git a/security/keys/key.c b/security/keys/key.c index 4414abddcb5b..4f64c7267afb 100644 --- a/security/keys/key.c +++ b/security/keys/key.c @@ -291,6 +291,7 @@ struct key *key_alloc(struct key_type *type, const char *desc, atomic_set(&key->usage, 1); init_rwsem(&key->sem); + lockdep_set_class(&key->sem, &type->lock_class); key->type = type; key->user = user; key->quotalen = quotalen; @@ -946,6 +947,8 @@ int register_key_type(struct key_type *ktype) struct key_type *p; int ret; + memset(&ktype->lock_class, 0, sizeof(ktype->lock_class)); + ret = -EEXIST; down_write(&key_types_sem); |