Commit 59e6b9c11341e3b8ac5925427c903d4eae435bd8

Authored by Bryan Schumaker
Committed by Trond Myklebust
1 parent 0cb3284b53

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

... ... @@ -276,6 +276,8 @@
276 276 return key ? key->serial : 0;
277 277 }
278 278  
  279 +extern void key_set_timeout(struct key *, unsigned);
  280 +
279 281 /**
280 282 * key_is_instantiated - Determine if a key has been positively instantiated
281 283 * @key: The key to check.
... ... @@ -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;