Commit 59e6b9c11341e3b8ac5925427c903d4eae435bd8
Committed by
Trond Myklebust
1 parent
0cb3284b53
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
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>
Showing 3 changed files with 24 additions and 16 deletions Side-by-side Diff
include/linux/key.h
security/keys/key.c
... | ... | @@ -671,6 +671,26 @@ |
671 | 671 | return ktype; |
672 | 672 | } |
673 | 673 | |
674 | +void key_set_timeout(struct key *key, unsigned timeout) | |
675 | +{ | |
676 | + struct timespec now; | |
677 | + time_t expiry = 0; | |
678 | + | |
679 | + /* make the changes with the locks held to prevent races */ | |
680 | + down_write(&key->sem); | |
681 | + | |
682 | + if (timeout > 0) { | |
683 | + now = current_kernel_time(); | |
684 | + expiry = now.tv_sec + timeout; | |
685 | + } | |
686 | + | |
687 | + key->expiry = expiry; | |
688 | + key_schedule_gc(key->expiry + key_gc_delay); | |
689 | + | |
690 | + up_write(&key->sem); | |
691 | +} | |
692 | +EXPORT_SYMBOL_GPL(key_set_timeout); | |
693 | + | |
674 | 694 | /* |
675 | 695 | * Unlock a key type locked by key_type_lookup(). |
676 | 696 | */ |
security/keys/keyctl.c
... | ... | @@ -14,6 +14,7 @@ |
14 | 14 | #include <linux/sched.h> |
15 | 15 | #include <linux/slab.h> |
16 | 16 | #include <linux/syscalls.h> |
17 | +#include <linux/key.h> | |
17 | 18 | #include <linux/keyctl.h> |
18 | 19 | #include <linux/fs.h> |
19 | 20 | #include <linux/capability.h> |
20 | 21 | |
... | ... | @@ -1244,10 +1245,8 @@ |
1244 | 1245 | */ |
1245 | 1246 | long keyctl_set_timeout(key_serial_t id, unsigned timeout) |
1246 | 1247 | { |
1247 | - struct timespec now; | |
1248 | 1248 | struct key *key, *instkey; |
1249 | 1249 | key_ref_t key_ref; |
1250 | - time_t expiry; | |
1251 | 1250 | long ret; |
1252 | 1251 | |
1253 | 1252 | key_ref = lookup_user_key(id, KEY_LOOKUP_CREATE | KEY_LOOKUP_PARTIAL, |
... | ... | @@ -1273,20 +1272,7 @@ |
1273 | 1272 | |
1274 | 1273 | okay: |
1275 | 1274 | key = key_ref_to_ptr(key_ref); |
1276 | - | |
1277 | - /* make the changes with the locks held to prevent races */ | |
1278 | - down_write(&key->sem); | |
1279 | - | |
1280 | - expiry = 0; | |
1281 | - if (timeout > 0) { | |
1282 | - now = current_kernel_time(); | |
1283 | - expiry = now.tv_sec + timeout; | |
1284 | - } | |
1285 | - | |
1286 | - key->expiry = expiry; | |
1287 | - key_schedule_gc(key->expiry + key_gc_delay); | |
1288 | - | |
1289 | - up_write(&key->sem); | |
1275 | + key_set_timeout(key, timeout); | |
1290 | 1276 | key_put(key); |
1291 | 1277 | |
1292 | 1278 | ret = 0; |