From d5dfb9113bb6444fb46ab90ff807d40fdb6180d6 Mon Sep 17 00:00:00 2001 From: Jeffrey Hutzelman Date: Wed, 2 Jun 2004 07:15:45 +0000 Subject: [PATCH] linux-26-build-updates-20040601 FIXES 4767 use 2.6 kbuild infrastructure to build modules. updates proc mechanism. ==================== This delta was composed from multiple commits as part of the CVS->Git migration. The checkin message with each commit was inconsistent. The following are the additional commit messages. ==================== FIXES 4888 use 2.6 kbuild infrastructure to build modules. updates proc mechanism. --- src/afs/LINUX/osi_groups.c | 7 ++- src/afs/LINUX/osi_module.c | 2 +- src/config/param.i386_linux26.h | 5 -- src/libafs/MakefileProto.LINUX.in | 45 +++++++++++----- src/libafs/libafsdep | 1 + src/libafs/make_kbuild_makefile.pl | 104 +++++++++++++++++++++++++++++++++++++ 6 files changed, 141 insertions(+), 23 deletions(-) create mode 100755 src/libafs/make_kbuild_makefile.pl diff --git a/src/afs/LINUX/osi_groups.c b/src/afs/LINUX/osi_groups.c index b0000c4..dac9f3f 100644 --- a/src/afs/LINUX/osi_groups.c +++ b/src/afs/LINUX/osi_groups.c @@ -156,10 +156,9 @@ setpag(cred_t ** cr, afs_uint32 pagvalue, afs_uint32 * newpag, AFS_STATCNT(setpag); group_info = afs_getgroups(*cr); - g0 = GROUP_AT(group_info, 0); - g1 = GROUP_AT(group_info, 1); - - if (afs_get_pag_from_groups(g0, g1) == NOPAG) { + if (group_info->ngroups < 2 + || afs_get_pag_from_groups(GROUP_AT(group_info, 0), + GROUP_AT(group_info, 1)) == NOPAG) { /* We will have to make sure group_info is big enough for pag */ struct group_info *tmp; int i; diff --git a/src/afs/LINUX/osi_module.c b/src/afs/LINUX/osi_module.c index da397b3..bbbd2f0 100644 --- a/src/afs/LINUX/osi_module.c +++ b/src/afs/LINUX/osi_module.c @@ -147,7 +147,7 @@ afsproc_init() struct proc_dir_entry *entry1; openafs_procfs = proc_mkdir(PROC_FSDIRNAME, proc_root_fs); - entry1 = create_proc_entry(PROC_SYSCALL_NAME, 0, openafs_procfs); + entry1 = create_proc_entry(PROC_SYSCALL_NAME, 0666, openafs_procfs); entry1->proc_fops = &afs_syscall_fops; diff --git a/src/config/param.i386_linux26.h b/src/config/param.i386_linux26.h index 641dc8d..392c469 100644 --- a/src/config/param.i386_linux26.h +++ b/src/config/param.i386_linux26.h @@ -49,11 +49,6 @@ #define AFS_GLOBAL_SUNLOCK #endif -#if defined(MODULE) && defined(CONFIG_MODVERSIONS) -#define MODVERSIONS -#include -#endif - #endif /* __KERNEL__ && !DUMP_KERNEL */ #include diff --git a/src/libafs/MakefileProto.LINUX.in b/src/libafs/MakefileProto.LINUX.in index 67e2c46..5c8234e 100644 --- a/src/libafs/MakefileProto.LINUX.in +++ b/src/libafs/MakefileProto.LINUX.in @@ -36,8 +36,10 @@ LINUX_KERNEL_PATH=@LINUX_KERNEL_PATH@ # System specific build commands and flags -CCFLAGS = $(COMMON_KERN_CFLAGS) @P5PLUS_KOPTS@ -I../mach -DEFINES = $(COMMON_DEFINES) -DCPU=586 -DKBUILD_BASENAME=libafs_$(subst .,_,$(subst -,_,${CLIENT})) -DKBUILD_MODNAME=libafs_$(subst .,_,$(subst -,_,${CLIENT})) +# All the platform-specific and kernel-related things are provided by +# the kernel build system. So we should _not_ use COMMON_KERN_CFLAGS! +CCFLAGS = -Wno-strict-prototypes +DEFINES = $(COMMON_DEFINES) CCFLAGS = $(COMMON_KERN_CFLAGS) @P5PLUS_KOPTS@ @@ -86,7 +88,8 @@ CCFLAGS = $(COMMON_KERN_CFLAGS) -ffixed-r13 -mfixed-range=f10-f15,f32-f127 -fali DEFINES = $(COMMON_DEFINES) -INCLUDES = -I. -I../ -I${TOP_OBJDIR}/src/config +INCLUDES = -I. -I../ -I${TOP_OBJDIR}/src/config \ + -I${TOP_SRCDIR}/rx -I${TOP_SRCDIR}/rxstat CFLAGS = $(CCFLAGS) $(DEFINES) $(INCLUDES) @@ -101,6 +104,12 @@ DESTDIRS=linux_destdirs include Makefile.common + +LINUX_MODULE_EXT=ko + +LINUX_MODULE_EXT=o + + LINUX_MODULE_NAME= LOCAL_SMP_DEF= @@ -110,7 +119,7 @@ setup: for m in ${MPS} ; do \ KDIR=$(KOBJ)-${LINUX_VERSION}${LINUX_MODULE_NAME}-$$m; \ mkdir -p $${KDIR}; \ - ln -fs ../Makefile $${KDIR}/Makefile ; \ + ln -fs ../Makefile $${KDIR}/Makefile.afs ; \ ln -fs ../Makefile.common $${KDIR}/Makefile.common; \ ln -fs ../config $${KDIR}/config; \ done @@ -135,7 +144,7 @@ ${COMPDIRS} ${INSTDIRS} ${DESTDIRS}: ln -fs ${LINUX_KERNEL_PATH}/include/asm-parisc asm ln -fs ${LINUX_KERNEL_PATH}/include/asm-alpha asm - + ln -fs ${LINUX_KERNEL_PATH}/include/asm-i386 asm ln -fs ${LINUX_KERNEL_PATH}/include/asm-um asm @@ -153,9 +162,6 @@ ${COMPDIRS} ${INSTDIRS} ${DESTDIRS}: ln -fs ${LINUX_KERNEL_PATH}/include/asm-sparc64 asm ln -fs ${LINUX_KERNEL_PATH}/include/asm-ia64 asm - - $(RM) -f mach - ln -fs ${LINUX_KERNEL_PATH}/include/asm-i386/mach-default mach for m in ${MPS} ; do \ KDIR=${KOBJ}-${LINUX_VERSION}${LINUX_MODULE_NAME}-$$m ; \ @@ -174,8 +180,9 @@ ${COMPDIRS} ${INSTDIRS} ${DESTDIRS}: TARG=libafs ; \ fi ; \ cd $${KDIR} ; \ - $(MAKE) SMP_DEF="$${SMP_DEF}" $@_$${TARG} CLIENT=${LINUX_VERSION}${LINUX_MODULE_NAME} || exit $$?; \ + $(MAKE) -f Makefile.afs SMP_DEF="$${SMP_DEF}" $@_$${TARG} CLIENT=${LINUX_VERSION}${LINUX_MODULE_NAME} KDIR=$${KDIR} || exit $$?; \ cd ../ ; \ + done linux_compdirs_libafs: depsrcs libafs @@ -194,10 +201,10 @@ linux_destdirs_libafs.bm: dest_libafs.bm # Below this line are targets when in the COMMON directory: # For Linux there is no kernel NFS server. -LIBAFS = libafs-${CLIENT}.o -LIBAFS_MP = libafs-${CLIENT}.mp.o -LIBAFS_EP = libafs-${CLIENT}.ep.o -LIBAFS_BM = libafs-${CLIENT}.bm.o +LIBAFS = libafs-${CLIENT}.${LINUX_MODULE_EXT} +LIBAFS_MP = libafs-${CLIENT}.mp.${LINUX_MODULE_EXT} +LIBAFS_EP = libafs-${CLIENT}.ep.${LINUX_MODULE_EXT} +LIBAFS_BM = libafs-${CLIENT}.bm.${LINUX_MODULE_EXT} INST_LIBAFS = ${DESTDIR}${afskerneldir}/${LIBAFS} INST_LIBAFS_MP = ${DESTDIR}${afskerneldir}/${LIBAFS_MP} @@ -222,6 +229,17 @@ libafs.ep: $(LIBAFS_EP) libafs.bm: $(LIBAFS_BM) echo BM Build Complete + +${LIBAFS} ${LIBAFS_MP} ${LIBAFS_EP} ${LIBAFS_BM}: libafs.ko + cp libafs.ko $@ + +.FORCE: +libafs.ko: .FORCE + ../make_kbuild_makefile.pl ${KDIR} $@ \ + @TOP_OBJDIR@/src/config/Makefile.config Makefile.afs Makefile.common + $(MAKE) -C ${LINUX_KERNEL_PATH} M=@TOP_OBJDIR@/src/libafs/${KDIR} modules + + ${LIBAFS}: $(AFSAOBJS) $(AFSNONFSOBJS) $(RM) -f $@ $(LD) -r -o $@ $(AFSAOBJS) $(AFSNONFSOBJS) @@ -237,6 +255,7 @@ ${LIBAFS_EP}: $(AFSAOBJS) $(AFSNONFSOBJS) ${LIBAFS_BM}: $(AFSAOBJS) $(AFSNONFSOBJS) $(RM) -f $@ $(LD) -r -o $@ $(AFSAOBJS) $(AFSNONFSOBJS) + install_libafs: $(INST_LIBAFS) echo SP Install Complete diff --git a/src/libafs/libafsdep b/src/libafs/libafsdep index 3355afa..47cb2ee 100644 --- a/src/libafs/libafsdep +++ b/src/libafs/libafsdep @@ -6,3 +6,4 @@ afs.startup redhat.sh sgi_master sgi_system +make_kbuild_makefile.pl diff --git a/src/libafs/make_kbuild_makefile.pl b/src/libafs/make_kbuild_makefile.pl new file mode 100755 index 0000000..03584cc --- /dev/null +++ b/src/libafs/make_kbuild_makefile.pl @@ -0,0 +1,104 @@ +#!/usr/bin/perl +# make_kbuild_makefile.pl +# Generate a Makefile for use with the Linux 2.6+ kernel build system +# +# Usage: make_kbuild_makefile.pl ${KDIR} ${TARG} Makefiles... +# +# The specified makefiles will be scanned for variable values +# The module ${TARG} will be built in ${TOP_SRCDIR}/src/libafs/${KDIR}. +# It will include objects listed in ${AFSAOBJS} and ${AFSNONFSOBJS} +# Appropriate source files for each object will be symlinked into ${KDIR} +# EXTRA_CFLAGS will be set to ${CFLAGS} ${COMMON_INCLUDE} + +# Produces ${KDIR}/Makefile, suitable for use with kbuild + +use IO::File; + + +if (@ARGV < 3) { + die "Usage: echo objects... | $0 KDIR TARG Makefiles...\n"; +} + +($KDIR, $TARG, @Makefiles) = @ARGV; +$TARG =~ s/\.k?o$//; + +## Read in all of the Makefiles given on the command line +## Our ultimate goal is to find the correct source file for each object. +## We make the following assumptions: +## - Every variable is defined before it is used. +## - Each of our objects has exactly one dependency, which is the name +## of the source file that needs to be symlinked into $KDIR +foreach $mf (@Makefiles) { + $F = new IO::File($mf, O_RDONLY) or die "$mf: $!\n"; + $text = ''; + while (<$F>) { + chomp; + $text .= $_; + next if $text =~ s/\\$/ /; ## Continuation + if ($text =~ /^#/) { $text = ''; next } ## Comment + #print STDERR "<< $text\n"; + + $text =~ s/\$\((\w+)\)/$vars{$1}/g; # Substitute variables + $text =~ s/\$\{(\w+)\}/$vars{$1}/g; + #print STDERR ">> $text\n"; + + if ($text =~ /^\s*(\S+)\s*=/) { ## Variable definition + ($key, $value) = ($1, $'); + $value =~ s/^\s*//; # Remove leading and + $value =~ s/\s*$//; # trailing whitespace + $vars{$key} = $value; # Store it + } + elsif ($text =~ /^(\S+\.o):\s*(\S+\.c)/) { ## Dependency + $deps{$1} = $2; + } + $text = ''; + } + $F->close(); +} + + +$KDIR = "$vars{TOP_OBJDIR}/src/libafs/$KDIR"; +@objects = (split(' ', $vars{AFSAOBJS}), split(' ', $vars{AFSNONFSOBJS})); + +$MV = new IO::File("$vars{TOP_OBJDIR}/src/config/Makefile.version", O_RDONLY) + or die "$vars{TOP_OBJDIR}/src/config/Makefile.version: $!\n"; +while (<$MV>) { + s#AFS_component_version_number#$KDIR/AFS_component_version_number#g; + $MakefileVersion .= $_; +} +$MV->close(); + +if (! -d $KDIR) { + mkdir($KDIR, 0777) or die "$KDIR: $!\n"; +} + + +foreach (@objects) { + ($src = $_) =~ s/\.o$/.c/; + die "No source known for $_\n" unless exists $deps{$_}; + if (-e "$KDIR/$src" || -l "$KDIR/$src") { + unlink("$KDIR/$src") or die "$KDIR/$src: $!\n"; + } + next unless $deps{$_} =~ m#/#; + symlink($deps{$_}, "$KDIR/$src") or die "$KDIR/$src: $!\n"; +} + +foreach $src (qw(h sys netinet)) { + if (-e "$KDIR/$src" || -l "$KDIR/$src") { + unlink("$KDIR/$src") or die "$KDIR/$src: $!\n"; + } + symlink("$vars{LINUX_KERNEL_PATH}/include/linux", "$KDIR/$src") + or die "$KDIR/$src: $!\n"; +} + +$cflags = "$vars{CFLAGS} $vars{COMMON_INCLUDE}"; +$cflags =~ s#-I(?!/)#-I$KDIR/#g; +$cflags =~ s/\s+/ \\\n /g; +$F = new IO::File("$KDIR/Makefile", O_WRONLY|O_CREAT|O_TRUNC, 0666) + or die "$KDIR/Makefile: $!\n"; +print $F "EXTRA_CFLAGS=$cflags\n"; +print $F "obj-m := $TARG.o\n"; +print $F "$TARG-objs := ", join("\\\n $_", @objects), "\n"; +print $F "\n$MakefileVersion\n"; +$F->close() or die "$KDIR/Makefile: $!\n"; + -- 1.9.4