keys: Change keyring_serialise_link_sem to a mutex
authorDavid Howells <dhowells@redhat.com>
Thu, 30 May 2019 10:40:24 +0000 (11:40 +0100)
committerDavid Howells <dhowells@redhat.com>
Thu, 30 May 2019 13:17:01 +0000 (14:17 +0100)
Change keyring_serialise_link_sem to a mutex as it's only ever
write-locked.

Signed-off-by: David Howells <dhowells@redhat.com>
security/keys/keyring.c

index 5b218b27059803943ce3fc32e931b34c17c99354..ca6694ba1773f9c721765d1e9c37f0994f6c7faa 100644 (file)
@@ -100,7 +100,7 @@ EXPORT_SYMBOL(key_type_keyring);
  * Semaphore to serialise link/link calls to prevent two link calls in parallel
  * introducing a cycle.
  */
-static DECLARE_RWSEM(keyring_serialise_link_sem);
+static DEFINE_MUTEX(keyring_serialise_link_lock);
 
 /*
  * Publish the name of a keyring so that it can be found by name (if it has
@@ -1206,7 +1206,7 @@ int __key_link_begin(struct key *keyring,
                     const struct keyring_index_key *index_key,
                     struct assoc_array_edit **_edit)
        __acquires(&keyring->sem)
-       __acquires(&keyring_serialise_link_sem)
+       __acquires(&keyring_serialise_link_lock)
 {
        struct assoc_array_edit *edit;
        int ret;
@@ -1228,7 +1228,7 @@ int __key_link_begin(struct key *keyring,
        /* serialise link/link calls to prevent parallel calls causing a cycle
         * when linking two keyring in opposite orders */
        if (index_key->type == &key_type_keyring)
-               down_write(&keyring_serialise_link_sem);
+               mutex_lock(&keyring_serialise_link_lock);
 
        /* Create an edit script that will insert/replace the key in the
         * keyring tree.
@@ -1260,7 +1260,7 @@ error_cancel:
        assoc_array_cancel_edit(edit);
 error_sem:
        if (index_key->type == &key_type_keyring)
-               up_write(&keyring_serialise_link_sem);
+               mutex_unlock(&keyring_serialise_link_lock);
 error_krsem:
        up_write(&keyring->sem);
        kleave(" = %d", ret);
@@ -1307,13 +1307,13 @@ void __key_link_end(struct key *keyring,
                    const struct keyring_index_key *index_key,
                    struct assoc_array_edit *edit)
        __releases(&keyring->sem)
-       __releases(&keyring_serialise_link_sem)
+       __releases(&keyring_serialise_link_lock)
 {
        BUG_ON(index_key->type == NULL);
        kenter("%d,%s,", keyring->serial, index_key->type->name);
 
        if (index_key->type == &key_type_keyring)
-               up_write(&keyring_serialise_link_sem);
+               mutex_unlock(&keyring_serialise_link_lock);
 
        if (edit) {
                if (!edit->dead_leaf) {