|
@@ -77,10 +77,10 @@ static bool key_gc_keyring(struct key *keyring, time_t limit)
|
|
goto dont_gc;
|
|
goto dont_gc;
|
|
|
|
|
|
/* scan the keyring looking for dead keys */
|
|
/* scan the keyring looking for dead keys */
|
|
- klist = rcu_dereference_check(keyring->payload.subscriptions,
|
|
|
|
- lockdep_is_held(&key_serial_lock));
|
|
|
|
|
|
+ rcu_read_lock();
|
|
|
|
+ klist = rcu_dereference(keyring->payload.subscriptions);
|
|
if (!klist)
|
|
if (!klist)
|
|
- goto dont_gc;
|
|
|
|
|
|
+ goto unlock_dont_gc;
|
|
|
|
|
|
for (loop = klist->nkeys - 1; loop >= 0; loop--) {
|
|
for (loop = klist->nkeys - 1; loop >= 0; loop--) {
|
|
key = klist->keys[loop];
|
|
key = klist->keys[loop];
|
|
@@ -89,11 +89,14 @@ static bool key_gc_keyring(struct key *keyring, time_t limit)
|
|
goto do_gc;
|
|
goto do_gc;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+unlock_dont_gc:
|
|
|
|
+ rcu_read_unlock();
|
|
dont_gc:
|
|
dont_gc:
|
|
kleave(" = false");
|
|
kleave(" = false");
|
|
return false;
|
|
return false;
|
|
|
|
|
|
do_gc:
|
|
do_gc:
|
|
|
|
+ rcu_read_unlock();
|
|
key_gc_cursor = keyring->serial;
|
|
key_gc_cursor = keyring->serial;
|
|
key_get(keyring);
|
|
key_get(keyring);
|
|
spin_unlock(&key_serial_lock);
|
|
spin_unlock(&key_serial_lock);
|