mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-21 06:01:23 +00:00
KEYS: Define a __key_get() wrapper to use rather than atomic_inc()
Define a __key_get() wrapper to use rather than atomic_inc() on the key usage count as this makes it easier to hook in refcount error debugging. Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
parent
d0a059cac6
commit
ccc3e6d9c9
5 changed files with 27 additions and 20 deletions
|
@ -960,14 +960,17 @@ payload contents" for more information.
|
||||||
the argument will not be parsed.
|
the argument will not be parsed.
|
||||||
|
|
||||||
|
|
||||||
(*) Extra references can be made to a key by calling the following function:
|
(*) Extra references can be made to a key by calling one of the following
|
||||||
|
functions:
|
||||||
|
|
||||||
|
struct key *__key_get(struct key *key);
|
||||||
struct key *key_get(struct key *key);
|
struct key *key_get(struct key *key);
|
||||||
|
|
||||||
These need to be disposed of by calling key_put() when they've been
|
Keys so references will need to be disposed of by calling key_put() when
|
||||||
finished with. The key pointer passed in will be returned. If the pointer
|
they've been finished with. The key pointer passed in will be returned.
|
||||||
is NULL or CONFIG_KEYS is not set then the key will not be dereferenced and
|
|
||||||
no increment will take place.
|
In the case of key_get(), if the pointer is NULL or CONFIG_KEYS is not set
|
||||||
|
then the key will not be dereferenced and no increment will take place.
|
||||||
|
|
||||||
|
|
||||||
(*) A key's serial number can be obtained by calling:
|
(*) A key's serial number can be obtained by calling:
|
||||||
|
|
|
@ -219,11 +219,15 @@ extern void key_revoke(struct key *key);
|
||||||
extern void key_invalidate(struct key *key);
|
extern void key_invalidate(struct key *key);
|
||||||
extern void key_put(struct key *key);
|
extern void key_put(struct key *key);
|
||||||
|
|
||||||
|
static inline struct key *__key_get(struct key *key)
|
||||||
|
{
|
||||||
|
atomic_inc(&key->usage);
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
static inline struct key *key_get(struct key *key)
|
static inline struct key *key_get(struct key *key)
|
||||||
{
|
{
|
||||||
if (key)
|
return key ? __key_get(key) : key;
|
||||||
atomic_inc(&key->usage);
|
|
||||||
return key;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void key_ref_put(key_ref_t key_ref)
|
static inline void key_ref_put(key_ref_t key_ref)
|
||||||
|
|
|
@ -644,7 +644,7 @@ found:
|
||||||
/* this races with key_put(), but that doesn't matter since key_put()
|
/* this races with key_put(), but that doesn't matter since key_put()
|
||||||
* doesn't actually change the key
|
* doesn't actually change the key
|
||||||
*/
|
*/
|
||||||
atomic_inc(&key->usage);
|
__key_get(key);
|
||||||
|
|
||||||
error:
|
error:
|
||||||
spin_unlock(&key_serial_lock);
|
spin_unlock(&key_serial_lock);
|
||||||
|
|
|
@ -479,7 +479,7 @@ not_this_keyring:
|
||||||
|
|
||||||
/* we found a viable match */
|
/* we found a viable match */
|
||||||
found:
|
found:
|
||||||
atomic_inc(&key->usage);
|
__key_get(key);
|
||||||
key->last_used_at = ctx->now.tv_sec;
|
key->last_used_at = ctx->now.tv_sec;
|
||||||
keyring->last_used_at = ctx->now.tv_sec;
|
keyring->last_used_at = ctx->now.tv_sec;
|
||||||
while (sp > 0)
|
while (sp > 0)
|
||||||
|
@ -573,7 +573,7 @@ key_ref_t __keyring_search_one(key_ref_t keyring_ref,
|
||||||
return ERR_PTR(-ENOKEY);
|
return ERR_PTR(-ENOKEY);
|
||||||
|
|
||||||
found:
|
found:
|
||||||
atomic_inc(&key->usage);
|
__key_get(key);
|
||||||
keyring->last_used_at = key->last_used_at =
|
keyring->last_used_at = key->last_used_at =
|
||||||
current_kernel_time().tv_sec;
|
current_kernel_time().tv_sec;
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
@ -909,7 +909,7 @@ void __key_link(struct key *keyring, struct key *key,
|
||||||
|
|
||||||
klist = rcu_dereference_locked_keyring(keyring);
|
klist = rcu_dereference_locked_keyring(keyring);
|
||||||
|
|
||||||
atomic_inc(&key->usage);
|
__key_get(key);
|
||||||
keyring->last_used_at = key->last_used_at =
|
keyring->last_used_at = key->last_used_at =
|
||||||
current_kernel_time().tv_sec;
|
current_kernel_time().tv_sec;
|
||||||
|
|
||||||
|
|
|
@ -235,7 +235,7 @@ int install_session_keyring_to_cred(struct cred *cred, struct key *keyring)
|
||||||
if (IS_ERR(keyring))
|
if (IS_ERR(keyring))
|
||||||
return PTR_ERR(keyring);
|
return PTR_ERR(keyring);
|
||||||
} else {
|
} else {
|
||||||
atomic_inc(&keyring->usage);
|
__key_get(keyring);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* install the keyring */
|
/* install the keyring */
|
||||||
|
@ -544,7 +544,7 @@ try_again:
|
||||||
}
|
}
|
||||||
|
|
||||||
key = ctx.cred->thread_keyring;
|
key = ctx.cred->thread_keyring;
|
||||||
atomic_inc(&key->usage);
|
__key_get(key);
|
||||||
key_ref = make_key_ref(key, 1);
|
key_ref = make_key_ref(key, 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -562,7 +562,7 @@ try_again:
|
||||||
}
|
}
|
||||||
|
|
||||||
key = ctx.cred->process_keyring;
|
key = ctx.cred->process_keyring;
|
||||||
atomic_inc(&key->usage);
|
__key_get(key);
|
||||||
key_ref = make_key_ref(key, 1);
|
key_ref = make_key_ref(key, 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -593,7 +593,7 @@ try_again:
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
key = rcu_dereference(ctx.cred->session_keyring);
|
key = rcu_dereference(ctx.cred->session_keyring);
|
||||||
atomic_inc(&key->usage);
|
__key_get(key);
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
key_ref = make_key_ref(key, 1);
|
key_ref = make_key_ref(key, 1);
|
||||||
break;
|
break;
|
||||||
|
@ -606,7 +606,7 @@ try_again:
|
||||||
}
|
}
|
||||||
|
|
||||||
key = ctx.cred->user->uid_keyring;
|
key = ctx.cred->user->uid_keyring;
|
||||||
atomic_inc(&key->usage);
|
__key_get(key);
|
||||||
key_ref = make_key_ref(key, 1);
|
key_ref = make_key_ref(key, 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -618,7 +618,7 @@ try_again:
|
||||||
}
|
}
|
||||||
|
|
||||||
key = ctx.cred->user->session_keyring;
|
key = ctx.cred->user->session_keyring;
|
||||||
atomic_inc(&key->usage);
|
__key_get(key);
|
||||||
key_ref = make_key_ref(key, 1);
|
key_ref = make_key_ref(key, 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -632,7 +632,7 @@ try_again:
|
||||||
if (!key)
|
if (!key)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
atomic_inc(&key->usage);
|
__key_get(key);
|
||||||
key_ref = make_key_ref(key, 1);
|
key_ref = make_key_ref(key, 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -648,7 +648,7 @@ try_again:
|
||||||
} else {
|
} else {
|
||||||
rka = ctx.cred->request_key_auth->payload.data;
|
rka = ctx.cred->request_key_auth->payload.data;
|
||||||
key = rka->dest_keyring;
|
key = rka->dest_keyring;
|
||||||
atomic_inc(&key->usage);
|
__key_get(key);
|
||||||
}
|
}
|
||||||
up_read(&ctx.cred->request_key_auth->sem);
|
up_read(&ctx.cred->request_key_auth->sem);
|
||||||
if (!key)
|
if (!key)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue