diff -Naur openafs-1.6.2/acinclude.m4 openafs-1.6.2-lunar/acinclude.m4
--- openafs-1.6.2/acinclude.m4	2013-02-21 13:12:06.000000000 +0100
+++ openafs-1.6.2-lunar/acinclude.m4	2013-05-11 15:22:45.978659620 +0200
@@ -812,6 +812,7 @@
 				       [write_begin], [fs.h])
 		 AC_CHECK_LINUX_STRUCT([backing_dev_info], [name],
 				       [backing-dev.h])
+		 AC_CHECK_LINUX_STRUCT([cred], [session_keyring], [cred.h])
 		 AC_CHECK_LINUX_STRUCT([ctl_table], [ctl_name], [sysctl.h])
 		 AC_CHECK_LINUX_STRUCT([dentry_operations], [d_automount], [dcache.h])
 		 AC_CHECK_LINUX_STRUCT([inode], [i_alloc_sem], [fs.h])
diff -Naur openafs-1.6.2/src/afs/LINUX/osi_compat.h openafs-1.6.2-lunar/src/afs/LINUX/osi_compat.h
--- openafs-1.6.2/src/afs/LINUX/osi_compat.h	2013-02-21 13:12:06.000000000 +0100
+++ openafs-1.6.2-lunar/src/afs/LINUX/osi_compat.h	2013-05-11 15:22:45.978659620 +0200
@@ -186,14 +186,24 @@
 }
 
 # if defined(STRUCT_TASK_STRUCT_HAS_CRED)
+static inline struct key *
+afs_session_keyring(afs_ucred_t *cred)
+{
+#  if defined(STRUCT_CRED_HAS_SESSION_KEYRING)
+    return cred->session_keyring;
+#  else
+    return cred->tgcred->session_keyring;
+#  endif
+}
+
 static inline struct key*
 afs_linux_search_keyring(afs_ucred_t *cred, struct key_type *type)
 {
     key_ref_t key_ref;
 
-    if (cred->tgcred->session_keyring) {
+    if (afs_session_keyring(cred)) {
 	key_ref = keyring_search(
-		      make_key_ref(cred->tgcred->session_keyring, 1),
+		      make_key_ref(afs_session_keyring(cred), 1),
 		      type, "_pag");
 	if (IS_ERR(key_ref))
 	    return ERR_CAST(key_ref);
@@ -507,4 +517,24 @@
 }
 #endif
 
+static_inline struct key *
+afs_set_session_keyring(struct key *keyring)
+{
+    struct key *old;
+#if defined(STRUCT_CRED_HAS_SESSION_KEYRING)
+    struct cred *new_creds;
+    old = current_session_keyring();
+    new_creds = prepare_creds();
+    rcu_assign_pointer(new_creds->session_keyring, keyring);
+    commit_creds(new_creds);
+#else
+    spin_lock_irq(&current->sighand->siglock);
+    old = task_session_keyring(current);
+    smp_wmb();
+    task_session_keyring(current) = keyring;
+    spin_unlock_irq(&current->sighand->siglock);
+#endif
+    return old;
+}
+
 #endif /* AFS_LINUX_OSI_COMPAT_H */
diff -Naur openafs-1.6.2/src/afs/LINUX/osi_groups.c openafs-1.6.2-lunar/src/afs/LINUX/osi_groups.c
--- openafs-1.6.2/src/afs/LINUX/osi_groups.c	2013-02-21 13:12:06.000000000 +0100
+++ openafs-1.6.2-lunar/src/afs/LINUX/osi_groups.c	2013-05-11 15:22:45.978659620 +0200
@@ -214,14 +214,9 @@
     }
 
     /* install the keyring */
-    spin_lock_irq(&current->sighand->siglock);
-    old = task_session_keyring(current);
-    smp_wmb();
-    task_session_keyring(current) = keyring;
-    spin_unlock_irq(&current->sighand->siglock);
-
+    old = afs_set_session_keyring(keyring);
     if (old)
-	    key_put(old);
+	key_put(old);
 
 out:
     return code;
diff -Naur openafs-1.6.2/src/afs/LINUX/osi_machdep.h openafs-1.6.2-lunar/src/afs/LINUX/osi_machdep.h
--- openafs-1.6.2/src/afs/LINUX/osi_machdep.h	2013-02-21 13:12:06.000000000 +0100
+++ openafs-1.6.2-lunar/src/afs/LINUX/osi_machdep.h	2013-05-11 15:23:42.568656912 +0200
@@ -179,8 +179,13 @@
 #define current_group_info() (current->cred->group_info)
 #define task_gid(task) (task->cred->gid)
 #define task_user(task) (task->cred->user)
-#define task_session_keyring(task) (task->cred->tgcred->session_keyring)
-#define current_session_keyring() (current->cred->tgcred->session_keyring)
+# if defined(STRUCT_CRED_HAS_SESSION_KEYRING)
+#  define task_session_keyring(task) (task->cred->session_keyring)
+#  define current_session_keyring() (current->cred->session_keyring)
+# else
+#  define task_session_keyring(task) (task->cred->tgcred->session_keyring)
+#  define current_session_keyring() (current->cred->tgcred->session_keyring)
+# endif
 
 #else
 
