Files
for-gentoo/net-fs/openafs-kernel/files/openafs-kernel-1.6.2-linux-3.8-1.patch
T
2013-03-15 17:23:51 +00:00

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(&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 */
--- 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(&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;
--- 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