102 lines
3.3 KiB
Diff
102 lines
3.3 KiB
Diff
--- openafs-1.6.2.orig/acinclude.m4
|
|
+++ openafs-1.6.2/acinclude.m4
|
|
@@ -812,6 +812,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinu
|
|
[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])
|
|
--- openafs-1.6.2.orig/src/afs/LINUX/osi_compat.h
|
|
+++ openafs-1.6.2/src/afs/LINUX/osi_compat.h
|
|
@@ -186,14 +186,24 @@ afs_linux_key_alloc(struct key_type *typ
|
|
}
|
|
|
|
# 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 @@ afs_set_name(afs_name_t aname, char *str
|
|
}
|
|
#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(¤t->sighand->siglock);
|
|
+ old = task_session_keyring(current);
|
|
+ smp_wmb();
|
|
+ task_session_keyring(current) = keyring;
|
|
+ spin_unlock_irq(¤t->sighand->siglock);
|
|
+#endif
|
|
+ return old;
|
|
+}
|
|
+
|
|
#endif /* AFS_LINUX_OSI_COMPAT_H */
|
|
--- openafs-1.6.2.orig/src/afs/LINUX/osi_groups.c
|
|
+++ openafs-1.6.2/src/afs/LINUX/osi_groups.c
|
|
@@ -214,14 +214,9 @@ install_session_keyring(struct key *keyr
|
|
}
|
|
|
|
/* install the keyring */
|
|
- spin_lock_irq(¤t->sighand->siglock);
|
|
- old = task_session_keyring(current);
|
|
- smp_wmb();
|
|
- task_session_keyring(current) = keyring;
|
|
- spin_unlock_irq(¤t->sighand->siglock);
|
|
-
|
|
+ old = afs_set_session_keyring(keyring);
|
|
if (old)
|
|
- key_put(old);
|
|
+ key_put(old);
|
|
|
|
out:
|
|
return code;
|
|
--- openafs-1.6.2.orig/src/afs/LINUX/osi_machdep.h
|
|
+++ openafs-1.6.2/src/afs/LINUX/osi_machdep.h
|
|
@@ -179,8 +179,13 @@ afs_set_cr_group_info(cred_t *cred, stru
|
|
#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
|
|
|