Lines Matching refs:key
50 void __key_check(const struct key *key) in __key_check() argument
53 key, key->magic, KEY_DEBUG_MAGIC); in __key_check()
151 static inline void key_alloc_serial(struct key *key) in key_alloc_serial() argument
154 struct key *xkey; in key_alloc_serial()
159 get_random_bytes(&key->serial, sizeof(key->serial)); in key_alloc_serial()
161 key->serial >>= 1; /* negative numbers are not permitted */ in key_alloc_serial()
162 } while (key->serial < 3); in key_alloc_serial()
172 xkey = rb_entry(parent, struct key, serial_node); in key_alloc_serial()
174 if (key->serial < xkey->serial) in key_alloc_serial()
176 else if (key->serial > xkey->serial) in key_alloc_serial()
183 rb_link_node(&key->serial_node, parent, p); in key_alloc_serial()
184 rb_insert_color(&key->serial_node, &key_serial_tree); in key_alloc_serial()
193 key->serial++; in key_alloc_serial()
194 if (key->serial < 3) { in key_alloc_serial()
195 key->serial = 3; in key_alloc_serial()
203 xkey = rb_entry(parent, struct key, serial_node); in key_alloc_serial()
204 if (key->serial < xkey->serial) in key_alloc_serial()
220 struct key *key_alloc(struct key_type *type, const char *desc, in key_alloc()
225 struct key *key; in key_alloc() local
229 key = ERR_PTR(-EINVAL); in key_alloc()
263 key = kmem_cache_alloc(key_jar, GFP_KERNEL); in key_alloc()
264 if (!key) in key_alloc()
268 key->description = kmemdup(desc, desclen, GFP_KERNEL); in key_alloc()
269 if (!key->description) in key_alloc()
273 atomic_set(&key->usage, 1); in key_alloc()
274 init_rwsem(&key->sem); in key_alloc()
275 key->type = type; in key_alloc()
276 key->user = user; in key_alloc()
277 key->quotalen = quotalen; in key_alloc()
278 key->datalen = type->def_datalen; in key_alloc()
279 key->uid = uid; in key_alloc()
280 key->gid = gid; in key_alloc()
281 key->perm = perm; in key_alloc()
282 key->flags = 0; in key_alloc()
283 key->expiry = 0; in key_alloc()
284 key->payload.data = NULL; in key_alloc()
285 key->security = NULL; in key_alloc()
288 key->flags |= 1 << KEY_FLAG_IN_QUOTA; in key_alloc()
290 memset(&key->type_data, 0, sizeof(key->type_data)); in key_alloc()
293 key->magic = KEY_DEBUG_MAGIC; in key_alloc()
297 ret = security_key_alloc(key, cred, flags); in key_alloc()
303 key_alloc_serial(key); in key_alloc()
306 return key; in key_alloc()
309 kfree(key->description); in key_alloc()
310 kmem_cache_free(key_jar, key); in key_alloc()
318 key = ERR_PTR(ret); in key_alloc()
322 kmem_cache_free(key_jar, key); in key_alloc()
332 key = ERR_PTR(-ENOMEM); in key_alloc()
338 key = ERR_PTR(-EDQUOT); in key_alloc()
349 int key_payload_reserve(struct key *key, size_t datalen) in key_payload_reserve() argument
351 int delta = (int) datalen - key->datalen; in key_payload_reserve()
354 key_check(key); in key_payload_reserve()
357 if (delta != 0 && test_bit(KEY_FLAG_IN_QUOTA, &key->flags)) { in key_payload_reserve()
358 unsigned maxbytes = (key->user->uid == 0) ? in key_payload_reserve()
361 spin_lock(&key->user->lock); in key_payload_reserve()
364 (key->user->qnbytes + delta >= maxbytes || in key_payload_reserve()
365 key->user->qnbytes + delta < key->user->qnbytes)) { in key_payload_reserve()
369 key->user->qnbytes += delta; in key_payload_reserve()
370 key->quotalen += delta; in key_payload_reserve()
372 spin_unlock(&key->user->lock); in key_payload_reserve()
377 key->datalen = datalen; in key_payload_reserve()
390 static int __key_instantiate_and_link(struct key *key, in __key_instantiate_and_link() argument
393 struct key *keyring, in __key_instantiate_and_link()
394 struct key *authkey) in __key_instantiate_and_link()
398 key_check(key); in __key_instantiate_and_link()
407 if (!test_bit(KEY_FLAG_INSTANTIATED, &key->flags)) { in __key_instantiate_and_link()
409 ret = key->type->instantiate(key, data, datalen); in __key_instantiate_and_link()
413 atomic_inc(&key->user->nikeys); in __key_instantiate_and_link()
414 set_bit(KEY_FLAG_INSTANTIATED, &key->flags); in __key_instantiate_and_link()
416 if (test_and_clear_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags)) in __key_instantiate_and_link()
421 ret = __key_link(keyring, key); in __key_instantiate_and_link()
433 wake_up_bit(&key->flags, KEY_FLAG_USER_CONSTRUCT); in __key_instantiate_and_link()
443 int key_instantiate_and_link(struct key *key, in key_instantiate_and_link() argument
446 struct key *keyring, in key_instantiate_and_link()
447 struct key *authkey) in key_instantiate_and_link()
454 ret = __key_instantiate_and_link(key, data, datalen, keyring, authkey); in key_instantiate_and_link()
469 int key_negate_and_link(struct key *key, in key_negate_and_link() argument
471 struct key *keyring, in key_negate_and_link()
472 struct key *authkey) in key_negate_and_link()
477 key_check(key); in key_negate_and_link()
489 if (!test_bit(KEY_FLAG_INSTANTIATED, &key->flags)) { in key_negate_and_link()
491 atomic_inc(&key->user->nikeys); in key_negate_and_link()
492 set_bit(KEY_FLAG_NEGATIVE, &key->flags); in key_negate_and_link()
493 set_bit(KEY_FLAG_INSTANTIATED, &key->flags); in key_negate_and_link()
495 key->expiry = now.tv_sec + timeout; in key_negate_and_link()
497 if (test_and_clear_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags)) in key_negate_and_link()
504 ret = __key_link(keyring, key); in key_negate_and_link()
518 wake_up_bit(&key->flags, KEY_FLAG_USER_CONSTRUCT); in key_negate_and_link()
534 struct key *key; in key_cleanup() local
541 key = rb_entry(_n, struct key, serial_node); in key_cleanup()
543 if (atomic_read(&key->usage) == 0) in key_cleanup()
553 rb_erase(&key->serial_node, &key_serial_tree); in key_cleanup()
556 key_check(key); in key_cleanup()
558 security_key_free(key); in key_cleanup()
561 if (test_bit(KEY_FLAG_IN_QUOTA, &key->flags)) { in key_cleanup()
562 spin_lock(&key->user->lock); in key_cleanup()
563 key->user->qnkeys--; in key_cleanup()
564 key->user->qnbytes -= key->quotalen; in key_cleanup()
565 spin_unlock(&key->user->lock); in key_cleanup()
568 atomic_dec(&key->user->nkeys); in key_cleanup()
569 if (test_bit(KEY_FLAG_INSTANTIATED, &key->flags)) in key_cleanup()
570 atomic_dec(&key->user->nikeys); in key_cleanup()
572 key_user_put(key->user); in key_cleanup()
575 if (key->type->destroy) in key_cleanup()
576 key->type->destroy(key); in key_cleanup()
578 kfree(key->description); in key_cleanup()
581 key->magic = KEY_DEBUG_MAGIC_X; in key_cleanup()
583 kmem_cache_free(key_jar, key); in key_cleanup()
596 void key_put(struct key *key) in key_put() argument
598 if (key) { in key_put()
599 key_check(key); in key_put()
601 if (atomic_dec_and_test(&key->usage)) in key_put()
613 struct key *key_lookup(key_serial_t id) in key_lookup()
616 struct key *key; in key_lookup() local
623 key = rb_entry(n, struct key, serial_node); in key_lookup()
625 if (id < key->serial) in key_lookup()
627 else if (id > key->serial) in key_lookup()
634 key = ERR_PTR(-ENOKEY); in key_lookup()
639 if (atomic_read(&key->usage) == 0 || in key_lookup()
640 test_bit(KEY_FLAG_DEAD, &key->flags) || in key_lookup()
641 key->type == &key_type_dead) in key_lookup()
647 atomic_inc(&key->usage); in key_lookup()
651 return key; in key_lookup()
700 struct key *key = key_ref_to_ptr(key_ref); in __key_update() local
709 if (!key->type->update) in __key_update()
712 down_write(&key->sem); in __key_update()
714 ret = key->type->update(key, payload, plen); in __key_update()
717 clear_bit(KEY_FLAG_NEGATIVE, &key->flags); in __key_update()
719 up_write(&key->sem); in __key_update()
727 key_put(key); in __key_update()
748 struct key *keyring, *key = NULL; in key_create_or_update() local
806 key = key_alloc(ktype, description, cred->fsuid, cred->fsgid, cred, in key_create_or_update()
808 if (IS_ERR(key)) { in key_create_or_update()
809 key_ref = ERR_CAST(key); in key_create_or_update()
814 ret = __key_instantiate_and_link(key, payload, plen, keyring, NULL); in key_create_or_update()
816 key_put(key); in key_create_or_update()
821 key_ref = make_key_ref(key, is_key_possessed(keyring_ref)); in key_create_or_update()
850 struct key *key = key_ref_to_ptr(key_ref); in key_update() local
853 key_check(key); in key_update()
862 if (key->type->update) { in key_update()
863 down_write(&key->sem); in key_update()
865 ret = key->type->update(key, payload, plen); in key_update()
868 clear_bit(KEY_FLAG_NEGATIVE, &key->flags); in key_update()
870 up_write(&key->sem); in key_update()
884 void key_revoke(struct key *key) in key_revoke() argument
886 key_check(key); in key_revoke()
893 down_write_nested(&key->sem, 1); in key_revoke()
894 if (!test_and_set_bit(KEY_FLAG_REVOKED, &key->flags) && in key_revoke()
895 key->type->revoke) in key_revoke()
896 key->type->revoke(key); in key_revoke()
898 up_write(&key->sem); in key_revoke()
941 struct key *key; in unregister_key_type() local
952 key = rb_entry(_n, struct key, serial_node); in unregister_key_type()
954 if (key->type == ktype) in unregister_key_type()
955 key->type = &key_type_dead; in unregister_key_type()
968 key = rb_entry(_n, struct key, serial_node); in unregister_key_type()
970 if (key->type == ktype) { in unregister_key_type()
972 ktype->destroy(key); in unregister_key_type()
973 memset(&key->payload, KEY_DESTROY, sizeof(key->payload)); in unregister_key_type()
991 key_jar = kmem_cache_create("key_jar", sizeof(struct key), in key_init()