the patches that weren't fully applied.
+++ /dev/null
-Patch the syscall probing to check for readability as well as writability,
-fixing problems with the latest AMD64 kernel. Pulled from upstream
-stable branch, will be in 1.4.5.
-
---- openafs.orig/src/afs/LINUX/osi_probe.c
-+++ openafs/src/afs/LINUX/osi_probe.c
-@@ -59,6 +59,7 @@
- #include "afsincludes.h"
- #endif
- #include <linux/version.h>
-+#include <linux/sched.h>
- #ifdef CONFIG_H_EXISTS
- #include <linux/config.h>
- #endif
-@@ -153,6 +154,7 @@
- * 0x0010 - detail - check_harder
- * 0x0020 - detail - check_harder/zapped
- * 0x0040 - automatically ignore setgroups and afs_syscall
-+ * 0x0080 - detail - check_table_readable
- */
- static int probe_debug = 0x41;
- #ifdef module_param
-@@ -298,6 +300,10 @@
- int debug_ignore_NR[4]; /* syscalls to ignore for debugging */
- } probectl;
-
-+#if defined(AFS_I386_LINUX26_ENV) || defined(AFS_AMD64_LINUX26_ENV)
-+static int check_access(unsigned long, int);
-+static int check_table_readable(probectl *, PROBETYPE *);
-+#endif
-
-
- /********** Probing Configuration: sys_call_table **********/
-@@ -940,6 +946,11 @@
- PROBETYPE *x;
- int i, j;
-
-+#if defined(AFS_I386_LINUX26_ENV) || defined(AFS_AMD64_LINUX26_ENV)
-+ i = check_table_readable(P, ptr);
-+ if (i >= 0) return i;
-+#endif
-+
- for (x = ptr, i = 0; i < _SS(NR_syscalls); i++, x++) {
- #ifdef OSI_PROBE_DEBUG
- if (probe_debug & 0x0040) {
-@@ -1062,6 +1073,11 @@
- unsigned long ip1;
- int i, s;
-
-+#if defined(AFS_I386_LINUX26_ENV) || defined(AFS_AMD64_LINUX26_ENV)
-+ i = check_table_readable(P, p);
-+ if (i >= 0) return 0;
-+#endif
-+
- /* Check zapped syscalls */
- for (i = 1; i < P->n_zapped_syscalls; i++) {
- if (p[_SS(P->zapped_syscalls[i])] != p[_SS(P->zapped_syscalls[0])]) {
-@@ -1349,7 +1365,7 @@
- }
-
- #if defined(AFS_I386_LINUX26_ENV) || defined(AFS_AMD64_LINUX26_ENV)
--static int check_writable(unsigned long address)
-+static int check_access(unsigned long address, int mode)
- {
- pgd_t *pgd = pgd_offset_k(address);
- #ifdef PUD_SIZE
-@@ -1374,10 +1390,34 @@
- pte = (pte_t *)pmd;
- else
- pte = pte_offset_kernel(pmd, address);
-- if (pte_none(*pte) || !pte_present(*pte) || !pte_write(*pte))
-+ if (pte_none(*pte) || !pte_present(*pte))
-+ return 0;
-+ if (mode && !pte_write(*pte))
- return 0;
- return 1;
- }
-+
-+static int check_table_readable(probectl *P, PROBETYPE *ptr)
-+{
-+ PROBETYPE *next_page;
-+ int i = 0, delta;
-+
-+ while (i < _SS(NR_syscalls)) {
-+ next_page = (PROBETYPE *)PAGE_ALIGN((unsigned long)(ptr+1));
-+ delta = next_page - ptr;
-+ if (!check_access((unsigned long)ptr, 0)) {
-+#ifdef OSI_PROBE_DEBUG
-+ if (probe_debug & 0x0080)
-+ printk("<7>osi_probe: %s 0x%016lx not readable; delta=0x%lx\n",
-+ P->symbol, (unsigned long)ptr, delta);
-+#endif
-+ return delta - 1;
-+ }
-+ ptr += delta;
-+ i += delta;
-+ }
-+ return -1;
-+}
- #endif
-
- void *osi_find_syscall_table(int which)
-@@ -1405,7 +1445,7 @@
- }
- printk("Found %s at 0x%lx (%s)\n", P->desc, (unsigned long)answer, method);
- #if defined(AFS_I386_LINUX26_ENV) || defined(AFS_AMD64_LINUX26_ENV)
-- if (!check_writable((unsigned long)answer)) {
-+ if (!check_access((unsigned long)answer, 1)) {
- printk("Address 0x%lx is not writable.\n", (unsigned long)answer);
- printk("System call hooks will not be installed; proceeding anyway\n");
- return 0;
SHLIB_LDFLAGS="-shared -Xlinker -x"
TXLIBS="-lncurses"
XCFLAGS="-O2 -D_LARGEFILE64_SOURCE"
-@@ -555,8 +557,7 @@
+@@ -557,8 +559,7 @@
;;
s390_linux22)
LD="ld"
KERN_OPTMZ=-O2
LEX="flex -l"
-@@ -564,6 +565,7 @@
+@@ -566,6 +567,7 @@
MT_CFLAGS='-DAFS_PTHREAD_ENV -pthread -D_REENTRANT ${XCFLAGS}'
MT_LIBS="-lpthread"
PAM_CFLAGS="-O -Dlinux -DLINUX_PAM -fPIC"
SHLIB_LDFLAGS="-shared -Xlinker -x"
TXLIBS="-lncurses"
XCFLAGS="-O -g -D_LARGEFILE64_SOURCE"
-@@ -572,8 +574,7 @@
+@@ -574,8 +576,7 @@
;;
s390_linux24|s390_linux26)
LD="ld"
KERN_OPTMZ=-O2
LEX="flex -l"
-@@ -581,6 +582,7 @@
+@@ -583,6 +584,7 @@
MT_CFLAGS='-DAFS_PTHREAD_ENV -pthread -D_REENTRANT ${XCFLAGS}'
MT_LIBS="-lpthread"
PAM_CFLAGS="-O -Dlinux -DLINUX_PAM -fPIC"
SHLIB_LDFLAGS="-shared -Xlinker -x"
TXLIBS="-lncurses"
XCFLAGS="-O -g -D_LARGEFILE64_SOURCE"
-@@ -589,8 +591,7 @@
+@@ -591,8 +593,7 @@
;;
s390x_linux24|s390x_linux26)
LD="ld"
KERN_OPTMZ=-O2
LEX="flex -l"
-@@ -598,6 +599,7 @@
+@@ -600,6 +601,7 @@
MT_CFLAGS='-DAFS_PTHREAD_ENV -pthread -D_REENTRANT ${XCFLAGS}'
MT_LIBS="-lpthread"
PAM_CFLAGS="-O -Dlinux -DLINUX_PAM -fPIC"
SHLIB_LDFLAGS="-shared -Xlinker -x -Xlinker -Bsymbolic"
TXLIBS="-lncurses"
XCFLAGS="-O -g -D_LARGEFILE64_SOURCE -D__s390x__"
-@@ -667,12 +669,13 @@
+@@ -669,12 +671,13 @@
SHLIB_LINKER="${CC} -shared"
;;
SHLIB_LDFLAGS="-shared -Xlinker -x"
TXLIBS="-lncurses"
XCFLAGS="-O2 -D_LARGEFILE64_SOURCE"
-@@ -682,19 +685,6 @@
+@@ -684,19 +687,6 @@
SHLIB_LINKER="${MT_CC} -shared"
;;
+++ /dev/null
-Fix the DES library alignment, which was otherwise causing problems on
-SPARC Linux. Pulled from the upstream stable branch, will be in 1.4.5.
-
---- openafs.orig/src/des/des.h
-+++ openafs/src/des/des.h
-@@ -20,7 +20,10 @@
- typedef unsigned char des_cblock[8]; /* crypto-block size */
- /* Key schedule */
- typedef struct des_ks_struct {
-- des_cblock _;
-+ union {
-+ afs_uint32 i[2];
-+ des_cblock _;
-+ } _;
- } des_key_schedule[16];
-
- #define DES_KEY_SZ (sizeof(des_cblock))
---- openafs.orig/src/des/pcbc_encrypt.c
-+++ openafs/src/des/pcbc_encrypt.c
-@@ -24,9 +24,9 @@
- #ifndef KERNEL
- #include <stdio.h>
- #endif
--#include <des.h>
- #include <afsconfig.h>
- #include <afs/param.h>
-+#include <des.h>
- #include "des_prototypes.h"
-
- RCSID
+++ /dev/null
-Add the ka-forwarder program, needed for some migration scenarios from
-the AFS kaserver. Pulled from upstream, will be in 1.4.5.
-
---- openafs.orig/src/aklog/Makefile.in
-+++ openafs/src/aklog/Makefile.in
-@@ -16,7 +16,7 @@
- SRCS= aklog.c aklog_main.c krb_util.c linked_list.c
- OBJS= aklog.o aklog_main.o krb_util.o linked_list.o
-
--all: aklog asetkey
-+all: aklog asetkey ka-forwarder
-
- aklog: ${OBJS} ${AFSLIBS}
- ${CC} -o $@ ${CFLAGS} ${OBJS} ${AKLIBS} ${AFSLIBS} ${XLIBS}
-@@ -24,11 +24,16 @@
- asetkey: asetkey.o ${AFSLIBS}
- ${CC} -o $@ ${CFLAGS} asetkey.o ${AKLIBS} ${AFSLIBS} ${XLIBS}
-
-+ka-forwarder: ka-forwarder.o
-+ ${CC} -o $@ ${CFLAGS} ka-forwarder.o ${LIBS} ${XLIBS}
-+
- #
- # Installation targets
- #
- install: \
-- ${DESTDIR}${bindir}/aklog ${DESTDIR}${afssrvbindir}/asetkey
-+ ${DESTDIR}${bindir}/aklog \
-+ ${DESTDIR}${afssrvbindir}/asetkey \
-+ ${DESTDIR}${afssrvbindir}/ka-forwarder
-
- ${DESTDIR}${bindir}/aklog: aklog
- ${INSTALL} $? $@
-@@ -36,8 +41,13 @@
- ${DESTDIR}${afssrvbindir}/asetkey: asetkey
- ${INSTALL} $? $@
-
-+${DESTDIR}${afssrvbindir}/ka-forwarder: ka-forwarder
-+ ${INSTALL} $? $@
-+
- dest: \
-- ${DEST}/bin/aklog ${DEST}/root.server/usr/afs/bin/asetkey
-+ ${DEST}/bin/aklog \
-+ ${DEST}/root.server/usr/afs/bin/asetkey \
-+ ${DEST}/root.server/usr/afs/bin/ka-forwarder
-
- ${DEST}/bin/aklog: aklog
- ${INSTALL} $? $@
-@@ -45,11 +55,14 @@
- ${DEST}/root.server/usr/afs/bin/asetkey: asetkey
- ${INSTALL} $? $@
-
-+${DEST}/root.server/usr/afs/bin/ka-forwarder: ka-forwarder
-+ ${INSTALL} $? $@
-+
- #
- # Misc. targets
- #
- clean:
-- $(RM) -f *.o ${OBJS} aklog asetkey
-+ $(RM) -f *.o ${OBJS} aklog asetkey ka-forwarder
-
- include ../config/Makefile.version
-
---- /dev/null
-+++ openafs/src/aklog/ka-forwarder.c
-@@ -0,0 +1,282 @@
-+/*
-+ * COPYRIGHT NOTICE
-+ * Copyright (c) 1994 Carnegie Mellon University
-+ * All Rights Reserved.
-+ *
-+ * See <cmu_copyright.h> for use and distribution information.
-+ */
-+
-+/*
-+ * HISTORY
-+ * $Log: ka-forwarder.c,v $
-+ * Revision 1.1 1997/06/03 18:23:54 kenh
-+ * .
-+ *
-+ * Revision 1.4 1996/08/09 01:00:21 jhutz
-+ * When initializing the array of fakeka servers, remember to set
-+ * the address family of each server; otherwise SunOS complains.
-+ * [1996/08/09 00:58:46 jhutz]
-+ *
-+ * Revision 1.3 1996/08/09 00:17:19 jhutz
-+ * Merged in changes from Chuck Silvers:
-+ * - Support for more than one fakeka server
-+ * - Support for specifying ports for each fakeka server separately from the
-+ * others, and from the port we listen on.
-+ *
-+ * Plus a minor bug fix to Chuck's code.
-+ * Basically, this version is designed to provide both reliability and
-+ * load-balancing cheaply. Basically, we forward packets to all of the
-+ * fakeka servers in round-robin fashion. So, if a client is losing on
-+ * one server, its retry should go to a different one, if more than one
-+ * is specified.
-+ * [1996/08/03 02:13:36 jhutz]
-+ *
-+ * Revision 1.2 1995/02/23 18:26:36 chs
-+ * Created.
-+ * [1995/02/23 18:26:03 chs]
-+ *
-+ * $EndLog$
-+ */
-+
-+/*
-+ * This program is intended to run on afs DB servers.
-+ * Its function is to forward KA requests to a fakeka server
-+ * running on an MIT kerberos server.
-+ */
-+
-+#include <sys/types.h>
-+#include <sys/socket.h>
-+#include <sys/ioctl.h>
-+#include <netinet/in.h>
-+#include <arpa/inet.h>
-+#include <stdio.h>
-+#include <netdb.h>
-+#include <ctype.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <syslog.h>
-+#include <unistd.h>
-+
-+#if HAVE_GETOPT_H
-+#include <getopt.h>
-+#else
-+int getopt (int, char * const *, const char *);
-+int optind, opterr;
-+char *optarg;
-+#endif
-+
-+#define BUFFER_SIZE 2048
-+
-+
-+char *prog;
-+
-+int num_servers, cur_server;
-+struct sockaddr_in *servers;
-+
-+
-+void
-+perrorexit(str)
-+char *str;
-+{
-+ perror(str);
-+ exit(1);
-+}
-+
-+
-+void
-+setup_servers(argc, argv)
-+int argc;
-+char **argv;
-+{
-+ int i;
-+ u_int fwdaddr;
-+ u_short fwdport;
-+
-+ num_servers = argc;
-+
-+ servers = malloc(sizeof(*servers) * num_servers);
-+ if (servers == NULL)
-+ perrorexit("malloc failed");
-+
-+ for (i = 0; i < num_servers; i++) {
-+ char *host, *port;
-+
-+ fwdport = htons(7004);
-+
-+ host = argv[i];
-+ port = strchr(host, '/');
-+ if (port != NULL) {
-+ *port++ = 0;
-+
-+ if (isdigit(port[0])) {
-+ fwdport = htons(atoi(port));
-+ }
-+ else {
-+ struct servent *srv = getservbyname(port, "udp");
-+ if (!srv) {
-+ fprintf(stderr, "%s: unknown service %s\n", prog, port);
-+ exit(1);
-+ }
-+ fwdport = srv->s_port;
-+ }
-+ }
-+
-+ if (isdigit(host[0])) {
-+ fwdaddr = inet_addr(host);
-+ }
-+ else {
-+ struct hostent *h = gethostbyname(host);
-+ if (!h) {
-+ fprintf(stderr, "%s: unknown host %s\n", prog, host);
-+ exit(1);
-+ }
-+ bcopy(h->h_addr, &fwdaddr, 4);
-+ }
-+
-+ servers[i].sin_family = AF_INET;
-+ servers[i].sin_addr.s_addr = fwdaddr;
-+ servers[i].sin_port = fwdport;
-+ }
-+}
-+
-+
-+int
-+setup_socket(port)
-+u_short port;
-+{
-+ int s, rv;
-+ struct sockaddr_in sin;
-+
-+ s = socket(AF_INET, SOCK_DGRAM, 0);
-+ if (s < 0)
-+ perrorexit("Couldn't create socket");
-+
-+ sin.sin_family = AF_INET;
-+ sin.sin_addr.s_addr = 0;
-+ sin.sin_port = htons(port);
-+
-+ rv = bind(s, (struct sockaddr *)&sin, sizeof(sin));
-+ if (rv < 0)
-+ perrorexit("Couldn't bind socket");
-+
-+ return s;
-+}
-+
-+
-+int
-+packet_is_reply(from)
-+struct sockaddr_in *from;
-+{
-+ int i;
-+
-+ for (i = 0; i < num_servers; i++) {
-+ struct sockaddr_in *sin = &servers[i];
-+
-+ if (from->sin_addr.s_addr == sin->sin_addr.s_addr &&
-+ from->sin_port == sin->sin_port)
-+ {
-+ return 1;
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+
-+int
-+main(argc, argv)
-+int argc;
-+char **argv;
-+{
-+ int c, s, rv;
-+ u_short port;
-+
-+ if (argc < 2) {
-+ fprintf(stderr,
-+ "usage: %s [-p port] <host>[/port] [host/port ...]\n",
-+ argv[0]);
-+ exit(1);
-+ }
-+
-+ prog = argv[0];
-+ port = 7004;
-+
-+ while ((c = getopt(argc, argv, "p:")) != -1) {
-+ switch (c) {
-+ case 'p':
-+ port = atoi(optarg);
-+ break;
-+ default:
-+ fprintf(stderr, "%s: invalid option '%c'\n", prog, c);
-+ exit(1);
-+ }
-+ }
-+
-+ /*
-+ * hmm, different implementations of getopt seem to do different things
-+ * when there aren't any options. linux sets optind = 1, which I would
-+ * call correct, but sunos sets optind = 0. try to do the right thing.
-+ */
-+ if (optind == 0)
-+ optind = 1;
-+
-+ setup_servers(argc - optind, argv + optind);
-+ s = setup_socket(port);
-+
-+ openlog("ka-forwarder", LOG_PID, LOG_DAEMON);
-+
-+ for (;;) {
-+ char buf[BUFFER_SIZE], *bufp, *sendptr;
-+ struct sockaddr_in from, reply, *to;
-+ int fromlen, sendlen;
-+
-+ bufp = buf + 8;
-+ fromlen = sizeof(from);
-+
-+ rv = recvfrom(s, bufp, sizeof(buf) - 8,
-+ 0, (struct sockaddr *)&from, &fromlen);
-+ if (rv < 0) {
-+ syslog(LOG_ERR, "recvfrom: %m");
-+ sleep(1);
-+ continue;
-+ }
-+
-+ if (packet_is_reply(&from)) {
-+ /* this is a reply, forward back to user */
-+
-+ to = &reply;
-+ reply.sin_family = AF_INET;
-+ bcopy(bufp, &reply.sin_addr.s_addr, 4);
-+ bcopy(bufp + 4, &reply.sin_port, 2);
-+ sendptr = bufp + 8;
-+ sendlen = rv - 8;
-+ }
-+ else {
-+ /* this is a request, forward to server */
-+
-+ cur_server = (cur_server + 1) % num_servers;
-+ to = &servers[cur_server];
-+
-+ bcopy(&from.sin_addr.s_addr, bufp - 8, 4);
-+ bcopy(&from.sin_port, bufp - 4, 2);
-+
-+ sendptr = bufp - 8;
-+ sendlen = rv + 8;
-+ }
-+
-+ {
-+ char a1[16], a2[16];
-+ strcpy(a1, inet_ntoa(from.sin_addr));
-+ strcpy(a2, inet_ntoa(to->sin_addr));
-+
-+ syslog(LOG_INFO, "forwarding %d bytes from %s/%d to %s/%d\n",
-+ sendlen, a1, htons(from.sin_port), a2, htons(to->sin_port));
-+ }
-+
-+ rv = sendto(s, sendptr, sendlen,
-+ 0, (struct sockaddr *)to, sizeof(*to));
-+ if (rv < 0) {
-+ syslog(LOG_ERR, "sendto: %m");
-+ }
-+ }
-+}
---- /dev/null
-+++ openafs/doc/man-pages/pod8/ka-forwarder.pod
-@@ -0,0 +1,85 @@
-+=head1 NAME
-+
-+ka-forwarder - Forward AFS Authentication Server requests to another server
-+
-+=head1 SYNOPSIS
-+
-+=for html
-+<div class="synopsis">
-+
-+B<ka-forwarder> S<<< [B<-p> <I<port>>] >>> <I<server>>[/<I<port>>] [...]
-+
-+=for html
-+</div>
-+
-+=head1 DESCRIPTION
-+
-+B<ka-forwarder> listens for requests for an AFS Authentication Server and
-+forwards them to a remove B<fakeka> server. B<fakeka> is a server that
-+answers AFS Authentication Server protocol requests using a regular
-+Kerberos KDC and is provided with some Kerberos 5 implementations.
-+B<fakeka> has to run on the same host as the Kerberos KDC, however, and
-+AFS clients send all native AFS authentication requests to the AFS
-+database servers. If you don't want to run your Kerberos KDCs and your
-+AFS database servers on the same host, run B<ka-forwarder> on the AFS
-+database servers and point it to B<fakeka> running on the Kerberos KDCs.
-+
-+B<ka-forwarder> takes one or more servers to which to forward the
-+requests. The default port on the remote server to which to forward the
-+command is 7004, but a different port can be specified by following the
-+server name with a slash (C</>) and the port number. If multiple servers
-+are given, B<ka-forwarder> will send queries to each server in turn in a
-+round-robin fashion.
-+
-+=head1 CAUTIONS
-+
-+Due to the way that B<ka-forwarder> distinguishes from client requests and
-+server responses, any messages from one of the servers to which
-+B<ka-forwarder> is forwarding will be considered a reply rather than a
-+command and will not be forwarded. This means that the servers running
-+B<fakeka> will not be able to use native AFS authentication requests and
-+rely on B<ka-forwarder> to send the requests to the right server.
-+
-+B<ka-forwarder> does not background itself. It should either be run in
-+the background via the shell, or run via the Basic OverSeer Server (see
-+L<bosserver(8)>).
-+
-+=head1 OPTIONS
-+
-+=over 4
-+
-+=item B<-p> <I<port>>
-+
-+By default, B<ka-forwarder> listens to the standard AFS Authentication
-+Server port (7004). To listen to a different port, specify it with the
-+B<-p> option.
-+
-+=back
-+
-+=head1 EXAMPLES
-+
-+Forward AFS Authentication Server reqests to the B<fakeka> servers on
-+kdc1.example.com and kdc2.example.com:
-+
-+ % ka-forwarder kdc1.example.com kdc2.example.com &
-+
-+Note the C<&> to tell the shell to run this command in the background.
-+
-+=head1 PRIVILEGE REQUIRED
-+
-+B<ka-forwarder> only has to listen to port 7004 and therefore does not
-+require any special privileges unless a privileged port is specified with
-+the B<-p> option.
-+
-+=head1 SEE ALSO
-+
-+L<bosserver(8)>,
-+fakeka(8),
-+L<kaserver(8)>
-+
-+=head1 COPYRIGHT
-+
-+Copyright 2006 Russ Allbery <rra@stanford.edu>
-+
-+This documentation is covered by the IBM Public License Version 1.0. This
-+man page was written by Russ Allbery for OpenAFS.
+++ /dev/null
-Change the expected source file name for assembly code in the kernel.
-Only used by the PowerPC build, but fixes build problems on that
-platform. Pulled from the upstream stable branch, will be in 1.4.5.
-
---- openafs.orig/src/libafs/make_kbuild_makefile.pl
-+++ openafs/src/libafs/make_kbuild_makefile.pl
-@@ -79,7 +79,7 @@
- foreach (@objects) {
- die "No source known for $_\n" unless exists $deps{$_};
- if($deps{$_} =~ /\.s$/) {
-- ($src = $_) =~ s/\.o$/.s/;
-+ ($src = $_) =~ s/\.o$/.S/;
- } else {
- ($src = $_) =~ s/\.o$/.c/;
- }
+++ /dev/null
-Add support for the kernel structure changes in 2.6.22. Pulled from the
-upstream stable branch, will be in 1.4.5.
-
---- openafs.orig/acinclude.m4
-+++ openafs/acinclude.m4
-@@ -611,6 +611,7 @@
- LINUX_FS_STRUCT_FOP_HAS_FLOCK
- LINUX_KERNEL_LINUX_SYSCALL_H
- LINUX_KERNEL_LINUX_SEQ_FILE_H
-+ LINUX_KERNEL_POSIX_LOCK_FILE_WAIT_ARG
- LINUX_KERNEL_SELINUX
- LINUX_KERNEL_SOCK_CREATE
- LINUX_KERNEL_PAGE_FOLLOW_LINK
-@@ -626,6 +627,7 @@
- LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_EXIT_STATE
- LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_TGID
- LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_TODO
-+ LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_THREAD_INFO
- LINUX_EXPORTS_TASKLIST_LOCK
- LINUX_GET_SB_HAS_STRUCT_VFSMOUNT
- LINUX_STATFS_TAKES_DENTRY
-@@ -767,6 +769,9 @@
- if test "x$ac_cv_linux_func_recalc_sigpending_takes_void" = "xyes"; then
- AC_DEFINE(RECALC_SIGPENDING_TAKES_VOID, 1, [define if your recalc_sigpending takes void])
- fi
-+ if test "x$ac_cv_linux_kernel_posix_lock_file_wait_arg" = "xyes" ; then
-+ AC_DEFINE(POSIX_LOCK_FILE_WAIT_ARG, 1, [define if your linux kernel uses 3 arguments for posix_lock_file])
-+ fi
- if test "x$ac_cv_linux_kernel_is_selinux" = "xyes" ; then
- AC_DEFINE(LINUX_KERNEL_IS_SELINUX, 1, [define if your linux kernel uses SELinux features])
- fi
-@@ -812,6 +817,9 @@
- if test "x$ac_cv_linux_sched_struct_task_struct_has_todo" = "xyes"; then
- AC_DEFINE(STRUCT_TASK_STRUCT_HAS_TODO, 1, [define if your struct task_struct has todo])
- fi
-+ if test "x$ac_cv_linux_sched_struct_task_struct_has_thread_info" = "xyes"; then
-+ AC_DEFINE(STRUCT_TASK_STRUCT_HAS_THREAD_INFO, 1, [define if your struct task_struct has thread_info])
-+ fi
- if test "x$ac_cv_linux_get_sb_has_struct_vfsmount" = "xyes"; then
- AC_DEFINE(GET_SB_HAS_STRUCT_VFSMOUNT, 1, [define if your get_sb_nodev needs a struct vfsmount argument])
- fi
---- openafs.orig/src/afs/LINUX/osi_sleep.c
-+++ openafs/src/afs/LINUX/osi_sleep.c
-@@ -205,7 +205,11 @@
- #if defined(STRUCT_TASK_STRUCT_HAS_TODO)
- !current->todo
- #else
-+#if defined(STRUCT_TASK_STRUCT_HAS_THREAD_INFO)
- test_ti_thread_flag(current->thread_info, TIF_FREEZE)
-+#else
-+ test_ti_thread_flag(task_thread_info(current), TIF_FREEZE)
-+#endif
- #endif
- #endif
- )
-@@ -303,7 +307,11 @@
- #if defined(STRUCT_TASK_STRUCT_HAS_TODO)
- !current->todo
- #else
-+#if defined(STRUCT_TASK_STRUCT_HAS_THREAD_INFO)
- test_ti_thread_flag(current->thread_info, TIF_FREEZE)
-+#else
-+ test_ti_thread_flag(task_thread_info(current), TIF_FREEZE)
-+#endif
- #endif
- #endif
- )
---- openafs.orig/src/afs/LINUX/osi_vfsops.c
-+++ openafs/src/afs/LINUX/osi_vfsops.c
-@@ -292,8 +292,10 @@
- {
- struct vcache *vcp = (struct vcache *) foo;
-
-+#if defined(SLAB_CTOR_VERIFY)
- if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) ==
- SLAB_CTOR_CONSTRUCTOR)
-+#endif
- inode_init_once(AFSTOV(vcp));
- }
-
---- openafs.orig/src/afs/LINUX/osi_vnodeops.c
-+++ openafs/src/afs/LINUX/osi_vnodeops.c
-@@ -473,11 +473,11 @@
- #ifdef AFS_LINUX24_ENV
- if ((code == 0 || flp->fl_type == F_UNLCK) &&
- (cmd == F_SETLK || cmd == F_SETLKW)) {
--#ifdef AFS_LINUX26_ENV
-+#ifdef POSIX_LOCK_FILE_WAIT_ARG
-+ code = posix_lock_file(fp, flp, 0);
-+#else
- flp->fl_flags &=~ FL_SLEEP;
- code = posix_lock_file(fp, flp);
--#else
-- code = posix_lock_file(fp, flp, 0);
- #endif
- if (code && flp->fl_type != F_UNLCK) {
- struct AFS_FLOCK flock2;
---- openafs.orig/src/cf/linux-test4.m4
-+++ openafs/src/cf/linux-test4.m4
-@@ -444,6 +444,18 @@
- AC_MSG_RESULT($ac_cv_linux_sched_struct_task_struct_has_exit_state)])
-
-
-+AC_DEFUN([LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_THREAD_INFO], [
-+ AC_MSG_CHECKING([for thread_info in struct task_struct])
-+ AC_CACHE_VAL([ac_cv_linux_sched_struct_task_struct_has_thread_info], [
-+ AC_TRY_KBUILD(
-+[#include <linux/sched.h>],
-+[struct task_struct _tsk;
-+printk("%d\n", _tsk.thread_info);],
-+ ac_cv_linux_sched_struct_task_struct_has_thread_info=yes,
-+ ac_cv_linux_sched_struct_task_struct_has_thread_info=no)])
-+ AC_MSG_RESULT($ac_cv_linux_sched_struct_task_struct_has_thread_info)])
-+
-+
- AC_DEFUN([LINUX_FS_STRUCT_SUPER_HAS_ALLOC_INODE], [
- AC_MSG_CHECKING([for alloc_inode in struct super_operations])
- AC_CACHE_VAL([ac_cv_linux_fs_struct_super_has_alloc_inode], [
-@@ -456,6 +468,17 @@
- AC_MSG_RESULT($ac_cv_linux_fs_struct_super_has_alloc_inode)])
-
-
-+AC_DEFUN([LINUX_KERNEL_POSIX_LOCK_FILE_WAIT_ARG], [
-+ AC_MSG_CHECKING([for 3rd argument in posix_lock_file found in new kernels])
-+ AC_CACHE_VAL([ac_cv_linux_kernel_posix_lock_file_wait_arg], [
-+ AC_TRY_KBUILD(
-+[#include <linux/fs.h>],
-+[posix_lock_file(0,0,0);],
-+ ac_cv_linux_kernel_posix_lock_file_wait_arg=yes,
-+ ac_cv_linux_kernel_posix_lock_file_wait_arg=no)])
-+ AC_MSG_RESULT($ac_cv_linux_kernel_posix_lock_file_wait_arg)])
-+
-+
- AC_DEFUN([LINUX_KERNEL_SOCK_CREATE], [
- AC_MSG_CHECKING([for 5th argument in sock_create found in some SELinux kernels])
- AC_CACHE_VAL([ac_cv_linux_kernel_sock_create_v], [
---- openafs.orig/src/rx/LINUX/rx_kmutex.c
-+++ openafs/src/rx/LINUX/rx_kmutex.c
-@@ -122,7 +122,11 @@
- #if defined(STRUCT_TASK_STRUCT_HAS_TODO)
- !current->todo
- #else
-+#if defined(STRUCT_TASK_STRUCT_HAS_THREAD_INFO)
- test_ti_thread_flag(current->thread_info, TIF_FREEZE)
-+#else
-+ test_ti_thread_flag(task_thread_info(current), TIF_FREEZE)
-+#endif
- #endif
- #endif
- )
---- openafs.orig/src/rx/LINUX/rx_knet.c
-+++ openafs/src/rx/LINUX/rx_knet.c
-@@ -173,7 +173,11 @@
- #if defined(STRUCT_TASK_STRUCT_HAS_TODO)
- !current->todo
- #else
-+#if defined(STRUCT_TASK_STRUCT_HAS_THREAD_INFO)
- test_ti_thread_flag(current->thread_info, TIF_FREEZE)
-+#else
-+ test_ti_thread_flag(task_thread_info(current), TIF_FREEZE)
-+#endif
- #endif
- #endif
- )
+++ /dev/null
-Fix for the proc structure changes in 2.6.22.1. Pulled from the upstream
-stable branch, will be in 1.4.5.
-
---- openafs.orig/src/afs/LINUX/osi_sysctl.c
-+++ openafs/src/afs/LINUX/osi_sysctl.c
-@@ -1,7 +1,7 @@
- /*
- * osi_sysctl.c: Linux sysctl interface to OpenAFS
- *
-- * $Id: osi_sysctl.c,v 1.7.2.4 2007/02/22 21:49:01 shadow Exp $
-+ * $Id: osi_sysctl.c,v 1.7.2.5 2007/06/12 18:28:49 shadow Exp $
- *
- * Written Jan 30, 2002 by Kris Van Hees (Sine Nomine Associates)
- */
-@@ -27,35 +27,64 @@
- static struct ctl_table_header *afs_sysctl = NULL;
-
- static ctl_table afs_sysctl_table[] = {
-- {1, "hm_retry_RO",
-- &hm_retry_RO, sizeof(afs_int32), 0644, NULL,
-- &proc_dointvec}
-- ,
-- {2, "hm_retry_RW",
-- &hm_retry_RW, sizeof(afs_int32), 0644, NULL,
-- &proc_dointvec}
-- ,
-- {3, "hm_retry_int",
-- &hm_retry_int, sizeof(afs_int32), 0644, NULL,
-- &proc_dointvec}
-- ,
-- {4, "GCPAGs",
-- &afs_gcpags, sizeof(afs_int32), 0644, NULL,
-- &proc_dointvec}
-- ,
-- {5, "rx_deadtime",
-- &afs_rx_deadtime, sizeof(afs_int32), 0644, NULL,
-- &proc_dointvec}
-- ,
-- {6, "bkVolPref",
-- &afs_bkvolpref, sizeof(afs_int32), 0644, NULL,
-- &proc_dointvec}
-- ,
-+ {
-+ .ctl_name = 1,
-+ .procname = "hm_retry_RO",
-+ .data = &hm_retry_RO,
-+ .maxlen = sizeof(afs_int32),
-+ .mode = 0644,
-+ .proc_handler = &proc_dointvec
-+ },
-+ {
-+ .ctl_name = 2,
-+ .procname = "hm_retry_RW",
-+ .data = &hm_retry_RW,
-+ .maxlen = sizeof(afs_int32),
-+ .mode = 0644,
-+ .proc_handler = &proc_dointvec
-+ },
-+ {
-+ .ctl_name = 3,
-+ .procname = "hm_retry_int",
-+ .data = &hm_retry_int,
-+ .maxlen = sizeof(afs_int32),
-+ .mode = 0644,
-+ .proc_handler = &proc_dointvec
-+ },
-+ {
-+ .ctl_name = 4,
-+ .procname = "GCPAGs",
-+ .data = &afs_gcpags,
-+ .maxlen = sizeof(afs_int32),
-+ .mode = 0644,
-+ .proc_handler = &proc_dointvec
-+ },
-+ {
-+ .ctl_name = 5,
-+ .procname = "rx_deadtime",
-+ .data = &afs_rx_deadtime,
-+ .maxlen = sizeof(afs_int32),
-+ .mode = 0644,
-+ .proc_handler = &proc_dointvec
-+ },
-+ {
-+ .ctl_name = 6,
-+ .procname = "bkVolPref",
-+ .data = &afs_bkvolpref,
-+ .maxlen = sizeof(afs_int32),
-+ .mode = 0644,
-+ .proc_handler = &proc_dointvec
-+ },
- {0}
- };
-
- static ctl_table fs_sysctl_table[] = {
-- {1, "afs", NULL, 0, 0555, afs_sysctl_table},
-+ {
-+ .ctl_name = 1,
-+ .procname = "afs",
-+ .mode = 0555,
-+ .child = afs_sysctl_table
-+ },
- {0}
- };
-
+++ /dev/null
-Tell the client to never generate an all-zero UUID, even if the client
-apparently doesn't have any network interfaces. Fixed upstream a
-different way, so this patch can be dropped after 1.4.5 is released.
-
---- openafs.orig/src/afs/afs_call.c
-+++ openafs/src/afs/afs_call.c
-@@ -858,6 +858,8 @@
- #if (!defined(AFS_NONFSTRANS)) || defined(AFS_AIX_IAUTH_ENV)
- afs_nfsclient_init();
- #endif
-+ if (afs_cb_interface.numberOfInterfaces < 1)
-+ afs_uuid_create(&afs_cb_interface.uuid);
- printf("found %d non-empty cache files (%d%%).\n",
- afs_stats_cmperf.cacheFilesReused,
- (100 * afs_stats_cmperf.cacheFilesReused) /
+++ /dev/null
-Treat clients that provide an all-zero UUID as if they don't support
-UUIDs at all. Pulled from the upstream stable branch, will be in 1.4.5.
-
---- openafs.orig/src/viced/host.c
-+++ openafs/src/viced/host.c
-@@ -74,6 +74,7 @@
- extern int lwps; /* the max number of server threads */
- extern afsUUID FS_HostUUID;
-
-+afsUUID nulluuid;
- int CEs = 0; /* active clients */
- int CEBlocks = 0; /* number of blocks of CEs */
- struct client *CEFree = 0; /* first free client */
-@@ -1329,7 +1330,8 @@
- rx_PutConnection(cb_conn);
- cb_conn=NULL;
- H_LOCK;
-- if (code == RXGEN_OPCODE) {
-+ if ((code == RXGEN_OPCODE) ||
-+ (afs_uuid_equal(&interf.uuid, &nulluuid))) {
- identP = (struct Identity *)malloc(sizeof(struct Identity));
- if (!identP) {
- ViceLog(0, ("Failed malloc in h_GetHost_r\n"));
-@@ -1452,7 +1454,8 @@
- rx_PutConnection(cb_conn);
- cb_conn=NULL;
- H_LOCK;
-- if (code == RXGEN_OPCODE) {
-+ if ((code == RXGEN_OPCODE) ||
-+ afs_uuid_equal(&interf.uuid, &nulluuid)) {
- if (!identP)
- identP =
- (struct Identity *)malloc(sizeof(struct Identity));
-@@ -1662,6 +1665,7 @@
- void
- h_InitHostPackage()
- {
-+ memset(&nulluuid, 0, sizeof(afsUUID));
- afsconf_GetLocalCell(confDir, localcellname, PR_MAXNAMELEN);
- if (!local_realm[0]) {
- if (afs_krb_get_lrealm(local_realm, 0) != 0 /*KSUCCESS*/) {
+++ /dev/null
-Make sure the AFS lock is held when a user process in a PAG exits, since
-otherwise we may crash. Pulled from the upstream stable branch, will be
-in 1.4.5.
-
---- openafs.orig/src/afs/LINUX/osi_groups.c
-+++ openafs/src/afs/LINUX/osi_groups.c
-@@ -594,13 +594,18 @@
- {
- afs_uint32 pag = key->payload.value;
- struct unixuser *pu;
-+ int locked = ISAFS_GLOCK();
-
-+ if (!locked)
-+ AFS_GLOCK();
- pu = afs_FindUser(pag, -1, READ_LOCK);
- if (pu) {
- pu->ct.EndTimestamp = 0;
- pu->tokenTime = 0;
- afs_PutUser(pu, READ_LOCK);
- }
-+ if (!locked)
-+ AFS_GUNLOCK();
- }
-
- struct key_type key_type_afs_pag =
+++ /dev/null
-Man page for pt_util. Pulled from the upstream stable branch, will be in
-1.4.5.
-
---- /dev/null
-+++ openafs/doc/man-pages/pod8/pt_util.pod
-@@ -0,0 +1,187 @@
-+=head1 NAME
-+
-+pt_util - Load or dump a Protection Server database
-+
-+=head1 SYNOPSIS
-+
-+=for html
-+<div class="synopsis">
-+
-+B<pt_util>
-+ S<<< [B<-w>] >>> S<<< [B<-user>] >>> S<<< [B<-group>] >>>
-+ S<<< [B<-members>] >>> S<<< [B<-name>] >>> S<<< [B<-system>] >>>
-+ S<<< [B<-xtra>] >>> S<<< [B<-prdb> <I<prdb file>>] >>>
-+ S<<< [B<-datafile> <I<data file>>] >>> S<<< [B<-help>] >>>
-+
-+=for html
-+</div>
-+
-+=head1 DESCRIPTION
-+
-+The B<pt_util> command can be used to load or dump the protection
-+database. It should only be used when B<ptserver> is not running.
-+
-+The most likely reason to use it is to initialize the protection database
-+when bringing up a new cell. The current syntax for this, presented
-+below, needs improvement. B<pt_util> can also be used when problems are
-+suspected with the database. It can be used to dump the database or
-+portions thereof, in several different ways, and to reload it.
-+
-+The textual representation of the database has the following form:
-+For users,
-+
-+ name flags/quota viceid ownerid creatorid
-+
-+For groups,
-+
-+ name flags/quota viceid ownerid creatorid
-+ a-username a-user-viceid
-+
-+The second line is repeated for each member of the group. When reading
-+the database, membership is not reported unless B<-members> is also
-+included.
-+
-+=head1 OPTIONS
-+
-+If you don't specify any options, the only thing you'll learn is the ubik
-+database epoch and version.
-+
-+=over 4
-+
-+=item B<-w>
-+
-+Write to the protection database instead of reading. Only the file
-+arguments make sense in combination with this argument.
-+
-+=item B<-user>
-+
-+When reading, display users.
-+
-+=item B<-group>
-+
-+When reading, display groups (but not necessarily members).
-+
-+=item B<-members>
-+
-+When reading, display groups and also group members.
-+
-+=item B<-name>
-+
-+When reading,
-+follow name hashes, instead of id hashes.
-+This may print different information if the database was corrupted.
-+Otherwise, it should print exactly the same information, except
-+in a different order.
-+
-+=item B<-system>
-+
-+When reading, display system data, or more precisely, do not display
-+entries with a viced <= -32768 or >= +97537.
-+
-+=item B<-xtra>
-+
-+When reading, display extra users and groups, or more precisely, do not
-+display entries that are in the range -32767...+97536 inclusive.
-+
-+=item B<-prdb> <I<prdb file>>
-+
-+Specifies the complete pathname of the file in which the Protection
-+Database resides. Provide the complete name, including the ending
-+F<.DB0>.
-+
-+=item B<-datafile> <I<data file>>
-+
-+Specify the file to which to dump (or B<-w> from which to read) textual
-+database records.
-+
-+=back
-+
-+=head1 CAUTIONS
-+
-+The file dump format does not include supergroup information, so should
-+not be used if you have and are using groups within groups.
-+
-+In all cases, entry timestamps and other information is also not
-+preserved.
-+
-+The epoch and version are reported on standard error. On little-endian
-+machines, they'll be byte swapped, so may be very random.
-+
-+=head1 EXAMPLES
-+
-+The following example shows how to initialize the database from scratch.
-+
-+Before you do this, make sure B<ptserver> is not running. If you have
-+multiple database servers, make sure F<prdb.*> does not exist on any
-+server machine.
-+
-+Now, type this in EXACTLY, including the leading space on the line
-+indicated. But do use Control-D at the end, not up-arrow D.
-+
-+ pt_util -w
-+ admin 128/20 1 -204 -204
-+ system:administrators 130/20 -204 -204 -204
-+ admin 1
-+ ^D
-+
-+You will see this:
-+
-+ # pt_util -w
-+ pt_util: /usr/afs/db/prdb.DB0: Bad UBIK_MAGIC. Is 0 should be 354545
-+ Ubik Version is: 2.0
-+ admin 128/20 1 -204 -204
-+ system:administrators 130/20 -204 -204 -204
-+ Error while creating system:administrators: Entry for id already exists
-+ admin 1
-+ pt_util: Ubik Version number changed during execution.
-+ Old Version = 2.0, new version = 33554432.0
-+ #
-+
-+To make a complete copy of the database,
-+
-+ # pt_util -user -members -datafile /tmp/out
-+
-+To load from the complete copy,
-+
-+ # pt_util -w -datafile /tmp/out
-+
-+Don't do this until you read cautions, above.
-+
-+=head1 PRIVILEGE REQUIRED
-+
-+The issuer must be logged in as the superuser C<root> on a file server
-+machine to use B<pt_util>.
-+
-+=head1 SEE ALSO
-+
-+L<prdb.DB0(5)>,
-+L<ptserver(8)>
-+
-+=head1 COPYRIGHT
-+
-+The following copyright covers this documentation:
-+
-+Copyright (c) 2005 The Regents of the University of Michigan. ALL RIGHTS
-+RESERVED.
-+
-+Permission is granted to use, copy, create derivative works and
-+redistribute this software and such derivative works for any purpose, so
-+long as the name of the University of Michigan is not used in any
-+advertising or publicity pertaining to the use or distribution of this
-+software without specific, written prior authorization. If the above
-+copyright notice or any other identification of the University of Michigan
-+is included in any copy of any portion of this software, then the
-+disclaimer below must also be included.
-+
-+This software is provided as is, without representation from the
-+University of Michigan as to its fitness for any purpose, and without
-+warranty by the University of Michigan of any kind, either express or
-+implied, including without limitation the implied warranties of
-+merchantability and fitness for a particular purpose. The regents of the
-+University of Michigan shall not be liable for any damages, including
-+special, indirect, incidental, or consequential damages, with respect to
-+any claim arising out of or in connection with the use of the software,
-+even if it has been or is hereafter advised of the possibility of such
-+damages.
-+
-+=cut
bos-permissions
compiler-flags
no-admin-reference
-amd64-syscall-probe
-des-alignment
-ka-forwarder
-kbuild-assembly
-linux-2.6.22
-linux-2.6.22.1-proc
-null-uuid-client
-null-uuid-server
-pag-cleanup-lock
ucontext-everywhere
-pt_util-man-page
paravirt-workaround
#endif /* AFS_PARAM_H */
#else /* !defined(UKERNEL) */
---- openafs.orig/src/config/param.ia64_linux24.h
-+++ openafs/src/config/param.ia64_linux24.h
-@@ -87,6 +87,7 @@
- #endif
- #endif /* KERNEL */
-
-+#define USE_UCONTEXT /* should be in afsconfig.h */
-
- #endif /* _PARAM_IA64_LINUX20_H_ */
-
-@@ -157,6 +158,7 @@
- #define CMSERVERPREF
- #endif
-
-+#define USE_UCONTEXT /* should be in afsconfig.h */
-
- #endif /* AFS_PARAM_H */
-
---- openafs.orig/src/config/param.ia64_linux26.h
-+++ openafs/src/config/param.ia64_linux26.h
-@@ -96,6 +96,7 @@
- #endif
- #endif /* KERNEL */
-
-+#define USE_UCONTEXT /* should be in afsconfig.h */
-
- #endif /* _PARAM_IA64_LINUX20_H_ */
-
-@@ -167,6 +168,7 @@
- #define CMSERVERPREF
- #endif
-
-+#define USE_UCONTEXT /* should be in afsconfig.h */
-
- #endif /* AFS_PARAM_H */
-
--- openafs.orig/src/config/param.parisc_linux24.h
+++ openafs/src/config/param.parisc_linux24.h
@@ -70,6 +70,11 @@
#endif
#endif /* KERNEL */
-+#ifdef __GLIBC__
-+#if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 3)
-+#define USE_UCONTEXT
-+#endif
-+#endif
- #endif /* AFS_PARAM_H */
-
- #else /* !defined(UKERNEL) */
---- openafs.orig/src/config/param.ppc64_linux26.h
-+++ openafs/src/config/param.ppc64_linux26.h
-@@ -76,6 +76,11 @@
- #endif
- #endif /* KERNEL */
-
-+#ifdef __GLIBC__
-+#if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 3)
-+#define USE_UCONTEXT
-+#endif
-+#endif
- #endif /* _PARAM_PPC64_LINUX20_H_ */
-
- #else /* !defined(UKERNEL) */
---- openafs.orig/src/config/param.ppc_linux26.h
-+++ openafs/src/config/param.ppc_linux26.h
-@@ -74,6 +74,11 @@
- #endif
- #endif /* KERNEL */
-
+#ifdef __GLIBC__
+#if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 3)
+#define USE_UCONTEXT
#endif /* AFS_PARAM_H */
#else /* !defined(UKERNEL) */
---- openafs.orig/src/config/param.sparc64_linux26.h
-+++ openafs/src/config/param.sparc64_linux26.h
-@@ -95,6 +95,11 @@
- #endif
- #endif
-
-+#ifdef __GLIBC__
-+#if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 3)
-+#define USE_UCONTEXT
-+#endif
-+#endif
- #endif /* _PARAM_SPARC64_LINUX26_H_ */
-
- #else /* !defined(UKERNEL) */
---- openafs.orig/src/config/param.sparc_linux24.h
-+++ openafs/src/config/param.sparc_linux24.h
-@@ -98,6 +98,11 @@
- #endif
- #endif
-
-+#ifdef __GLIBC__
-+#if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 3)
-+#define USE_UCONTEXT
-+#endif
-+#endif
- #endif /* AFS_PARAM_H */
-
- #else /* !defined(UKERNEL) */