This patch make kdump work on ia64_linux26. It is nice to find out more 
about kernel structures ;-).

Summary:
  * src/venus/Makefile 
    changes to install kdump binary as kdump-<kernelversion>
    Old version overwrites kdump script with binary.
  * src/venus/kdump.c
    - let CPP overwrite flock64 with flock for IA64
    - int is 4 bytes on ia64 so I use long instead for address calculation
      and to read kernel structures

comment:
  It works only on ia64_linux26 but not on {i386,amd64}_linux26.

best regards,
  mike 
diff -u -r -N openafs-1.3.76.orig/src/venus/Makefile.in 
openafs-1.3.76/src/venus/Makefile.in
--- openafs-1.3.76.orig/src/venus/Makefile.in   2004-06-24 19:38:37.000000000 
+0200
+++ openafs-1.3.76/src/venus/Makefile.in        2004-12-16 14:25:47.000000000 
+0100
@@ -286,7 +286,7 @@
                ${INSTALL} -s kdump-alpha_linux-${LINUX_VERSION} $@ ;; \
        *linux* ) \
                ${INSTALLex} -f ${srcdir}/kdump.sh.linux ${DEST}/etc/kdump; \
-               ${INSTALL} -s kdump-linux-${LINUX_VERSION} $@ ;; \
+               ${INSTALL} -s kdump-linux-${LINUX_VERSION} [EMAIL PROTECTED] ;; 
\
        hp_ux11* ) \
                ${INSTALLex} -f ${srcdir}/kdump.sh.hp_ux11 ${DEST}/etc/kdump; \
                ${INSTALL} -s -f $? $@;; \
diff -u -r -N openafs-1.3.76.orig/src/venus/kdump.c 
openafs-1.3.76/src/venus/kdump.c
--- openafs-1.3.76.orig/src/venus/kdump.c       2004-07-13 07:49:54.000000000 
+0200
+++ openafs-1.3.76/src/venus/kdump.c    2004-12-16 14:26:31.000000000 +0100
@@ -244,7 +244,9 @@
 #else
 #include "sys/vfs.h"
 #ifdef AFS_LINUX20_ENV
+#ifndef UIO_MAXIOV
 #define UIO_MAXIOV 1           /* don't care */
+#endif
 #if __GLIBC_MINOR__ == 0
 #include <iovec.h>
 #endif
@@ -257,6 +259,9 @@
 #undef ULONG_MAX
 #define _LINUX_TIME_H
 #define _LINUX_FCNTL_H
+#ifdef AFS_IA64_LINUX24_ENV
+#define flock64  flock
+#endif /* AFS_IA64_LINUX24_ENV */
 #ifdef AFS_S390_LINUX20_ENV
 #define _S390_STATFS_H
 #else
@@ -294,6 +299,16 @@
 #define timer_t ktimer_t
 #define timer_t_redefined
 #endif
+#ifdef AFS_LINUX26_ENV
+/* For some reason, this doesn't get defined in linux/types.h
+   if __KERNEL_STRICT_NAMES is defined. But the definition of
+   struct inode uses it.
+*/
+#ifndef HAVE_SECTOR_T
+/* got it from linux/types.h */
+typedef unsigned long sector_t;
+#endif /* HAVE_SECTOR_T */
+#endif /* AFS_LINUX26_ENV */
 #include <linux/version.h>
 #include <linux/fs.h>
 #include <osi_vfs.h>
@@ -647,7 +662,11 @@
 #define MAXNAMELEN 64
 typedef struct symlist {
     char s_name[MAXNAMELEN];
+#ifdef AFS_LINUX_64BIT_KERNEL
+    unsigned long s_value;
+#else
     int s_value;
+#endif /* AFS_LINUX_64BIT_KERNEL */
 } symlist_t;
 
 #define KSYM_ALLOC_STEP 128
@@ -701,7 +720,11 @@
                exit(1);
            }
        }
+#ifdef AFS_LINUX_64BIT_KERNEL
+       ksyms[nksyms].s_value = (unsigned long)strtoul(line, &p, 16);
+#else
        ksyms[nksyms].s_value = (int)strtoul(line, &p, 16);
+#endif /* AFS_LINUX_64BIT_KERNEL */
        p++;
 #ifdef AFS_LINUX26_ENV
        /* Linux 2.6 /proc/kallsyms has a one-char symbol type
@@ -728,7 +751,11 @@
 
 
 /* find_symbol returns 0 if not found, otherwise value for symbol */
+#ifdef AFS_LINUX_64BIT_KERNEL
+unsigned long
+#else
 int
+#endif /* AFS_LINUX_64BIT_KERNEL */
 find_symbol(char *name)
 {
     symlist_t *tmp;
@@ -1906,7 +1933,11 @@
     findsym("afs_linux_memlist", &symoff);
     kread(kmem, symoff, (char *)&memp, sizeof memp);
     if (memp) {
+#ifdef AFS_LINUX_64BIT_KERNEL
+       kread(kmem, (unsigned long)memp, (char *)&next, sizeof next);
+#else
        kread(kmem, (int)memp, (char *)&next, sizeof next);
+#endif /* AFS_LINUX_64BIT_KERNEL */
     } else {
        memset(&next, 0, sizeof next);
     }

Reply via email to