From 5a21be491adc6acd3cc01990910c5675393be953 Mon Sep 17 00:00:00 2001 From: Andrew Deason 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 Reviewed-by: Derrick Brashear (cherry picked from commit 579048cb1ec24b09a869928ceb521c8db4201a43) Change-Id: I91bddcafe4141c5e6789b01cc4be1a879b6464d1 Reviewed-on: http://gerrit.openafs.org/9330 Tested-by: BuildBot Reviewed-by: Ken Dreyer Reviewed-by: Derrick Brashear --- 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 #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 @@ -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 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 Tested-by: BuildBot Reviewed-by: Derrick Brashear (cherry picked from commit c6d27e322a8d3b352554650473a048235a9c763a) Change-Id: If0998ee777ab0d196e19162499eb3ee60c5ff85d Reviewed-on: http://gerrit.openafs.org/8941 Reviewed-by: Ken Dreyer Reviewed-by: Derrick Brashear Tested-by: BuildBot Reviewed-by: Andrew Deason Reviewed-by: Paul Smeddle Reviewed-by: Stephan Wiesand --- 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(¤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 */ 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(¤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; 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 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 Tested-by: BuildBot Reviewed-by: Derrick Brashear (cherry picked from commit d0479bbaf43900d6733c3f7517926ee9813c9610) Change-Id: Iafc64e19544dec9fcaefad5ad274eac4133f4083 Reviewed-on: http://gerrit.openafs.org/8942 Reviewed-by: Ken Dreyer Reviewed-by: Derrick Brashear Tested-by: BuildBot Reviewed-by: Andrew Deason Reviewed-by: Paul Smeddle Reviewed-by: Stephan Wiesand --- 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 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 Tested-by: BuildBot Reviewed-by: Derrick Brashear (cherry picked from commit b61eac783e8c092cd4ba9f53a2b5ca7d43e08b1b) Change-Id: I66b5f171318964ff40fe78be24e75519183c3a82 Reviewed-on: http://gerrit.openafs.org/8948 Tested-by: BuildBot Reviewed-by: Andrew Deason Reviewed-by: Paul Smeddle Reviewed-by: Ken Dreyer Reviewed-by: Stephan Wiesand --- 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)