diff options
Diffstat (limited to 'security/keys/gc.c')
| -rw-r--r-- | security/keys/gc.c | 9 | 
1 files changed, 6 insertions, 3 deletions
diff --git a/security/keys/gc.c b/security/keys/gc.c index 19902319d09..a46e825cbf0 100644 --- a/security/keys/gc.c +++ b/security/keys/gc.c @@ -77,10 +77,10 @@ static bool key_gc_keyring(struct key *keyring, time_t limit)  		goto dont_gc;  	/* 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) -		goto dont_gc; +		goto unlock_dont_gc;  	for (loop = klist->nkeys - 1; loop >= 0; loop--) {  		key = klist->keys[loop]; @@ -89,11 +89,14 @@ static bool key_gc_keyring(struct key *keyring, time_t limit)  			goto do_gc;  	} +unlock_dont_gc: +	rcu_read_unlock();  dont_gc:  	kleave(" = false");  	return false;  do_gc: +	rcu_read_unlock();  	key_gc_cursor = keyring->serial;  	key_get(keyring);  	spin_unlock(&key_serial_lock);  |