keys: update key quotas in key_put()
[linux-2.6-block.git] / security / keys / keyctl.c
index 10ba439968f744c61faf5ac0b86c6d3eb561b0b6..4bc3e9398ee3d9c6b35e5fce5a3aad5365197fe5 100644 (file)
@@ -954,6 +954,7 @@ long keyctl_chown_key(key_serial_t id, uid_t user, gid_t group)
        long ret;
        kuid_t uid;
        kgid_t gid;
+       unsigned long flags;
 
        uid = make_kuid(current_user_ns(), user);
        gid = make_kgid(current_user_ns(), group);
@@ -1010,7 +1011,7 @@ long keyctl_chown_key(key_serial_t id, uid_t user, gid_t group)
                        unsigned maxbytes = uid_eq(uid, GLOBAL_ROOT_UID) ?
                                key_quota_root_maxbytes : key_quota_maxbytes;
 
-                       spin_lock(&newowner->lock);
+                       spin_lock_irqsave(&newowner->lock, flags);
                        if (newowner->qnkeys + 1 > maxkeys ||
                            newowner->qnbytes + key->quotalen > maxbytes ||
                            newowner->qnbytes + key->quotalen <
@@ -1019,12 +1020,12 @@ long keyctl_chown_key(key_serial_t id, uid_t user, gid_t group)
 
                        newowner->qnkeys++;
                        newowner->qnbytes += key->quotalen;
-                       spin_unlock(&newowner->lock);
+                       spin_unlock_irqrestore(&newowner->lock, flags);
 
-                       spin_lock(&key->user->lock);
+                       spin_lock_irqsave(&key->user->lock, flags);
                        key->user->qnkeys--;
                        key->user->qnbytes -= key->quotalen;
-                       spin_unlock(&key->user->lock);
+                       spin_unlock_irqrestore(&key->user->lock, flags);
                }
 
                atomic_dec(&key->user->nkeys);
@@ -1056,7 +1057,7 @@ error:
        return ret;
 
 quota_overrun:
-       spin_unlock(&newowner->lock);
+       spin_unlock_irqrestore(&newowner->lock, flags);
        zapowner = newowner;
        ret = -EDQUOT;
        goto error_put;