[PATCH] keys: Discard key spinlock and use RCU for key payload
[linux-3.10.git] / include / linux / key.h
index 6aa46d0e812f974540ef788401def920da72d77c..2c24ffaca86fd9af5d44c16dd7aa55083a8c27ac 100644 (file)
@@ -18,7 +18,7 @@
 #include <linux/types.h>
 #include <linux/list.h>
 #include <linux/rbtree.h>
-#include <linux/spinlock.h>
+#include <linux/rcupdate.h>
 #include <asm/atomic.h>
 
 #ifdef __KERNEL__
@@ -78,7 +78,6 @@ struct key {
        key_serial_t            serial;         /* key serial number */
        struct rb_node          serial_node;
        struct key_type         *type;          /* type of key */
-       rwlock_t                lock;           /* examination vs change lock */
        struct rw_semaphore     sem;            /* change vs change sem */
        struct key_user         *user;          /* owner of this key */
        time_t                  expiry;         /* time at which key expires (or 0) */
@@ -86,14 +85,10 @@ struct key {
        gid_t                   gid;
        key_perm_t              perm;           /* access permissions */
        unsigned short          quotalen;       /* length added to quota */
-       unsigned short          datalen;        /* payload data length */
-       unsigned short          flags;          /* status flags (change with lock writelocked) */
-#define KEY_FLAG_INSTANTIATED  0x00000001      /* set if key has been instantiated */
-#define KEY_FLAG_DEAD          0x00000002      /* set if key type has been deleted */
-#define KEY_FLAG_REVOKED       0x00000004      /* set if key had been revoked */
-#define KEY_FLAG_IN_QUOTA      0x00000008      /* set if key consumes quota */
-#define KEY_FLAG_USER_CONSTRUCT        0x00000010      /* set if key is being constructed in userspace */
-#define KEY_FLAG_NEGATIVE      0x00000020      /* set if key is negative */
+       unsigned short          datalen;        /* payload data length
+                                                * - may not match RCU dereferenced payload
+                                                * - payload should contain own length
+                                                */
 
 #ifdef KEY_DEBUGGING
        unsigned                magic;
@@ -101,6 +96,14 @@ struct key {
 #define KEY_DEBUG_MAGIC_X      0xf8e9dacbu
 #endif
 
+       unsigned long           flags;          /* status flags (change with bitops) */
+#define KEY_FLAG_INSTANTIATED  0       /* set if key has been instantiated */
+#define KEY_FLAG_DEAD          1       /* set if key type has been deleted */
+#define KEY_FLAG_REVOKED       2       /* set if key had been revoked */
+#define KEY_FLAG_IN_QUOTA      3       /* set if key consumes quota */
+#define KEY_FLAG_USER_CONSTRUCT        4       /* set if key is being constructed in userspace */
+#define KEY_FLAG_NEGATIVE      5       /* set if key is negative */
+
        /* the description string
         * - this is used to match a key against search criteria
         * - this should be a printable string
@@ -250,6 +253,8 @@ extern int keyring_add_key(struct key *keyring,
 
 extern struct key *key_lookup(key_serial_t id);
 
+extern void keyring_replace_payload(struct key *key, void *replacement);
+
 #define key_serial(key) ((key) ? (key)->serial : 0)
 
 /*