+ local invariable=$1
+ [ "$invariable" = "" ] && return 255
+ local invariableint=$( echo $invariable | sed -e s/[^0-9]//g )
+ [ "$invariable" = "$invariableint" ] || return 255
+}
+
+#generate LUSTRE_EXTRA_VERSION from EXTRA_VERSION
+gen_lustre_version()
+{
+ local smptype=smp
+ [ "$KERNCONFSMPTYPE" = "" ] || smptype=$KERNCONFSMPTYPE
+ [ "$RPMSMPTYPE" = "" ] || smptype=$RPMSMPTYPE
+
+ LUSTRE_EXTRA_VERSION="${lnxmaj}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_DELIMITER}${smptype}"
+ LUSTRE_EXTRA_VERSION=${LUSTRE_EXTRA_VERSION//-/_}
+}
+
+#store RPMs and/or BUILD dir for future reuse
+store_for_reuse()
+{
+ local rpmonly=$1
+ if [ ! "$REUSEBUILD" = "" ] && [ -d "/$REUSEBUILD/" ] ; then
+ [ -d "${REUSEBUILD}/${TIMESTAMP}" ] || mkdir "${REUSEBUILD}/${TIMESTAMP}"
+ [ -d "${REUSEBUILD}/${TIMESTAMP}" ] || return 255
+ else
+ return 255
+ fi
+
+ local lnxrelnew=${lnxrel//-/_}
+ local EXTRA_VERSIONnew=${EXTRA_VERSION//-/_}
+ local KERNELRPMnew=$(basename "$KERNELRPM")
+ if [ ! "$rpmonly" = "rpmonly" ]; then
+ local builddir=
+ if [ ! "$KERNELCOMPILEDIR" = "" ]; then
+ builddir="$KERNELCOMPILEDIR"
+ else
+ builddir="BUILD/lustre-kernel-${lnxmaj}/lustre/linux-${lnxmaj}"
+ [ "$KERNELCOMPILEDIR" = "" ] || builddir="$KERNELCOMPILEDIR"
+ [ -d "$builddir" ] || builddir="BUILD/lustre-kernel-${lnxmaj}/lustre/linux-${lnxmaj}.${lnxrel}"
+ [ -d "$builddir" ] || builddir="BUILD/lustre-kernel-${lnxmaj}/lustre/linux-${lnxmaj}-${lnxrel}"
+ if [ ! -d "$builddir" ]; then
+ pushd "BUILD/lustre-kernel-${lnxmaj}/lustre/" || return 255
+ local basebuilddir=$(ls -d linux-${lnxmaj}* | head -1)
+ [ "$basebuilddir" = "" ] || builddir="BUILD/lustre-kernel-${lnxmaj}/lustre/${basebuilddir}"
+ popd
+ fi
+ fi
+ [ -d "$builddir" ] || return 255
+ local dstdir="${REUSEBUILD}/${TIMESTAMP}/linux-${KERNCONFSMPTYPE}-${lnxmaj}-${EXTRA_VERSIONnew}.${TARGET_ARCH}"
+ ( $PATCHLESS ) && dstdir="${REUSEBUILD}/${TIMESTAMP}/linux-$KERNELRPMnew" && \
+ dstdir="${dstdir%.rpm}"
+ [ -d "$dstdir" ] && rm -rf "$dstdir"
+ mv "${builddir}" "$dstdir" || return 255
+ if [ -n "$OFED_VERSION" ]; then
+ # move the OFED kernel-ib-devel tree as well
+ mv "${builddir%/*}/kernel-ib-devel/usr/src/ofa_kernel" "${dstdir%/*}" || return 255
+ fi
+ fi
+ #store kernel rpm
+ local kernelrpmname="kernel-lustre-${KERNCONFSMPTYPE}-${lnxmaj}-${EXTRA_VERSIONnew}.${TARGET_ARCH}.rpm"
+ [ -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" ] || kernelrpmname="kernel-${KERNCONFSMPTYPE}-${lnxmaj}-${EXTRA_VERSNnew}.${TARGET_ARCH}.rpm"
+ ( $PATCHLESS ) && [ -f "$KERNELRPM" ] && kernelrpmname="$KERNELRPMnew"
+ if [ "$rpmonly" = "rpmonly" ] && [ -f "${REUSEBUILD}/${TIMESTAMP}/${kernelrpmname}" ]; then
+ echo "RPM already exist in store directory tree"
+ else
+ [ -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" ] && cp -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" "${REUSEBUILD}/${TIMESTAMP}/"
+ fi
+ #store kernel source rpm
+ kernelrpmname="kernel-lustre-source-${lnxmaj}-${EXTRA_VERSIONnew}.${TARGET_ARCH}.rpm"
+ [ -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" ] || kernelrpmname="kernel-source-${lnxmaj}-${EXTRA_VERSIONnew}.${TARGET_ARCH}.rpm"
+ ( $PATCHLESS ) && [ -f "$KERNELSOURCERPM" ] && kernelrpmname=$(basename "$KERNELSOURCERPM")
+ if [ "$rpmonly" = "rpmonly" ] && [ -f "${REUSEBUILD}/${TIMESTAMP}/${kernelrpmname}" ]; then
+ echo "RPM already exist in store directory tree"
+ else
+ [ -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" ] && cp -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" "${REUSEBUILD}/${TIMESTAMP}/"
+ fi
+ if [ -n "$OFED_VERSION" ]; then
+ # store kernel-ib RPMs
+ local rpmname
+ for rpmname in "kernel-ib" "kernel-ib-devel"; do
+ rpmname="${rpmname}-${OFED_VERSION}"
+ if $PATCHLESS; then
+ rpmname="${rpmname}-${LINUXRELEASE//-/_}"
+ else
+ rpmname="${rpmname}-${lnxmaj}${EXTRA_VERSION_DELIMITER//-/_}${EXTRA_VERSIONnew}${TARGET_DELIMITER//-/_}${KERNCONFSMPTYPE}"
+ fi
+ rpmname="${rpmname}.${TARGET_ARCH}.rpm"
+ if [ "$rpmonly" = "rpmonly" ] && [ -f "${REUSEBUILD}/${TIMESTAMP}/${rpmname}" ]; then
+ echo "RPM already exist in store directory tree"
+ else
+ [ -f "RPMS/${TARGET_ARCH}/${rpmname}" ] && cp -f "RPMS/${TARGET_ARCH}/${rpmname}" "${REUSEBUILD}/${TIMESTAMP}/"
+ fi
+ done
+ fi
+}
+
+set_rpm_smp_type()
+{
+ local infact_arch=${TARGET_ARCH}
+ RPMSMPTYPE=default
+ [ "$infact_arch" == "i586" ] && infact_arch="i686"
+ for smp_type in $SMP_ARCHS; do
+ [ $infact_arch == $smp_type ] && RPMSMPTYPE=smp && break
+ done
+ for smp_type in $BIGSMP_ARCHS; do
+ [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
+ done
+}
+
+#unpack kernel(/source/devel) RPM
+unpack_linux_rpm()
+{
+ local prefix=$1
+ local delimiter=${2:-"-"}
+ local pathtorpms="${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
+ local kernelbinaryrpm=
+ [ -d $pathtorpms ] || return 255
+ local rpmfile=
+ local wanted_kernel="${lnxmaj}${delimiter}${lnxrel}"
+ for arch in $TARGET_ARCHS_ALL; do
+ for rpm in ${pathtorpms}/${arch}/*.rpm; do
+ local provides=$(rpm -q --provides -p $rpm)
+ if (echo $provides | grep -q "kernel${prefix} = $wanted_kernel"); then
+ KERNELRPM=$rpm
+ fi
+ done
+ [ -f "$KERNELRPM" ] && TARGET_ARCH="$arch" && BUILD_ARCHS="$arch" && break
+ done
+
+ # bleah
+ set_rpm_smp_type
+
+ [ -f "$KERNELRPM" ] || return 255
+ [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused
+ pushd $TOPDIR/reused || return 255
+ RC=0
+ rpm2cpio < "$KERNELRPM" | cpio -idc > /dev/null 2>&1
+ if [ ${PIPESTATUS[0]} -eq 0 ]; then
+ # RHEL-style and SLES-style rpms
+ local paths="kernels/${lnxmaj}${delimiter}${lnxrel}-${TARGET_ARCH} linux-${lnxmaj}${delimiter}${lnxrel}"
+
+ for path in $paths; do
+ local src='usr/src'
+
+ if [ -d "$src/$path/" ]; then
+ LINUX="$(pwd)/$src/$path"
+ fi
+ # SLES has a separate -obj tree
+ if [ -d "$src/${path}-obj" ]; then
+ src="$src/${path}-obj"
+ local objects="$TARGET_ARCH/$RPMSMPTYPE"
+
+ # Novell, are you *TRYING* to make life hard for me?
+ if [ -d "$src/powerpc" ]; then
+ objects="powerpc/$TARGET_ARCH"
+ elif [ $TARGET_ARCH == 'i686' ]; then
+ objects="i386/$RPMSMPTYPE"
+ fi
+
+ LINUXOBJ="$(pwd)/$src/$objects"
+ fi
+ done
+ if [ -z "$LINUX" ]; then
+ RC=255
+ else
+ # dig out the release version
+ local LINUXRELEASEHEADER=version.h
+ if test -s ${LINUXOBJ:-$LINUX}/include/linux/utsrelease.h ; then
+ LINUXRELEASEHEADER=utsrelease.h
+ fi
+ LINUXRELEASE=$(sed -ne 's/#define UTS_RELEASE "\(.*\)"$/\1/p' ${LINUXOBJ:-$LINUX}/include/linux/$LINUXRELEASEHEADER)
+ if [ -z "$LINUXRELEASE" ]; then
+ echo "Failed to find linux release in ${LINUXOBJ:-$LINUX}/include/linux/$LINUXRELEASEHEADER"
+ RC=255
+ fi
+ fi
+ else
+ RC=255
+ fi
+ popd
+ return $RC
+}
+
+#look for kernel source RPM
+find_linux_source_rpm()
+{
+ local rpmfile=
+ local findarch=true
+ local arch=
+ local pathtorpms=
+ [ ! "$TARGET_ARCH" = "" ] && arch=$TARGET_ARCH && findarch=false
+
+ if ! $findarch; then
+ pathtorpms="${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}/${arch}"
+ [ -d $pathtorpms ] || return 255
+ case "$DISTRO" in
+ rhel4)
+ rpmfile="kernel-${lnxmaj}-${lnxrel}.src.rpm"
+ ;;
+ sles10)
+ rpmfile="kernel-source-${lnxmaj}.${lnxrel}.${arch}.rpm"
+ ;;
+ *)
+ rpmfile="kernel-source-${lnxmaj}-${lnxrel}.${arch}.rpm"
+ ;;
+ esac
+ [ -f "${pathtorpms}/${rpmfile}" ] || return 255
+ KERNELSOURCERPM="${pathtorpms}/${rpmfile}"
+ else
+ for arch in $TARGET_ARCHS_ALL; do
+ pathtorpms="${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}/${arch}"
+ [ -d $pathtorpms ] || continue
+ case "$DISTRO" in
+ rhel4)
+ rpmfile="kernel-${lnxmaj}-${lnxrel}.src.rpm"
+ ;;
+ sles10)
+ rpmfile="kernel-source-${lnxmaj}.${lnxrel}.${arch}.rpm"
+ ;;
+ *)
+ rpmfile="kernel-source-${lnxmaj}-${lnxrel}.${arch}.rpm"
+ ;;
+ esac
+ [ -f "${pathtorpms}/${rpmfile}" ] || continue
+ KERNELSOURCERPM="${pathtorpms}/${rpmfile}"
+ TARGET_ARCH=${arch}
+ break
+ done
+ fi
+ [ -f "${KERNELSOURCERPM}" ] || return 255
+}
+
+#unpack and make symlinks for reusing kernel RPM
+reuse_kernel_rpm()
+{
+ local pathtorpm=$1
+ local pathtokernelibrpm=$2
+ [ "$pathtorpm" = "" ] && return 255
+ [ -f "$pathtorpm" ] || return 255
+ [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused
+ pushd $TOPDIR/reused || return 255
+
+ rpm2cpio < $pathtorpm | cpio -idc
+ [ ${PIPESTATUS[0]} -eq 0 ] || return 255
+
+ if [ -n "$pathtokernelibrpm" ] && [ -f "$pathtokernelibrpm" ]; then
+ rpm2cpio < $pathtokernelibrpm | cpio -idc
+ [ ${PIPESTATUS[0]} -eq 0 -o ${PIPESTATUS[1]} -eq 0 ] || return 255
+ CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
+ fi
+
+ local smptype=
+ if pushd usr/src/linux-*-obj/${TARGET_ARCH}; then
+ local smptypes="$SMPTYPES"
+ [ "$RPMSMPTYPE" = "" ] || smptypes=$RPMSMPTYPE
+ ( ! $PATCHLESS ) && [ ! "$KERNCONFSMPTYPE" = "" ] && smptypes="$KERNCONFSMPTYPE"
+ local cursmptype=
+ for cursmptype in $smptypes; do
+ [ "$cursmptype" = "''" ] && continue
+ [ -d $cursmptype ] && smptype=$cursmptype
+ [ -d $smptype ] && break
+ done
+ popd
+ fi
+ if [ "${smptype}" = "" ]; then
+ popd
+ return 255 # cannot detect smp type
+ fi
+ if pushd usr/src/linux-*-obj/${TARGET_ARCH}/$smptype/include2; then
+ local base=$(readlink asm)
+ if [ ! -d "/${base}/" ]; then
+ rm -f asm
+ base=$(basename "$base")
+ if pushd ../../../../linux-*/include; then
+ local lsrc=$(pwd)
+ popd
+ [ -d "$lsrc/${base}" ] && ln -s $lsrc/${base} asm
+ fi
+ fi
+ popd
+ read a b < <(echo $(pwd)/usr/src/linux-*)
+ if [[ $a == $(pwd)/* && $b = $(pwd)/* ]]; then
+ cp -f $a/include/linux/config.h $b/${TARGET_ARCH}/$smptype/include/linux/
+ cp $b/${TARGET_ARCH}/$smptype/.config $a/
+ [ -f "$b/${TARGET_ARCH}/$smptype/.config" ] && KERNELRPMCONFIG="$b/${TARGET_ARCH}/$smptype/.config"
+ cp $b/${TARGET_ARCH}/$smptype/.kernelrelease $a/
+ [ -f "$b/${TARGET_ARCH}/$smptype/.kernelrelease" ] && KERNELRPMRELEASE="$b/${TARGET_ARCH}/$smptype/.kernelrelease"
+ LINUX=$a
+ LINUXOBJ=$b/${TARGET_ARCH}/$smptype
+# local fname=$(basename $kernel_rpm)
+# KERNELRPMSDIR=${kernel_rpm%$fname}
+ fi
+ fi
+ popd
+ [ "$LINUX" = "" ] && return 255
+ [ -d "$LINUX" ] || return 255
+}
+
+#build linux kernel rpm
+build_linux_rpm()
+{
+ pushd $LINUX || return 255
+ make binrpm-pkg || ( popd ; return 255 )
+ local addlnxrel=
+ [ -f ".version" ] && addlnxrel="-$(cat .version)"
+ popd
+ local arch=
+ for arch in $TARGET_ARCHS_ALL; do
+ [ -f "/usr/src/rpm/RPMS/$arch/kernel-$lnxmaj.${lnxrel}${addlnxrel}.$arch.rpm" ] && \
+ KERNELRPM="/usr/src/rpm/RPMS/$arch/kernel-$lnxmaj.${lnxrel}${addlnxrel}.$arch.rpm" && \
+ TARGET_ARCH="$arch"
+ [ -f "/usr/src/packages/RPMS/$arch/kernel-$lnxmaj.${lnxrel}${addlnxrel}.$arch.rpm" ] && \
+ KERNELRPM="/usr/src/packages/RPMS/$arch/kernel-$lnxmaj.${lnxrel}${addlnxrel}.$arch.rpm" && \
+ TARGET_ARCH="$arch"
+ done
+ [ "$KERNELRPM" = "" ] || return
+ return 255
+}
+
+#build linux kernel
+build_linux()
+{
+ local nofullmake=$1
+ local nocopykernel=$2
+ pushd $LINUX || fatal 1 "Kernel source not found"
+ [ "$nofullmake" = "nofullmake" ] || make mrproper
+ [ "$nofullmake" = "nofullmake" ] || rm -f rpm-release
+# [ "$nocopykernel" = "copyrpmkernel" ] || rm -f localversion-*
+ [ "$nocopykernel" = "copykernel" ] && [ -f "$CONFIG_FILE" ] && cp $CONFIG_FILE .config
+ if [ "$nocopykernel" = "copyrpmkernel" ]; then
+ [ -f "$KERNELRPMCONFIG" ] && cp $KERNELRPMCONFIG .config
+ if [ -f "$KERNELRPMRELEASE" ]; then
+ cp $KERNELRPMRELEASE .
+ else
+ sed -e "s/^EXTRAVERSION\s\+=\s\+.*$/EXTRAVERSION = -${lnxrel}/" < Makefile > Makefile.new
+ [ -f "Makefile.new" ] && mv Makefile.new Makefile
+ fi
+ fi
+ [ -f ".config" ] || ( popd ; echo "Cannot find .config file"; return 255 )
+ make oldconfig || ( popd ; return 255 )
+ make include/linux/version.h
+ if [ ! "$nofullmake" = "nofullmake" ]; then
+ make || ( popd ; return 255 )
+ fi
+ popd
+ return
+}
+
+build_kernel_ib()
+{
+ # build kernel-ib{,-devel}
+ # some I/B drivers are architecture dependent and kernel-ib's configure
+ # does not figure it out for us ~sigh~
+ local configure_options=""
+ case "$TARGET_ARCH" in
+ x86_64 | ia64)
+ configure_options="--with-ipath_inf-mod"
+ ;;
+ ppc64)
+ configure_options="--with-ipath_inf-mod --with-ehca-mod"
+ ;;
+ esac
+ local K_SRC="K_SRC"
+ # ofed 1.3 had a bug in the rpm spec
+ if [ "$OFED_VERSION" = "1.3" ]; then
+ K_SRC="KSRC"
+ fi
+ $RPMBUILD --rebuild --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
+ --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
+ --define "KVERSION ${LINUXRELEASE}" \
+ --define "$K_SRC ${LINUXOBJ:-${LINUX}}" \
+ --define "LIB_MOD_DIR /lib/modules/${LINUXRELEASE}/updates" \
+ --define "configure_options --without-quilt --with-core-mod --with-user_mad-mod --with-user_access-mod --with-addr_trans-mod --with-srp-target-mod --with-core-mod --with-mthca-mod --with-mlx4-mod --with-cxgb3-mod --with-nes-mod --with-ipoib-mod --with-sdp-mod --with-srp-mod --without-srp-target-mod --with-rds-mod --with-iser-mod --with-qlgc_vnic-mod --with-madeye-mod $configure_options" ${TOPDIR}/OFED/SRPMS/ofa_kernel-${OFED_VERSION}-ofed${OFED_VERSION}.src.rpm
+
+ if [ ${PIPESTATUS[0]} != 0 ]; then
+ fatal 1 "Error building kernel-ib"
+ fi
+
+ pushd "$TOPDIR" >/dev/null
+ rm -rf kernel-ib-devel
+ mkdir kernel-ib-devel
+ cd kernel-ib-devel
+ local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${OFED_VERSION}-${LINUXRELEASE//-/_}.*.rpm)
+ rpm2cpio -itv < $rpm | cpio -id
+ CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
+ popd >/dev/null
+}
+
+#build patchless lustre
+patchless_build_sequence()
+{
+ #try to build from kernel-devel RPM (RHEL)
+ LINUX=
+ TARGET_ARCH=
+ local rpmfound=false
+ local buildsuccess=false
+ local storeforreuse=false
+ if [ "$KERNELRPMSBASE" = "" ] || [ ! -d "$KERNELRPMSBASE" ]; then
+ return 255
+ fi
+ [ -d $TOPDIR/reused ] && rm -rf $TOPDIR/reused
+
+ local delimiter=${EXTRA_VERSION_DELIMITER:-"-"}
+ # default to source type -source and special case below
+ local type=-source
+ case "$DISTRO" in
+ rhel*)
+ type=-devel
+ ;;
+ esac
+
+ unpack_linux_rpm $type $delimiter && rpmfound=true
+
+ [ -d SRPMS ] || mkdir SRPMS
+ [ -d RPMS ] || mkdir RPMS
+ [ -d BUILD ] || mkdir BUILD
+ [ -d SOURCES ] || mkdir SOURCES
+
+ # first build kernel-ib
+ if [ -n "$OFED_VERSION" ]; then
+ $rpmfound && build_kernel_ib
+ fi
+ ( $rpmfound ) && build_lustre && buildsuccess=true && find_linux_source_rpm
+
+ if $buildsuccess; then
+ [ -d "RPMS/${TARGET_ARCH}" ] && [ -f "$KERNELRPM" ] && \
+ cp "$KERNELRPM" RPMS/${TARGET_ARCH}/
+ [ -d "RPMS/${TARGET_ARCH}" ] && [ -f "$KERNELSOURCERPM" ] && \
+ cp "$KERNELSOURCERPM" RPMS/${TARGET_ARCH}/
+ KERNELCOMPILEDIR="$LINUX"
+ if $storeforreuse; then
+ store_for_reuse || echo "Cannot store for future reuse"
+ fi
+
+ return
+ elif ! $rpmfound; then
+ echo "COULD NOT FIND VENDOR -devel or -source RPM for $DISTRO/$TARGET_ARCH: $lnxmaj-$lnxrel in $KERNELRPMSBASE"
+ return 255
+ else
+ echo "Patchless build failed."
+ return 255
+ fi
+}
+
+#check timestamp value. should bi 14-digits string
+check_timestamp()
+{
+ local invalue=$1
+ local timestampnodig=$(echo $invalue | sed -e s/[0-9]*//g)
+ [ "$timestampnodig" = "" ] || return 255
+ local timestamplength="${#invalue}"
+ [ $timestamplength -eq 14 ] || return 255
+}
+
+# get list of suitable directories with potential reused staff
+get_reuse_dir_list()
+{
+ local rpmonly=$1
+ local reusedkernelmasknew=$2
+ local buildtimestamp=
+ local dirsforreuse=
+ local sourcelastdate=$(get_last_source_date)
+ for buildtimestamp in $(ls "$REUSEBUILD/" 2>&1); do
+ [ -d "$REUSEBUILD/$buildtimestamp" ] || continue
+ check_timestamp "$buildtimestamp" || continue
+ local buildtimestampstr=$(echo $buildtimestamp | \
+ sed -e "s^\(....\)\(..\)\(..\)\(..\)\(..\)\(..\)^\1-\2-\3 \4:\5:\6 GMT^g")
+ local buildtimestampepoch=$(date --date="$buildtimestampstr" +%s )
+ #check for suitable date
+ if ! $PATCHLESS; then
+ [ $buildtimestampepoch -ge $sourcelastdate ] || continue
+ fi
+ #check for suitable version
+ if [ "$rpmonly" = "rpmonly" ]; then
+ local reusedkernelprefix="kernel-lustre-"
+ ( $PATCHLESS ) && reusedkernelprefix=
+ local rpmmask="${reusedkernelprefix}${REUSEDKERNELMASK}"
+ [ "$reusedkernelmasknew" = "" ] || rpmmask="$reusedkernelmasknew"
+ [ -f $REUSEBUILD/$buildtimestamp/${rpmmask}.rpm ] && \
+ dirsforreuse="$dirsforreuse $REUSEBUILD/$buildtimestamp"
+ else
+ local rpmmask="$REUSEDKERNELMASK"
+ [ "$reusedkernelmasknew" = "" ] || rpmmask="$reusedkernelmasknew"
+ pushd $REUSEBUILD/$buildtimestamp/linux-${rpmmask} > /dev/null 2>&1 || continue
+ local curdir=$(pwd)
+ dirsforreuse="$dirsforreuse $curdir"
+ popd
+ fi
+ done
+ echo "$dirsforreuse"
+}
+
+#try to reuse old RPM
+build_sequence_rpm_reuse()
+{
+ local sourcerpm=$1
+ [ "$REUSERPM" = "" ] && [ "$REUSEBUILD" = "" ] && return 255
+ local dirsforreuse=
+ if ! [ "$REUSEBUILD" = "" ] && [ -d "$REUSEBUILD" ]; then #try to reuse RPM
+ local REUSEDKERNELMASKnew=$(echo $REUSEDKERNELMASK | sed -e "s/^[^0-9]*//")
+ REUSEDKERNELMASKnew="kernel-lustre-source-${REUSEDKERNELMASKnew}"
+ local dirsforreuse="$(get_reuse_dir_list rpmonly $REUSEDKERNELMASKnew)"
+ local buildsuccess=false
+ LINUXOBJ=
+ for curdir in $(echo $dirsforreuse); do
+ [ -d "$curdir" ] || continue
+ local reusedkernelprefix="kernel-lustre-"
+ local reusedkernelrpm=
+ [ -f ${curdir}/${reusedkernelprefix}${REUSEDKERNELMASK}.rpm ] && \
+ reusedkernelrpm=$(ls ${curdir}/${reusedkernelprefix}${REUSEDKERNELMASK}.rpm | head -1 )
+ [ -f "$reusedkernelrpm" ] || continue
+
+ local reusedkernelsourcerpm=
+ [ -f ${curdir}/${REUSEDKERNELMASKnew}.rpm ] && \
+ reusedkernelsourcerpm=$(ls ${curdir}/${REUSEDKERNELMASKnew}.rpm | head -1 )
+ [ -f "$reusedkernelsourcerpm" ] || continue
+
+ # don't need to check for kernel-ib RPM reuse here because sles9 is not supported
+ # by OFED >= 1.3.0 and this function appears to only be used for sles9
+
+ [ -d $TOPDIR/reused ] && rm -rf $TOPDIR/reused
+ reuse_kernel_rpm "$reusedkernelsourcerpm" "" && build_linux nofullmake copyrpmkernel && build_lustre && buildsuccess=true
+ ( $buildsuccess ) || continue
+ if ( ! $NORPM ) && ( ! $PATCHLESS ) ; then
+ [ -f "$reusedkernelrpm" ] && \
+ cp -f "$reusedkernelrpm" RPMS/${TARGET_ARCH}/ > /dev/null 2>&1
+
+ [ -f "$reusedkernelsourcerpm" ] && \
+ cp -f "$reusedkernelsourcerpm" RPMS/${TARGET_ARCH}/ > /dev/null 2>&1 && \
+ touch RPMS/${TARGET_ARCH}/kernel_was_reused
+ fi
+ return
+ done
+ fi
+ return 255
+}
+
+#try to reuse old BUILD dir
+build_sequence_reuse()
+{
+ local sourcerpm=$1
+ [ "$REUSERPM" = "" ] && [ "$REUSEBUILD" = "" ] && return 255
+ local dirsforreuse=
+ if [ ! "$REUSEBUILD" = "" ] && [ -d "$REUSEBUILD" ]; then #try to reuse old kernel build directory
+ local dirsforreuse="$(get_reuse_dir_list)"
+ local buildsuccess=false
+ LINUXOBJ=
+ local REUSEDKERNELMASKnew=$(echo $REUSEDKERNELMASK | sed -e "s/^[^0-9]*//")
+ for curdir in $(echo $dirsforreuse); do
+ local reusedkernelrpm=
+ local reusedkernelsourcerpm=
+ local reusedkernelibrpm=
+ [ -d "$curdir" ] || continue
+ [ -n "$OFED_VERSION" -a ! -d "${curdir%/*}/ofa_kernel" ] && continue
+ local reusedkernelprefix="kernel-lustre-"
+ ( $PATCHLESS ) && reusedkernelprefix=
+ [ -f ${curdir}/../${reusedkernelprefix}${REUSEDKERNELMASK}.rpm ] && \
+ reusedkernelrpm=$(ls ${curdir}/../${reusedkernelprefix}${REUSEDKERNELMASK}.rpm | head -1 )
+ reusedkernelprefix="kernel-lustre-source-"
+ [ -f ${curdir}/../${reusedkernelprefix}${REUSEDKERNELMASKnew}.rpm ] && \
+ reusedkernelsourcerpm=$(ls ${curdir}/../${reusedkernelprefix}${REUSEDKERNELMASKnew}.rpm | head -1 )
+ if [ -n "$OFED_VERSION" ]; then
+ gen_lustre_version
+ reusedkernelprefix="kernel-ib-"
+ [ -f ${curdir}/../${reusedkernelprefix}${OFED_VERSION}-${LUSTRE_EXTRA_VERSION}.${TARGET_ARCH}.rpm ] && \
+ reusedkernelibrpm=$(ls ${curdir}/../${reusedkernelprefix}${OFED_VERSION}-${LUSTRE_EXTRA_VERSION}.${TARGET_ARCH}.rpm | head -1 )
+ reusedkernelibdevelrpm=$(ls ${curdir}/../${reusedkernelprefix}devel-${OFED_VERSION}-${LUSTRE_EXTRA_VERSION}.${TARGET_ARCH}.rpm | head -1 )
+ fi
+ if ! ( $NORPM ) && ! [ -f "$reusedkernelrpm" ]; then #kernel rpm not found. Build all
+ continue
+ fi
+ if ! ( $NORPM ) && ! [ -f "$reusedkernelsourcerpm" ]; then #kernel source rpm not found. Build all
+ continue
+ fi
+ if [ -n "$OFED_VERSION" ]; then
+ if ! ( $NORPM ) && [ ! -f "$reusedkernelibrpm" -o ! -f "$reusedkernelibdevelrpm"]; then #kernel-ib{,-devel} rpm not found. Build all
+ continue
+ fi
+ CONFIGURE_FLAGS="--with-o2ib=${curdir%/*}/ofa_kernel ${CONFIGURE_FLAGS}"
+ fi
+ LINUX="$curdir"
+ build_lustre || continue
+ touch "$curdir/../"
+ buildsuccess=true
+ if ( ! $NORPM ) && ( ! $PATCHLESS ) ; then
+ [ -f "$reusedkernelrpm" ] && \
+ cp -f "$reusedkernelrpm" RPMS/${TARGET_ARCH}/ > /dev/null 2>&1 && \
+ touch RPMS/${TARGET_ARCH}/kernel_was_reused
+ [ -f "$reusedkernelsourcerpm" ] && \
+ cp -f "$reusedkernelsourcerpm" RPMS/${TARGET_ARCH}/ > /dev/null 2>&1
+ [ -f "$reusedkernelibrpm" ] && \
+ cp -f "$reusedkernelibrpm" RPMS/${TARGET_ARCH}/ > /dev/null 2>&1
+ cp -f "$reusedkernelibdevelrpm" RPMS/${TARGET_ARCH}/ > /dev/null 2>&1
+ fi
+ return
+ done
+ fi
+ return 255
+}
+
+
+build_sequence()
+{
+ if (( $DO_SRC )) ; then
+ unpack_linux
+ patch_linux
+ pack_linux
+ clean_linux
+ fi
+ prep_kernel_build || return 255
+ clean_lustre || return 255
+
+ build_kernel || return 255