[PATCH] keys: Discard key spinlock and use RCU for key payload
[linux-3.10.git] / security / keys / keyctl.c
index dc0011b3fac92e8a8c623a0f8d92696d8052a241..cedb7326de2987d472e23fd1013719f75315b10a 100644 (file)
@@ -728,7 +728,6 @@ long keyctl_chown_key(key_serial_t id, uid_t uid, gid_t gid)
        /* make the changes with the locks held to prevent chown/chown races */
        ret = -EACCES;
        down_write(&key->sem);
-       write_lock(&key->lock);
 
        if (!capable(CAP_SYS_ADMIN)) {
                /* only the sysadmin can chown a key to some other UID */
@@ -755,7 +754,6 @@ long keyctl_chown_key(key_serial_t id, uid_t uid, gid_t gid)
        ret = 0;
 
  no_access:
-       write_unlock(&key->lock);
        up_write(&key->sem);
        key_put(key);
  error:
@@ -784,26 +782,19 @@ long keyctl_setperm_key(key_serial_t id, key_perm_t perm)
                goto error;
        }
 
-       /* make the changes with the locks held to prevent chown/chmod
-        * races */
+       /* make the changes with the locks held to prevent chown/chmod races */
        ret = -EACCES;
        down_write(&key->sem);
-       write_lock(&key->lock);
 
-       /* if we're not the sysadmin, we can only chmod a key that we
-        * own */
-       if (!capable(CAP_SYS_ADMIN) && key->uid != current->fsuid)
-               goto no_access;
-
-       /* changing the permissions mask */
-       key->perm = perm;
-       ret = 0;
+       /* if we're not the sysadmin, we can only change a key that we own */
+       if (capable(CAP_SYS_ADMIN) || key->uid == current->fsuid) {
+               key->perm = perm;
+               ret = 0;
+       }
 
- no_access:
-       write_unlock(&key->lock);
        up_write(&key->sem);
        key_put(key);
- error:
+error:
        return ret;
 
 } /* end keyctl_setperm_key() */