On 03/18, David Howells wrote:
--- a/security/keys/key.c +++ b/security/keys/key.c @@ -645,21 +645,30 @@ EXPORT_SYMBOL(key_reject_and_link); */ void key_put(struct key *key) {
- int quota_flag;
 - unsigned short len;
 - struct key_user *user;
 - if (key) { key_check(key);
 
quota_flag = test_bit(KEY_FLAG_IN_QUOTA, &key->flags);len = key->quotalen;user = key->user; if (refcount_dec_and_test(&key->usage)) { unsigned long flags;refcount_inc(&user->usage);/* deal with the user's key tracking and quota */
if (test_bit(KEY_FLAG_IN_QUOTA, &key->flags)) {spin_lock_irqsave(&key->user->lock, flags);key->user->qnkeys--;key->user->qnbytes -= key->quotalen;spin_unlock_irqrestore(&key->user->lock, flags);
if (quota_flag) {spin_lock_irqsave(&user->lock, flags);user->qnkeys--;user->qnbytes -= len; }spin_unlock_irqrestore(&user->lock, flags); } schedule_work(&key_gc_work);key_user_put(user);
Do we really need the unconditional refcount_inc / key_user_put ?
void key_put(struct key *key) { if (key) { struct key_user *user = NULL; unsigned short len;
key_check(key);
if (test_bit(KEY_FLAG_IN_QUOTA, &key->flags)) { len = key->quotalen; user = key->user; refcount_inc(&user->usage); }
if (refcount_dec_and_test(&key->usage)) { unsigned long flags;
/* deal with the user's key tracking and quota */ if (user) { spin_lock_irqsave(&user->lock, flags); user->qnkeys--; user->qnbytes -= len; spin_unlock_irqrestore(&user->lock, flags); } schedule_work(&key_gc_work); }
if (user) key_user_put(user); } }
looks a bit more clear/simple to me...
Oleg.