Index: trunk/server/common/patches/openafs-TryEvictVCache-crash.patch
===================================================================
--- trunk/server/common/patches/openafs-TryEvictVCache-crash.patch	(revision 2414)
+++ trunk/server/common/patches/openafs-TryEvictVCache-crash.patch	(revision 2414)
@@ -0,0 +1,88 @@
+From eafc370c0eba7949d85547ebc27574aa106d3355 Mon Sep 17 00:00:00 2001
+From: Anders Kaseorg <andersk@mit.edu>
+Date: Tue, 7 May 2013 00:27:33 -0400
+Subject: [PATCH] =?UTF-8?q?Linux:=20osi=5FTryEvictVCache:=20Don=E2=80=99t?=
+ =?UTF-8?q?=20skip=20the=20first=20dentry=20if=20D=5FALIAS=5FIS=5FHLIST?=
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+An hlist doesn’t begin with a sentinel like a list does, so the old
+code would skip the first dentry or crash with a NULL dereference if
+there wasn’t one.  Use the kernel’s list_for_each_entry or
+hlist_for_each_entry macros instead of trying to do it manually.
+
+Should fix a crash observed by Alex Chernyakhovsky on kernel 3.6 and
+newer.
+
+Change-Id: I6d7bd190013a0250ca896af8d5182df55a3376b0
+Signed-off-by: Anders Kaseorg <andersk@mit.edu>
+---
+ src/afs/LINUX/osi_vcache.c | 30 +++++++++---------------------
+ 1 file changed, 9 insertions(+), 21 deletions(-)
+
+diff --git a/src/afs/LINUX/osi_vcache.c b/src/afs/LINUX/osi_vcache.c
+index dc3685b..99aab91 100644
+--- a/src/afs/LINUX/osi_vcache.c
++++ b/src/afs/LINUX/osi_vcache.c
+@@ -19,10 +19,8 @@ osi_TryEvictVCache(struct vcache *avc, int *slept, int defersleep) {
+ 
+     struct dentry *dentry;
+     struct inode *inode = AFSTOV(avc);
+-#if defined(D_ALIAS_IS_HLIST)
+-    struct hlist_node *cur, *head, *list_end;
+-#else
+-    struct list_head *cur, *head, *list_end;
++#if defined(D_ALIAS_IS_HLIST) && !defined(HLIST_ITERATOR_NO_NODE)
++    struct hlist_node *p;
+ #endif
+ 
+     /* First, see if we can evict the inode from the dcache */
+@@ -33,13 +31,9 @@ osi_TryEvictVCache(struct vcache *avc, int *slept, int defersleep) {
+ 
+ #if defined(HAVE_DCACHE_LOCK)
+         spin_lock(&dcache_lock);
+-	head = &inode->i_dentry;
+ 
+ restart:
+-        cur = head;
+-	while ((cur = cur->next) != head) {
+-	    dentry = list_entry(cur, struct dentry, d_alias);
+-
++	list_for_each_entry(dentry, &inode->i_dentry, d_alias) {
+ 	    if (d_unhashed(dentry))
+ 		continue;
+ 	    dget_locked(dentry);
+@@ -57,23 +51,17 @@ restart:
+ 	spin_unlock(&dcache_lock);
+ #else /* HAVE_DCACHE_LOCK */
+ 	spin_lock(&inode->i_lock);
+-#if defined(D_ALIAS_IS_HLIST)
+-	head = inode->i_dentry.first;
+-	list_end = NULL;
+-#else
+-	head = &inode->i_dentry;
+-	list_end = head;
+-#endif
+ 
+ restart:
+-	cur = head;
+-	while ((cur = cur->next) != list_end) {
+ #if defined(D_ALIAS_IS_HLIST)
+-	    dentry = hlist_entry(cur, struct dentry, d_alias);
++# if defined(HLIST_ITERATOR_NO_NODE)
++	hlist_for_each_entry(dentry, &inode->i_dentry, d_alias) {
++# else
++	hlist_for_each_entry(dentry, p, &inode->i_dentry, d_alias) {
++# endif
+ #else
+-	    dentry = list_entry(cur, struct dentry, d_alias);
++	list_for_each_entry(dentry, &inode->i_dentry, d_alias) {
+ #endif
+-
+ 	    spin_lock(&dentry->d_lock);
+ 	    if (d_unhashed(dentry)) {
+ 		spin_unlock(&dentry->d_lock);
+-- 
+1.8.3.rc1
+
Index: trunk/server/common/patches/openafs-linux-3.8-enablement.patch
===================================================================
--- trunk/server/common/patches/openafs-linux-3.8-enablement.patch	(revision 2406)
+++ 	(revision )
@@ -1,658 +1,0 @@
-From 5a21be491adc6acd3cc01990910c5675393be953 Mon Sep 17 00:00:00 2001
-From: Andrew Deason <adeason@sinenomine.net>
-Date: Wed, 29 Aug 2012 11:34:06 -0500
-Subject: [PATCH] LINUX: Indent osi_machdep.h maze
-
-This one isn't so bad, actually, but it still benefits from some
-indentation.
-
-Reviewed-on: http://gerrit.openafs.org/8018
-Tested-by: BuildBot <buildbot@rampaginggeek.com>
-Reviewed-by: Derrick Brashear <shadow@dementix.org>
-(cherry picked from commit 579048cb1ec24b09a869928ceb521c8db4201a43)
-
-Change-Id: I91bddcafe4141c5e6789b01cc4be1a879b6464d1
-Reviewed-on: http://gerrit.openafs.org/9330
-Tested-by: BuildBot <buildbot@rampaginggeek.com>
-Reviewed-by: Ken Dreyer <ktdreyer@ktdreyer.com>
-Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
----
- src/afs/LINUX/osi_machdep.h |  240 +++++++++++++++++++++----------------------
- 1 file changed, 120 insertions(+), 120 deletions(-)
-
-diff --git a/src/afs/LINUX/osi_machdep.h b/src/afs/LINUX/osi_machdep.h
-index a2c16f5..9260733 100644
---- a/src/afs/LINUX/osi_machdep.h
-+++ b/src/afs/LINUX/osi_machdep.h
-@@ -17,60 +17,60 @@
- 
- #include <linux/version.h>
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,4)
--#define AFS_LINUX26_ONEGROUP_ENV 1
-+# define AFS_LINUX26_ONEGROUP_ENV 1
- #endif
- 
- /* Only needed for xdr.h in glibc 2.1.x */
- #ifndef quad_t
--#define quad_t __quad_t
--#define u_quad_t __u_quad_t
-+# define quad_t __quad_t
-+# define u_quad_t __u_quad_t
- #endif
- 
- #undef getuerror
- 
- #ifdef STRUCT_TASK_STRUCT_HAS_TGID
--#define getpid() current->tgid
--#ifdef STRUCT_TASK_STRUCT_HAS_REAL_PARENT
--#define getppid() current->real_parent->tgid
--#elif defined(STRUCT_TASK_STRUCT_HAS_PARENT)
--#define getppid() current->parent->tgid
--#else
--#define getppid() current->p_opptr->tgid
--#endif
-+# define getpid() current->tgid
-+# ifdef STRUCT_TASK_STRUCT_HAS_REAL_PARENT
-+#  define getppid() current->real_parent->tgid
-+# elif defined(STRUCT_TASK_STRUCT_HAS_PARENT)
-+#  define getppid() current->parent->tgid
-+# else
-+#  define getppid() current->p_opptr->tgid
-+# endif
- #else /* !STRUCT_TASK_STRUCT_HAS_TGID */
--#define getpid() current->pid
--#ifdef STRUCT_TASK_STRUCT_HAS_REAL_PARENT
--#define getppid() current->real_parent->pid
--#elif defined(STRUCT_TASK_STRUCT_HAS_PARENT)
--#define getppid() current->parent->pid
--#else
--#define getppid() current->p_opptr->pid
--#endif
-+# define getpid() current->pid
-+# ifdef STRUCT_TASK_STRUCT_HAS_REAL_PARENT
-+#  define getppid() current->real_parent->pid
-+# elif defined(STRUCT_TASK_STRUCT_HAS_PARENT)
-+#  define getppid() current->parent->pid
-+# else
-+#  define getppid() current->p_opptr->pid
-+# endif
- #endif /* STRUCT_TASK_STRUCT_HAS_TGID */
- 
- #ifdef RECALC_SIGPENDING_TAKES_VOID
--#define RECALC_SIGPENDING(X) recalc_sigpending()
-+# define RECALC_SIGPENDING(X) recalc_sigpending()
- #else
--#define RECALC_SIGPENDING(X) recalc_sigpending(X)
-+# define RECALC_SIGPENDING(X) recalc_sigpending(X)
- #endif
- 
- #if defined (STRUCT_TASK_STRUCT_HAS_SIGMASK_LOCK)
--#define SIG_LOCK(X) spin_lock_irq(&X->sigmask_lock)
--#define SIG_UNLOCK(X) spin_unlock_irq(&X->sigmask_lock)
-+# define SIG_LOCK(X) spin_lock_irq(&X->sigmask_lock)
-+# define SIG_UNLOCK(X) spin_unlock_irq(&X->sigmask_lock)
- #elif defined (STRUCT_TASK_STRUCT_HAS_SIGHAND)
--#define SIG_LOCK(X) spin_lock_irq(&X->sighand->siglock)
--#define SIG_UNLOCK(X) spin_unlock_irq(&X->sighand->siglock)
-+# define SIG_LOCK(X) spin_lock_irq(&X->sighand->siglock)
-+# define SIG_UNLOCK(X) spin_unlock_irq(&X->sighand->siglock)
- #else
--#define SIG_LOCK(X) spin_lock_irq(&X->sig->siglock)
--#define SIG_UNLOCK(X) spin_unlock_irq(&X->sig->siglock)
-+# define SIG_LOCK(X) spin_lock_irq(&X->sig->siglock)
-+# define SIG_UNLOCK(X) spin_unlock_irq(&X->sig->siglock)
- #endif
- 
- #if defined (STRUCT_TASK_STRUCT_HAS_RLIM)
--#define TASK_STRUCT_RLIM rlim
-+# define TASK_STRUCT_RLIM rlim
- #elif defined (STRUCT_TASK_STRUCT_HAS_SIGNAL_RLIM)
--#define TASK_STRUCT_RLIM signal->rlim
-+# define TASK_STRUCT_RLIM signal->rlim
- #else
--#error Not sure what to do about rlim (should be in the Linux task struct somewhere....)
-+# error Not sure what to do about rlim (should be in the Linux task struct somewhere....)
- #endif
- 
- 
-@@ -83,13 +83,13 @@ static inline time_t osi_Time(void) {
-     return xtime.tv_sec;
- }
- #else
--#define osi_Time() (xtime.tv_sec)
-+# define osi_Time() (xtime.tv_sec)
- #endif
- 
- 
- 
- #ifdef AFS_LINUX_64BIT_KERNEL
--#define osi_GetTime(V)                                 \
-+# define osi_GetTime(V)                                 \
-     do {                                               \
-        struct timeval __afs_tv;                              \
-        do_gettimeofday(&__afs_tv);                           \
-@@ -97,7 +97,7 @@ static inline time_t osi_Time(void) {
-        (V)->tv_usec = (afs_int32)__afs_tv.tv_usec;           \
-     } while (0)
- #else
--#define osi_GetTime(V) do_gettimeofday((V))
-+# define osi_GetTime(V) do_gettimeofday((V))
- #endif
- 
- #undef gop_lookupname
-@@ -149,12 +149,12 @@ typedef struct task_struct afs_proc_t;
- typedef struct cred afs_ucred_t;
- typedef struct cred cred_t;
- 
--#define afs_cr_uid(cred) ((cred)->fsuid)
--#define afs_cr_gid(cred) ((cred)->fsgid)
--#define afs_cr_ruid(cred) ((cred)->uid)
--#define afs_cr_rgid(cred) ((cred)->gid)
--#define afs_cr_group_info(cred) ((cred)->group_info)
--#define crhold(c) (get_cred(c))
-+# define afs_cr_uid(cred) ((cred)->fsuid)
-+# define afs_cr_gid(cred) ((cred)->fsgid)
-+# define afs_cr_ruid(cred) ((cred)->uid)
-+# define afs_cr_rgid(cred) ((cred)->gid)
-+# define afs_cr_group_info(cred) ((cred)->group_info)
-+# define crhold(c) (get_cred(c))
- static inline void
- afs_set_cr_uid(cred_t *cred, uid_t uid) {
-     cred->fsuid = uid;
-@@ -176,11 +176,11 @@ afs_set_cr_group_info(cred_t *cred, struct group_info *group_info) {
-     cred->group_info = group_info;
- }
- 
--#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)
-+# 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)
- 
- #else
- 
-@@ -194,31 +194,31 @@ typedef struct afs_cred {
- } cred_t;
- 
- typedef struct afs_cred afs_ucred_t;
--#define afs_cr_group_info(cred) ((cred)->cr_group_info)
-+# define afs_cr_group_info(cred) ((cred)->cr_group_info)
- static inline void
- afs_set_cr_group_info(cred_t *cred, struct group_info *group_info) {
-     cred->cr_group_info = group_info;
- }
- 
--#define current_group_info() (current->group_info)
--#if !defined(task_gid)
--#define task_gid(task) (task->gid)
--#endif
--#if !defined(task_uid)
--#define task_uid(task) (task->uid)
--#endif
--#define task_user(task) (task->user)
--#define task_session_keyring(task) (task->signal->session_keyring)
--#define current_session_keyring() (current->signal->session_keyring)
--#define crhold(c) atomic_inc(&(c)->cr_ref)
-+# define current_group_info() (current->group_info)
-+# if !defined(task_gid)
-+#  define task_gid(task) (task->gid)
-+# endif
-+# if !defined(task_uid)
-+#  define task_uid(task) (task->uid)
-+# endif
-+# define task_user(task) (task->user)
-+# define task_session_keyring(task) (task->signal->session_keyring)
-+# define current_session_keyring() (current->signal->session_keyring)
-+# define crhold(c) atomic_inc(&(c)->cr_ref)
- 
- #endif /* defined(STRUCT_TASK_STRUCT_HAS_CRED) */
- 
- #if !defined(current_cred)
--#define current_gid() (current->gid)
--#define current_uid() (current->uid)
--#define current_fsgid() (current->fsgid)
--#define current_fsuid() (current->fsuid)
-+# define current_gid() (current->gid)
-+# define current_uid() (current->uid)
-+# define current_fsgid() (current->fsgid)
-+# define current_fsuid() (current->fsuid)
- #endif
- 
- /* UIO manipulation */
-@@ -245,7 +245,7 @@ struct uio {
- #define OSIFILE_INODE(a) FILE_INODE((a)->filp)
- 
- #if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV)
--#define NEED_IOCTL32
-+# define NEED_IOCTL32
- #endif
- 
- #include <linux/version.h>
-@@ -256,8 +256,8 @@ struct uio {
- extern struct mutex afs_global_lock;
- #else
- extern struct semaphore afs_global_lock;
--#define mutex_lock(lock) down(lock)
--#define mutex_unlock(lock) up(lock)
-+# define mutex_lock(lock) down(lock)
-+# define mutex_unlock(lock) up(lock)
- #endif
- extern int afs_global_owner;
- 
-@@ -285,63 +285,63 @@ do { \
- #ifdef AFS_AMD64_LINUX20_ENV
- /* RHEL5 beta's kernel doesn't define these. They aren't gonna change, so... */
- 
--#ifndef __NR_ia32_afs_syscall
--#define __NR_ia32_afs_syscall 137
--#endif
--#ifndef __NR_ia32_setgroups
--#define __NR_ia32_setgroups 81
--#endif
--#ifndef __NR_ia32_setgroups32
--#define __NR_ia32_setgroups32 206
--#endif
--#ifndef __NR_ia32_close
--#define __NR_ia32_close 6
--#endif
--#ifndef __NR_ia32_chdir
--#define __NR_ia32_chdir 12
--#endif
--#ifndef __NR_ia32_break
--#define __NR_ia32_break 17
--#endif
--#ifndef __NR_ia32_stty
--#define __NR_ia32_stty 31
--#endif
--#ifndef __NR_ia32_gtty
--#define __NR_ia32_gtty 32
--#endif
--#ifndef __NR_ia32_ftime
--#define __NR_ia32_ftime 35
--#endif
--#ifndef __NR_ia32_prof
--#define __NR_ia32_prof 44
--#endif
--#ifndef __NR_ia32_lock
--#define __NR_ia32_lock 53
--#endif
--#ifndef __NR_ia32_mpx
--#define __NR_ia32_mpx 56
--#endif
--#ifndef __NR_ia32_exit
--#define __NR_ia32_exit 1
--#endif
--#ifndef __NR_ia32_mount
--#define __NR_ia32_mount 21
--#endif
--#ifndef __NR_ia32_read
--#define __NR_ia32_read 3
--#endif
--#ifndef __NR_ia32_write
--#define __NR_ia32_write 4
--#endif
--#ifndef __NR_ia32_open
--#define __NR_ia32_open 5
--#endif
--#ifndef __NR_ia32_close
--#define __NR_ia32_close 6
--#endif
--#ifndef __NR_ia32_unlink
--#define __NR_ia32_unlink 10
--#endif
-+# ifndef __NR_ia32_afs_syscall
-+#  define __NR_ia32_afs_syscall 137
-+# endif
-+# ifndef __NR_ia32_setgroups
-+#  define __NR_ia32_setgroups 81
-+# endif
-+# ifndef __NR_ia32_setgroups32
-+#  define __NR_ia32_setgroups32 206
-+# endif
-+# ifndef __NR_ia32_close
-+#  define __NR_ia32_close 6
-+# endif
-+# ifndef __NR_ia32_chdir
-+#  define __NR_ia32_chdir 12
-+# endif
-+# ifndef __NR_ia32_break
-+#  define __NR_ia32_break 17
-+# endif
-+# ifndef __NR_ia32_stty
-+#  define __NR_ia32_stty 31
-+# endif
-+# ifndef __NR_ia32_gtty
-+#  define __NR_ia32_gtty 32
-+# endif
-+# ifndef __NR_ia32_ftime
-+#  define __NR_ia32_ftime 35
-+# endif
-+# ifndef __NR_ia32_prof
-+#  define __NR_ia32_prof 44
-+# endif
-+# ifndef __NR_ia32_lock
-+#  define __NR_ia32_lock 53
-+# endif
-+# ifndef __NR_ia32_mpx
-+#  define __NR_ia32_mpx 56
-+# endif
-+# ifndef __NR_ia32_exit
-+#  define __NR_ia32_exit 1
-+# endif
-+# ifndef __NR_ia32_mount
-+#  define __NR_ia32_mount 21
-+# endif
-+# ifndef __NR_ia32_read
-+#  define __NR_ia32_read 3
-+# endif
-+# ifndef __NR_ia32_write
-+#  define __NR_ia32_write 4
-+# endif
-+# ifndef __NR_ia32_open
-+#  define __NR_ia32_open 5
-+# endif
-+# ifndef __NR_ia32_close
-+#  define __NR_ia32_close 6
-+# endif
-+# ifndef __NR_ia32_unlink
-+#  define __NR_ia32_unlink 10
-+# endif
- #endif
- 
- #define osi_procname(procname, size) strncpy(procname, current->comm, size)
--- 
-1.7.9.6 (Apple Git-31.1)
-
-From 314fcfa35917de0f688374137f0ffa040ea3660d Mon Sep 17 00:00:00 2001
-From: Marc Dionne <marc.c.dionne@gmail.com>
-Date: Wed, 9 Jan 2013 19:26:54 -0500
-Subject: [PATCH] Linux 3.8: session_keyring changes
-
-The session_keyring is now attached directly to the cred structure
-and the thread_group_cred structure (cred->tgcred) no longer exists.
-
-Adapt code that makes use of tgcred, and use the standard rcu based
-mechanism to update session_keyring.
-
-Reviewed-on: http://gerrit.openafs.org/8905
-Reviewed-by: Andrew Deason <adeason@sinenomine.net>
-Tested-by: BuildBot <buildbot@rampaginggeek.com>
-Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
-(cherry picked from commit c6d27e322a8d3b352554650473a048235a9c763a)
-
-Change-Id: If0998ee777ab0d196e19162499eb3ee60c5ff85d
-Reviewed-on: http://gerrit.openafs.org/8941
-Reviewed-by: Ken Dreyer <ktdreyer@ktdreyer.com>
-Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
-Tested-by: BuildBot <buildbot@rampaginggeek.com>
-Reviewed-by: Andrew Deason <adeason@sinenomine.net>
-Reviewed-by: Paul Smeddle <paul.smeddle@gmail.com>
-Reviewed-by: Stephan Wiesand <stephan.wiesand@desy.de>
----
- acinclude.m4                |    1 +
- src/afs/LINUX/osi_compat.h  |   34 ++++++++++++++++++++++++++++++++--
- src/afs/LINUX/osi_groups.c  |    9 ++-------
- src/afs/LINUX/osi_machdep.h |    9 +++++++--
- 4 files changed, 42 insertions(+), 11 deletions(-)
-
-diff --git a/acinclude.m4 b/acinclude.m4
-index 8c57779..0a05caa 100644
---- a/acinclude.m4
-+++ b/acinclude.m4
-@@ -812,6 +812,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
- 				       [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 --git a/src/afs/LINUX/osi_compat.h b/src/afs/LINUX/osi_compat.h
-index 2dda136..a777542 100644
---- a/src/afs/LINUX/osi_compat.h
-+++ b/src/afs/LINUX/osi_compat.h
-@@ -186,14 +186,24 @@ afs_linux_key_alloc(struct key_type *type, const char *desc, uid_t uid,
- }
- 
- # 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 *string) {
- }
- #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 --git a/src/afs/LINUX/osi_groups.c b/src/afs/LINUX/osi_groups.c
-index c2a0308..e351344 100644
---- a/src/afs/LINUX/osi_groups.c
-+++ b/src/afs/LINUX/osi_groups.c
-@@ -214,14 +214,9 @@ install_session_keyring(struct key *keyring)
-     }
- 
-     /* 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 --git a/src/afs/LINUX/osi_machdep.h b/src/afs/LINUX/osi_machdep.h
-index 9260733..0202d0d 100644
---- a/src/afs/LINUX/osi_machdep.h
-+++ b/src/afs/LINUX/osi_machdep.h
-@@ -179,8 +179,13 @@ afs_set_cr_group_info(cred_t *cred, struct group_info *group_info) {
- # 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
- 
--- 
-1.7.9.6 (Apple Git-31.1)
-
-From bf9bcd09e6a54eb40e47c7a6cdc060be43be9495 Mon Sep 17 00:00:00 2001
-From: Marc Dionne <marc.c.dionne@gmail.com>
-Date: Wed, 9 Jan 2013 21:22:27 -0500
-Subject: [PATCH] Linux 3.8: vmtruncate removal
-
-vmtruncate had been deprecated for a while and has now been
-removed.  Do things the new way based on truncate_setsize.
-
-Reviewed-on: http://gerrit.openafs.org/8906
-Reviewed-by: Chas Williams - CONTRACTOR <chas@cmf.nrl.navy.mil>
-Tested-by: BuildBot <buildbot@rampaginggeek.com>
-Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
-(cherry picked from commit d0479bbaf43900d6733c3f7517926ee9813c9610)
-
-Change-Id: Iafc64e19544dec9fcaefad5ad274eac4133f4083
-Reviewed-on: http://gerrit.openafs.org/8942
-Reviewed-by: Ken Dreyer <ktdreyer@ktdreyer.com>
-Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
-Tested-by: BuildBot <buildbot@rampaginggeek.com>
-Reviewed-by: Andrew Deason <adeason@sinenomine.net>
-Reviewed-by: Paul Smeddle <paul.smeddle@gmail.com>
-Reviewed-by: Stephan Wiesand <stephan.wiesand@desy.de>
----
- acinclude.m4               |    1 +
- src/afs/LINUX/osi_compat.h |   14 ++++++++++++++
- src/afs/LINUX/osi_vm.c     |    5 ++---
- 3 files changed, 17 insertions(+), 3 deletions(-)
-
-diff --git a/acinclude.m4 b/acinclude.m4
-index 0a05caa..4223bb1 100644
---- a/acinclude.m4
-+++ b/acinclude.m4
-@@ -824,6 +824,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
- 		 AC_CHECK_LINUX_STRUCT([file_operations], [sendfile], [fs.h])
- 		 AC_CHECK_LINUX_STRUCT([file_system_type], [mount], [fs.h])
- 		 AC_CHECK_LINUX_STRUCT([filename], [name], [fs.h])
-+		 AC_CHECK_LINUX_STRUCT([inode_operations], [truncate], [fs.h])
- 		 AC_CHECK_LINUX_STRUCT([key_type], [preparse], [key-type.h])
- 		 AC_CHECK_LINUX_STRUCT([nameidata], [path], [namei.h])
- 		 AC_CHECK_LINUX_STRUCT([proc_dir_entry], [owner], [proc_fs.h])
-diff --git a/src/afs/LINUX/osi_compat.h b/src/afs/LINUX/osi_compat.h
-index a777542..e8bf003 100644
---- a/src/afs/LINUX/osi_compat.h
-+++ b/src/afs/LINUX/osi_compat.h
-@@ -537,4 +537,18 @@ afs_set_session_keyring(struct key *keyring)
-     return old;
- }
- 
-+static inline int
-+afs_truncate(struct inode *inode, int len)
-+{
-+    int code;
-+#if defined(STRUCT_INODE_OPERATIONS_HAS_TRUNCATE)
-+    code = vmtruncate(inode, len);
-+#else
-+    code = inode_newsize_ok(inode, len);
-+    if (!code)
-+        truncate_setsize(inode, len);
-+#endif
-+    return code;
-+}
-+
- #endif /* AFS_LINUX_OSI_COMPAT_H */
-diff --git a/src/afs/LINUX/osi_vm.c b/src/afs/LINUX/osi_vm.c
-index 2cd34f9..8bc792e 100644
---- a/src/afs/LINUX/osi_vm.c
-+++ b/src/afs/LINUX/osi_vm.c
-@@ -51,8 +51,7 @@ osi_VM_FlushVCache(struct vcache *avc, int *slept)
-     if (avc->opens != 0)
- 	return EBUSY;
- 
--    return vmtruncate(ip, 0);
--    return 0;
-+    return afs_truncate(ip, 0);
- }
- 
- /* Try to invalidate pages, for "fs flush" or "fs flushv"; or
-@@ -132,5 +131,5 @@ osi_VM_FlushPages(struct vcache *avc, afs_ucred_t *credp)
- void
- osi_VM_Truncate(struct vcache *avc, int alen, afs_ucred_t *acred)
- {
--    vmtruncate(AFSTOV(avc), alen);
-+    afs_truncate(AFSTOV(avc), alen);
- }
--- 
-1.7.9.6 (Apple Git-31.1)
-
-From b0a10607f90c4097206bc38cb9bd16e842dbda10 Mon Sep 17 00:00:00 2001
-From: Marc Dionne <marc.c.dionne@gmail.com>
-Date: Fri, 18 Jan 2013 22:40:03 -0500
-Subject: [PATCH] Linux: setpag() may replace credentials
-
-For recent Linux. setpag() may replace the current process' cred
-structure with a new one.  This is not a problem for most callers,
-but in the case of processing a SetTokens2 pioctl with the setpag
-option, the new credentials should be used to determine the target
-for the token.
-
-Reviewed-on: http://gerrit.openafs.org/8924
-Reviewed-by: Chas Williams - CONTRACTOR <chas@cmf.nrl.navy.mil>
-Tested-by: BuildBot <buildbot@rampaginggeek.com>
-Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
-(cherry picked from commit b61eac783e8c092cd4ba9f53a2b5ca7d43e08b1b)
-
-Change-Id: I66b5f171318964ff40fe78be24e75519183c3a82
-Reviewed-on: http://gerrit.openafs.org/8948
-Tested-by: BuildBot <buildbot@rampaginggeek.com>
-Reviewed-by: Andrew Deason <adeason@sinenomine.net>
-Reviewed-by: Paul Smeddle <paul.smeddle@gmail.com>
-Reviewed-by: Ken Dreyer <ktdreyer@ktdreyer.com>
-Reviewed-by: Stephan Wiesand <stephan.wiesand@desy.de>
----
- src/afs/afs_pioctl.c |    8 ++++++++
- 1 file changed, 8 insertions(+)
-
-diff --git a/src/afs/afs_pioctl.c b/src/afs/afs_pioctl.c
-index 3c01be5..98919a3 100644
---- a/src/afs/afs_pioctl.c
-+++ b/src/afs/afs_pioctl.c
-@@ -1859,6 +1859,9 @@ DECL_PIOCTL(PSetTokens)
-     afs_PutCell(tcell, READ_LOCK);
-     if (set_parent_pag) {
- 	afs_uint32 pag;
-+#if defined(AFS_LINUX26_ENV)
-+	afs_ucred_t *old_cred = *acred;
-+#endif
- #if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
- 	char procname[256];
- 	osi_procname(procname, 256);
-@@ -1868,6 +1871,11 @@ DECL_PIOCTL(PSetTokens)
- #else
- 	if (!setpag(acred, -1, &pag, 1)) {
- #endif
-+#if defined(AFS_LINUX26_ENV)
-+	    /* setpag() may have changed our credentials */
-+	    *acred = crref();
-+	    crfree(old_cred);
-+#endif
- 	    afs_InitReq(&treq, *acred);
- 	    areq = &treq;
- 	}
--- 
-1.7.9.6 (Apple Git-31.1)
-
