aboutsummaryrefslogtreecommitdiffstats
path: root/security/keys/key.c
diff options
context:
space:
mode:
Diffstat (limited to 'security/keys/key.c')
-rw-r--r--security/keys/key.c51
1 files changed, 4 insertions, 47 deletions
diff --git a/security/keys/key.c b/security/keys/key.c
index 1f3ed44a83c0..4414abddcb5b 100644
--- a/security/keys/key.c
+++ b/security/keys/key.c
@@ -39,11 +39,6 @@ static DECLARE_RWSEM(key_types_sem);
39/* We serialise key instantiation and link */ 39/* We serialise key instantiation and link */
40DEFINE_MUTEX(key_construction_mutex); 40DEFINE_MUTEX(key_construction_mutex);
41 41
42/* Any key who's type gets unegistered will be re-typed to this */
43static struct key_type key_type_dead = {
44 .name = "dead",
45};
46
47#ifdef KEY_DEBUGGING 42#ifdef KEY_DEBUGGING
48void __key_check(const struct key *key) 43void __key_check(const struct key *key)
49{ 44{
@@ -602,7 +597,7 @@ void key_put(struct key *key)
602 key_check(key); 597 key_check(key);
603 598
604 if (atomic_dec_and_test(&key->usage)) 599 if (atomic_dec_and_test(&key->usage))
605 queue_work(system_nrt_wq, &key_gc_unused_work); 600 queue_work(system_nrt_wq, &key_gc_work);
606 } 601 }
607} 602}
608EXPORT_SYMBOL(key_put); 603EXPORT_SYMBOL(key_put);
@@ -980,49 +975,11 @@ EXPORT_SYMBOL(register_key_type);
980 */ 975 */
981void unregister_key_type(struct key_type *ktype) 976void unregister_key_type(struct key_type *ktype)
982{ 977{
983 struct rb_node *_n;
984 struct key *key;
985
986 down_write(&key_types_sem); 978 down_write(&key_types_sem);
987
988 /* withdraw the key type */
989 list_del_init(&ktype->link); 979 list_del_init(&ktype->link);
990 980 downgrade_write(&key_types_sem);
991 /* mark all the keys of this type dead */ 981 key_gc_keytype(ktype);
992 spin_lock(&key_serial_lock); 982 up_read(&key_types_sem);
993
994 for (_n = rb_first(&key_serial_tree); _n; _n = rb_next(_n)) {
995 key = rb_entry(_n, struct key, serial_node);
996
997 if (key->type == ktype) {
998 key->type = &key_type_dead;
999 set_bit(KEY_FLAG_DEAD, &key->flags);
1000 }
1001 }
1002
1003 spin_unlock(&key_serial_lock);
1004
1005 /* make sure everyone revalidates their keys */
1006 synchronize_rcu();
1007
1008 /* we should now be able to destroy the payloads of all the keys of
1009 * this type with impunity */
1010 spin_lock(&key_serial_lock);
1011
1012 for (_n = rb_first(&key_serial_tree); _n; _n = rb_next(_n)) {
1013 key = rb_entry(_n, struct key, serial_node);
1014
1015 if (key->type == ktype) {
1016 if (ktype->destroy)
1017 ktype->destroy(key);
1018 memset(&key->payload, KEY_DESTROY, sizeof(key->payload));
1019 }
1020 }
1021
1022 spin_unlock(&key_serial_lock);
1023 up_write(&key_types_sem);
1024
1025 key_schedule_gc(0);
1026} 983}
1027EXPORT_SYMBOL(unregister_key_type); 984EXPORT_SYMBOL(unregister_key_type);
1028 985