Created a function for setting timeouts on keys
The keyctl_set_timeout function isn't exported to other parts of the kernel, but I want to use it for the NFS idmapper. I already have the key, but I wanted a generic way to set the timeout. Signed-off-by: Bryan Schumaker <bjschuma@netapp.com> Acked-by: David Howells <dhowells@redhat.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
0cb3284b53
commit
59e6b9c113
|
@ -276,6 +276,8 @@ static inline key_serial_t key_serial(const struct key *key)
|
|||
return key ? key->serial : 0;
|
||||
}
|
||||
|
||||
extern void key_set_timeout(struct key *, unsigned);
|
||||
|
||||
/**
|
||||
* key_is_instantiated - Determine if a key has been positively instantiated
|
||||
* @key: The key to check.
|
||||
|
|
|
@ -671,6 +671,26 @@ found_kernel_type:
|
|||
return ktype;
|
||||
}
|
||||
|
||||
void key_set_timeout(struct key *key, unsigned timeout)
|
||||
{
|
||||
struct timespec now;
|
||||
time_t expiry = 0;
|
||||
|
||||
/* make the changes with the locks held to prevent races */
|
||||
down_write(&key->sem);
|
||||
|
||||
if (timeout > 0) {
|
||||
now = current_kernel_time();
|
||||
expiry = now.tv_sec + timeout;
|
||||
}
|
||||
|
||||
key->expiry = expiry;
|
||||
key_schedule_gc(key->expiry + key_gc_delay);
|
||||
|
||||
up_write(&key->sem);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(key_set_timeout);
|
||||
|
||||
/*
|
||||
* Unlock a key type locked by key_type_lookup().
|
||||
*/
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/sched.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <linux/key.h>
|
||||
#include <linux/keyctl.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/capability.h>
|
||||
|
@ -1244,10 +1245,8 @@ error:
|
|||
*/
|
||||
long keyctl_set_timeout(key_serial_t id, unsigned timeout)
|
||||
{
|
||||
struct timespec now;
|
||||
struct key *key, *instkey;
|
||||
key_ref_t key_ref;
|
||||
time_t expiry;
|
||||
long ret;
|
||||
|
||||
key_ref = lookup_user_key(id, KEY_LOOKUP_CREATE | KEY_LOOKUP_PARTIAL,
|
||||
|
@ -1273,20 +1272,7 @@ long keyctl_set_timeout(key_serial_t id, unsigned timeout)
|
|||
|
||||
okay:
|
||||
key = key_ref_to_ptr(key_ref);
|
||||
|
||||
/* make the changes with the locks held to prevent races */
|
||||
down_write(&key->sem);
|
||||
|
||||
expiry = 0;
|
||||
if (timeout > 0) {
|
||||
now = current_kernel_time();
|
||||
expiry = now.tv_sec + timeout;
|
||||
}
|
||||
|
||||
key->expiry = expiry;
|
||||
key_schedule_gc(key->expiry + key_gc_delay);
|
||||
|
||||
up_write(&key->sem);
|
||||
key_set_timeout(key, timeout);
|
||||
key_put(key);
|
||||
|
||||
ret = 0;
|
||||
|
|
Loading…
Reference in New Issue