Whamcloud - gitweb
LU-10150 build: Build with ZFS 0.7.3
[fs/lustre-release.git] / contrib / lbuild / lbuild
index 7d0c690..86b08c7 100755 (executable)
@@ -29,14 +29,9 @@ push_exit_trap "kill -INT -$$ || true" kill_children
 
 # increment this if you have made a change that should force a new kernel
 # to build built
 
 # increment this if you have made a change that should force a new kernel
 # to build built
-#BUILD_GEN=1
-#BUILD_GEN=2   # bz19952: remove -lustre tag from kernel RPM names
-#BUILD_GEN=3   # bz19975: enable the building of src.rpms by default
-#BUILD_GEN=4   # bz22281: use the git hash in the kernel extra version
-#BUILD_GEN=5   # TT-107: don't cache the BUILD dir
-BUILD_GEN=6    # TT-1092: don't cache the BUILD dir, to rebuild external OFED
+BUILD_GEN=8
 
 
-TOPDIR=$PWD
+TOPDIR="$PWD"
 
 KERNELDIR=
 LINUX=
 
 KERNELDIR=
 LINUX=
@@ -50,30 +45,26 @@ DOWNLOAD=true
 CANONICAL_TARGET=
 TARGET=
 TARGET_ARCH="$(uname -m)"
 CANONICAL_TARGET=
 TARGET=
 TARGET_ARCH="$(uname -m)"
-# change default behavior to only build for the current arch
-TARGET_ARCHS="$TARGET_ARCH"
-TARGET_ARCHS_ALL="$TARGET_ARCH"
-[ "$TARGET_ARCH" = "i686" ] && TARGET_ARCHS_ALL="i686 i586 i386"
 CONFIGURE_FLAGS=
 EXTERNAL_PATCHES=
 EXTRA_VERSION=
 STAGEDIR=
 TMPDIR=${TMPDIR:-"/var/tmp"}
 TIMESTAMP=
 CONFIGURE_FLAGS=
 EXTERNAL_PATCHES=
 EXTRA_VERSION=
 STAGEDIR=
 TMPDIR=${TMPDIR:-"/var/tmp"}
 TIMESTAMP=
-# this is a dir to try reuse old kernel RPMs in (although, it seems to be
-# unused in any real manner
-REUSERPM=
+# default OFED
+OFED_TYPE="inkernel"
 # this is the dir that should be used to store reuse products
 REUSEBUILD=
 # should cached products be used or force rebuilding?
 USE_BUILD_CACHE=true
 # what does this do exactly?  does it imply no kernel build?
 # this is the dir that should be used to store reuse products
 REUSEBUILD=
 # should cached products be used or force rebuilding?
 USE_BUILD_CACHE=true
 # what does this do exactly?  does it imply no kernel build?
-NORPM=false
 IOKITRPM=true
 OSDLDISKFSRPM=true
 OSDZFSRPM=false
 SMPTYPES="smp bigsmp default ''"
 PATCHLESS=false
 IOKITRPM=true
 OSDLDISKFSRPM=true
 OSDZFSRPM=false
 SMPTYPES="smp bigsmp default ''"
 PATCHLESS=false
+PATCHLESS_SERVER=false
+WITH_ZFS=""
 XEN=false
 LINUXOBJ=
 DISTRO=
 XEN=false
 LINUXOBJ=
 DISTRO=
@@ -137,9 +128,6 @@ Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
   --timestamp=TIMESTAMP
     Date of building lustre in format YYYYMMDDhhmmss
 
   --timestamp=TIMESTAMP
     Date of building lustre in format YYYYMMDDhhmmss
 
-  --reuserpm=DIR
-    Try to reuse old kernel RPMs from DIR
-
   --reusebuild=DIR
     Try to reuse old kernel builds from DIR
 
   --reusebuild=DIR
     Try to reuse old kernel builds from DIR
 
@@ -150,11 +138,14 @@ Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
     Use ccache
 
   --norpm
     Use ccache
 
   --norpm
-    Do not build RPMs (compile only mode)
+    Unused.
 
   --patchless
     Build lustre client only
 
 
   --patchless
     Build lustre client only
 
+  --patchless-server
+    Build lustre server without patching the kernel
+
   --distro=DISTRO
     Which distro using. Autodetect by default
 
   --distro=DISTRO
     Which distro using. Autodetect by default
 
@@ -174,12 +165,30 @@ Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
     Path to an existing lustre source tarball to use.
 
   --nodownload
     Path to an existing lustre source tarball to use.
 
   --nodownload
-    Do not try to download a kernel from downloads.lustre.org
+    Do not try to download a kernel from downloads.hpdd.intel.com
 
   --nosrc
     Do not build a .src.rpm, a full kernel patch, or a patched kernel
     tarball.
 
 
   --nosrc
     Do not build a .src.rpm, a full kernel patch, or a patched kernel
     tarball.
 
+  --ofed-type
+    Type of OFED to build with lustre: inkernel, ofa, mlnx, ifs
+    ofa: OpenFabrics Alliance
+    mlnx: Mellanox
+    ifs: Intel True Scale Fabric
+
+  --ofed-version
+    Version of external OFED to build with lustre
+
+  --mlnx-version
+    Version of external Mellanox OFED to build with lustre
+
+  --ofed-src
+    Tarball for either OFED. Tarball must follow below format
+    OFED-<ofed-version>.tgz regardless of vendors
+    It's likely that you need to reconstruct the directory name
+    It must be placed under KERNELTREE directory
+
   --ldiskfs
     Build with ldiskfs support. (Deprecated, always true)
 
   --ldiskfs
     Build with ldiskfs support. (Deprecated, always true)
 
@@ -193,6 +202,9 @@ Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
     Specifies that the files generated do not include timestamps, and
     that this is an official release.
 
     Specifies that the files generated do not include timestamps, and
     that this is an official release.
 
+  --disable-zfs
+    Build Lustre without ZFS.
+
   --src
     Build a .src.rpm, a full kernel patch, and a patched kernel tarball.
 
   --src
     Build a .src.rpm, a full kernel patch, and a patched kernel tarball.
 
@@ -205,16 +217,6 @@ Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
     The name of the target to build.  The available targets are listed
     below.
 
     The name of the target to build.  The available targets are listed
     below.
 
-  --target-archs=TARGET_ARCHS
-    A (space delimited) list of architectures to build.  By default,
-    all of the archs supported by the TARGET will be built, in
-    addition to a .src.rpm.  This option can limit those, for machines
-    that can only build certain archs or if you only want a certain
-    arch built (for testing, or a one-off kernel).
-
-    Also note that by using a non-"base" arch (eg, i386) only kernels
-    will be built - there will be no lustre-lite-utils package.
-
   --xen
     Builds a Xen domX kernel.
 
   --xen
     Builds a Xen domX kernel.
 
@@ -265,13 +267,33 @@ check_options() {
         usage 1 "Could not find Lustre source tarball '$LUSTRE'."
     fi
 
         usage 1 "Could not find Lustre source tarball '$LUSTRE'."
     fi
 
+       if $PATCHLESS && $PATCHLESS_SERVER; then
+               usage 1 "Can not use both --patchless and --patchless-server."
+       fi
+
+       if [ -n "${OFED_SRC}" ]; then
+               if [ -z "${OFED_VERSION}" ]; then
+                       usage 1 "Need to provide version for file ${OFED_SRC}."
+               fi
+               if [ "${OFED_TYPE}" = "inkernel" ]; then
+                       usage 1 "Need to provide ofed type for file ${OFED_SRC}."
+               fi
+       else
+               if [ "${OFED_TYPE}" != "inkernel" -a -z "${OFED_VERSION}" ]; then
+                       usage 1 "Need to provide version for $OFED_TYPE OFED"
+               fi
+
+               if [ "${OFED_TYPE}" = "inkernel" -a -n "${OFED_VERSION}" ]; then
+                       usage 1 "Can not specify version with inkernel OFED"
+               fi
+       fi
+
     if [ -z "$DISTRO" ] ; then
         DISTRO=$(autodetect_distro)
     if [ -z "$DISTRO" ] ; then
         DISTRO=$(autodetect_distro)
-        # remove minor version only for rhel and oel
-        [[ $DISTRO =~ "el-" ]] && DISTRO=${DISTRO%%.*}
         # remove separator
         DISTRO=${DISTRO/-/}
     fi
         # remove separator
         DISTRO=${DISTRO/-/}
     fi
+    DISTROMAJ=${DISTRO%%.*}
 
     [ -z "$TARGET" ] && TARGET=$(autodetect_target "$DISTRO")
 
 
     [ -z "$TARGET" ] && TARGET=$(autodetect_target "$DISTRO")
 
@@ -288,7 +310,13 @@ check_options() {
     fi
 
     case $TARGET in
     fi
 
     case $TARGET in
-        2.6-rhel6)
+        3.12-sles12 | 4.4-sles12)
+            CANONICAL_TARGET="sles12"
+            ;;
+        3.10-rhel7*)
+            CANONICAL_TARGET="rhel7"
+            ;;
+        2.6-rhel6*)
             CANONICAL_TARGET="rhel6"
             ;;
         2.6-rhel5)
             CANONICAL_TARGET="rhel6"
             ;;
         2.6-rhel5)
@@ -331,31 +359,47 @@ check_options() {
         TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
     fi
 
         TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
     fi
 
-    RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
-    if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
-        RPMBUILD=$(which rpm 2>/dev/null | head -1)
-        if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
-            usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
-        fi
+    RPMBUILD=$(which rpmbuild 2>/dev/null | head -n 1)
+    RPMBUILD=${RPMBUILD:-$(which rpm 2>/dev/null | head -n 1)}
+    if [ -z "$RPMBUILD" ]; then
+        usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
     fi
 
     fi
 
+    local BINDIR="$TOPDIR/bin"
+    if [ -d $BINDIR ]; then
+        rm -rf $BINDIR >/dev/null 2>&1 || true
+    fi
+
+    mkdir -p $BINDIR || fatal 1 "error trying to create $BINDIR"
+    export PATH=$BINDIR:$PATH
+
+    cat >${BINDIR}/rpmbuild <<EOF
+#!/bin/bash
+
+ARGS="\${FIND_REQUIRES:+--define \"__find_requires \$FIND_REQUIRES\"}"
+for arg; do
+    case \$arg in
+    *\'* ) ARGS="\$ARGS \"\$arg\"" ;;
+    * ) ARGS="\$ARGS '\$arg'" ;;
+    esac
+done
+
+eval $RPMBUILD \$ARGS
+EOF
+    chmod 755 ${BINDIR}/rpmbuild
+
     if [ -n "$CCACHE" ]; then
         which "$DISTCC" &>/dev/null && export DISTCC RPM_BUILD_NCPUS
 
         if which "$CCACHE" &>/dev/null; then
     if [ -n "$CCACHE" ]; then
         which "$DISTCC" &>/dev/null && export DISTCC RPM_BUILD_NCPUS
 
         if which "$CCACHE" &>/dev/null; then
-            local ccache=$(which "$CCACHE")
-            local bindir="$TOPDIR/bin"
+            local ccache=$(which "$CCACHE" 2>/dev/null | head -n 1)
 
 
-            if [ ! -d $bindir ]; then
-                mkdir -p $bindir || fatal 1 "error trying to create $bindir"
-            else
-                rm ${bindir}/* > /dev/null 2>&1 || true
-            fi
-            ln -s "$ccache" ${bindir}/ccache
-            ln -s "$ccache" ${bindir}/cc
-            ln -s "$ccache" ${bindir}/$CC
-            export PATH=$bindir:$PATH
-            export CCACHE && export CC="ccache $CC"
+            ln -s "$ccache" ${BINDIR}/ccache
+            ln -s "$ccache" ${BINDIR}/cc
+            ln -s "$ccache" ${BINDIR}/$CC
+
+            export CCACHE
+            export CC="ccache $CC"
             # zero the cache so we can see how effective we are being with it
             echo -n "ccache "
             ccache -z
             # zero the cache so we can see how effective we are being with it
             echo -n "ccache "
             ccache -z
@@ -368,7 +412,6 @@ check_options() {
     fi
 
     return 0
     fi
 
     return 0
-
 }
 
 # compare two versions $1 and $2. if $1 < $2, return 0 otherwise return 1.
 }
 
 # compare two versions $1 and $2. if $1 < $2, return 0 otherwise return 1.
@@ -390,6 +433,7 @@ compare_version () {
             return 1
         fi
     done
             return 1
         fi
     done
+    return 1
 }
 
 uniqify() {
 }
 
 uniqify() {
@@ -428,36 +472,47 @@ fetch_url() {
 }
 
 download_srpm() {
 }
 
 download_srpm() {
-    local target=$1
-    local srpm=$2
-    local force="${3:-false}"
-
-    if $force || [ ! -r "$KERNELDIR/$srpm" ] ||
-       [ ! -s "$KERNELDIR/$srpm" ]; then
-        if $DOWNLOAD; then
-            local location="http://downloads.lustre.org/public/kernels/$target/old"
-            # get the location from a distro specific method if it exists
-            if type -p kernel_srpm_location; then
-                location=$(kernel_srpm_location)
-            fi
-            echo "Downloading $location/$srpm..."
-            if ! fetch_url "$location/$srpm" "$KERNELDIR/$srpm" 2>&1 ||
-               [ ! -s "$KERNELDIR/$srpm" ]; then
-                rm -f $KERNELDIR/$srpm
-                # punt to a distro specific method if it exists
-                if ! type -p download_srpm-$DISTRO; then
-                    fatal 1 "Could not download target $target's kernel SRPM $srpm from $location."
-                else
-                    if ! download_srpm-$DISTRO "$target" "$srpm" "$force"; then
-                        fatal 1 "Could not download target $target's kernel SRPM $srpm using download_srpm-$DISTRO."
-                    fi
-                fi
-            fi
-        else
-            fatal 1 "$srpm not found in directory $KERNELDIR."
-        fi
-    fi
+       local target=$1
+       local srpm=$2
+       local force="${3:-false}"
+
+       # let the download_file handle the concurrency
+       if $DOWNLOAD; then
+               local location= \
+               "https://downloads.hpdd.intel.com/public/kernels/$target/old"
+               # get the location from a distro specific method if it exists
+               if type -p kernel_srpm_location; then
+                       location=$(kernel_srpm_location)
+               fi
+               echo "Downloading $location/$srpm..."
+               if ! download_file \
+                       "$location/$srpm" "$KERNELDIR/$srpm" "$force" 2>&1 ||
+                       [ ! -s "$KERNELDIR/$srpm" ]; then
+                       rm -f $KERNELDIR/$srpm
+                       fatal 1 "Could not download target $target's kernel \
+SRPM $srpm from $location."
+               fi
+       fi
+}
 
 
+download_debuginfo_common() {
+       local rpm=$1
+       local force="${2:-false}"
+
+       # let the download_file handle the concurrency
+       if $DOWNLOAD; then
+               # get the location from a distro specific method if it exists
+               if type -p kernel_debuginfo_location; then
+               location=$(kernel_debuginfo_location)
+               fi
+               echo "Downloading $location/$rpm"
+               if ! download_file \
+                       "$location/$rpm" "$KERNELRPMSBASE/$lnxmaj/$DISTROMAJ/$TARGET_ARCH/$rpm" "$force" 2>&1 ||
+                       [ ! -s "$KERNELRPMSBASE/$lnxmaj/$DISTROMAJ/$TARGET_ARCH/$rpm" ]; then
+                       rm -f $KERNELRPMSBASE/$lnxmaj/$DISTROMAJ/$TARGET_ARCH/$rpm
+                       fatal 1 "Could not download $rpm from $location."
+               fi
+       fi
 }
 
 download_file() {
 }
 
 download_file() {
@@ -540,164 +595,60 @@ download_file() {
 }
 
 download_ofed() {
 }
 
 download_ofed() {
-    local force="${1:-false}"
-
-    if [ -z "$OFED_VERSION" -o "$OFED_VERSION" = "inkernel" ]; then
-        return 0
-    fi
-
-    local OFED_BASE_VERSION=$OFED_VERSION
-    if [[ $OFED_VERSION = *.*.*.* ]]; then
-        OFED_BASE_VERSION=${OFED_VERSION%.*}
-    fi
-
-    local location="http://www.openfabrics.org/downloads/OFED/ofed-${OFED_BASE_VERSION}/"
-
-    if [[ $OFED_VERSION = *-[rR][cC][0-9] ]]; then
-        local Mmv
-        Mmv=${OFED_VERSION%%-[rR][cC][0-9]}
-        location="http://www.openfabrics.org/downloads/OFED/ofed-${Mmv}/"
-    fi
-
-    if [[ $OFED_VERSION = daily-* ]]; then
-        local Mmv daily
-        OFED_VERSION=${OFED_VERSION/daily-/}
-        Mmv=${OFED_VERSION%%-*}
-        daily=${OFED_VERSION##$Mmv-}
-        location="http://www.openfabrics.org/downloads/OFED/ofed-${Mmv}-daily/"
-        # find the filename for the version for the date specified
-        OFED_VERSION=$(curl -s "$location" | sed -nre "/${daily}-/s/.*href=\"OFED-(${Mmv//./\\.}-${daily}-[0-9]{4,4}).tgz.*$/\1/p" | tail -1)
-        if [ -z "$OFED_VERSION" ]; then
-            fatal 1 "Could not determine the filename of the OFED snapshot for ${daily}"
-        fi
-    fi
-
-    local file="OFED-${OFED_VERSION}.tgz"
-    download_file "$location/$file" "$KERNELTREE" "$force"
-
-}
-
-parse_mpss_info() {
-    local file="$1"
-    local build="$2"
-    local distro="$3"
-
-    [ -r "$file" ] || fatal 1 "Could not find MPSS info file"
-
-    # convert to MPSS distro naming
-    distro=${distro/sles/suse}
-    distro_name=${distro%%-*}
-
-    # extract links from MPSS info file
-    local urls=$(cat "$file" | \
-        tr -d '\t\r\n' | sed -e 's?\(</[a-zA-Z]*>\)?\1\n?g' | \
-        grep '.intel.com/' | \
-        sed -e 's/^.*[hH][rR][eE][fF]="\([^>"]\+\)".*$/\1/g' | \
-        grep '.tar')
-    local res2=""
-    local res3=""
-    for url in $urls; do
-        local ver2=""
-        local ver3=""
-        # Try to match with MPSS 3.x or 3.x.x distro package
-        if [[ $url =~ mpss-[0-9].[0-9](.[0-9]*)?-$distro.tar ]]; then
-            ver3=${url##*mpss-}
-            ver3=${ver3%%-$distro.tar}
-        # Try to match with MPSS 3.x or 3.x.x source package
-        elif [[ $url =~ mpss-src-[0-9].[0-9](.[0-9]*)?.tar ]]; then
-            ver3=${url##*mpss-src-}
-            ver3=${ver3%%.tar}
-        # Try to match with MPSS 3.x or 3.x.x cross compiler package
-        elif [[ $url =~ mpss-[0-9].[0-9](.[0-9]*)?-k1om.tar ]]; then
-            ver3=${url##*mpss-}
-            ver3=${ver3%%-k1om.tar}
-        # Try to match with MPSS 2.1.x source package
-        elif [[ $url =~ _src-[0-9].[0-9].[0-9]*-[0-9]*_$distro_name.tar ]]; then
-            ver2=${url##*_src-}
-            ver2=${ver2%%_$distro_name.tar}
-        fi
-
-        if [ -n "$ver3" ]; then
-            # Check for MPSS 3.x or MPSS 3.x.x
-            if [[ $ver3 =~ [0-9].[0-9].[0-9]* ]]; then
-                ver3="${ver3}-0"
-            else
-                ver3="${ver3}.0-0"
-            fi
-            if [ -z "$build" ]; then
-                res3="$ver3"
-            elif [ "$build" = "$ver3" ]; then
-                res3="$res3 $url"
-            fi
-        elif [ -n "$ver2" ]; then
-            if [ -z "$build" ]; then
-                res2="$ver2"
-            elif [ "$build" = "$ver2" ]; then
-                res2="$res2 $url"
-            fi
-        fi
-
-    done
-
-    if [ -z "$build" ]; then
-        # return a last version of MPSS
-        if [ -n "$res3" ]; then
-            echo "$res3"
-        else
-            echo "$res2"
-        fi
-    elif [ "${build%%.*}" = "3" ]; then
-        local ver=${build%%-*}
-        local bid=${build##*-}
-        if [ $bid -eq 0 ]; then
-            # return URLs from MPSS info file
-            echo "$res3"
-        else
-            # Check for MPSS 3.x or MPSS 3.x.x
-            if [ ${ver##*.} -eq 0 ]; then
-                ver=${ver%.*}
-            fi
-            # return URLs from internal site with MPSS builds
-            # kernel sources:
-            echo "${MPSS_BUILDS:-"http://mic-bld.pdx.intel.com/release"}/$ver/$bid/release/knightscorner/package/mpss-src-$ver.tar"
-            # kernel configs:
-            echo "${MPSS_BUILDS:-"http://mic-bld.pdx.intel.com/release"}/$ver/$bid/release/knightscorner/package/mpss-$ver-k1om.tar"
-            # OFED headers:
-            echo "${MPSS_BUILDS:-"http://mic-bld.pdx.intel.com/release"}/$ver/$bid/release/knightscorner/package/mpss-$ver-$distro.tar"
-        fi
-    else
-        # return URLs from MPSS info file
-        echo "$res2"
-    fi
-}
+       local ofed_type="$1"
+       local ofed_version="$2"
+       local force="${3:-false}"
+       local distro_name="${DISTRO}"
+       local arch="${TARGET_ARCH}"
+       local location
+       local file
+
+       #if a src tarball has been given in the command line, we use it
+       #The format of the tarball must be OFED-${OFED_VERSION}.tgz
+       [ -n "${OFED_SRC}" ] && return 0
+
+       case $ofed_type in
+               ofa)
+                       location="https://www.openfabrics.org/downloads/OFED/ofed-${ofed_version}/"
+                       # version include RC
+                       if [[ $ofed_version = *-[rR][cC][0-9] ]]; then
+                               ofed_version_loc=${ofed_version%%-[rR][cC][0-9]}
+                               location="https://www.openfabrics.org/downloads/OFED/ofed-${ofed_version_loc}/"
+                       fi
+                       # daily build
+                       if [[ $ofed_version = *-daily ]]; then
+                               ofed_version=${ofed_version/-daily/}
+                               location="https://www.openfabrics.org/downloads/OFED/ofed-${ofed_version}-daily/"
+                               # find the filename for latest version
+                               ofed_version=$(curl -1 -s "$location" | sed -nre "s/.*href=\"OFED-(${ofed_version//./\\.}-[0-9]{8}-[0-9]{4}).tgz.*$/\1/p" | tail -1)
+                               if [ -z "$ofed_version" ]; then
+                                       fatal 1 "Could not determine the filename of the OFED snapshot from daily "
+                               fi
+                       fi
+
+                       file="OFED-${ofed_version}.tgz"
+                       download_file "$location/$file" "$KERNELTREE" "$force"
+                       ;;
+               mlnx)
+                       location="http://www.mellanox.com/downloads/ofed/MLNX_OFED-${ofed_version}"
+                       # this is a work around for suse distro (sles11.3). what we need is
+                       # sles11sp3. We really need to redesign how we use target and distro
+                       [[ $distro_name =~ sles ]] && distro_name=${DISTRO/./sp}
+                       file="MLNX_OFED_LINUX-${ofed_version}-${distro_name}-${arch}.tgz"
+                       download_file "$location/$file" "$KERNELTREE" "$force"
+                       ;;
+               ifs)
+                       location="http://downloadmirror.intel.com/24625/eng/"
+                       file="IntelIB-Basic.$(echo ${distro_name%%.*} | tr '[:lower:]' '[:upper:]')-${arch}.${ofed_version}.tgz"
+                       download_file "$location/$file" "$KERNELTREE" "$force"
+                       ;;
+               *)
+                       fatal 1 "Error: unknown OFED type: $ofed_type"
+
+       esac
+       # version might change due to detect daily version
+       OFED_VERSION=${ofed_version}
 
 
-# Get public information about last releases of
-# Intel Manycore Platform Software Stack (MPSS)
-download_mpss_info() {
-    local file="$1"
-    local force="${2:-true}"
-    local url=${MPSS_URL:-"http://software.intel.com/en-us/articles/intel-manycore-platform-software-stack-mpss"}
-
-    download_file "$url" "$file" "$force"
-}
-
-download_mpss() {
-    local file="$1"
-    local force="${2:-false}"
-    local urls=$(parse_mpss_info "$file" ${MPSS_VERSION} ${MPSS_DISTRO})
-
-    [ -z "$urls" ] && fatal 1 "Could not determine the URLs of MPSS $MPSS_VERSION"
-
-    # force re-download if build number is zero
-    [[ $MPSS_VERSION = [0-9].[0-9].[0-9]*-0 ]] && force=true
-
-    local url
-    local i=0
-    for url in $urls; do
-        file="$KERNELTREE/mpss_src-${MPSS_VERSION}-${MPSS_DISTRO}-part$i.tar"
-        download_file "$url" "$file" "$force"
-        i=$((i+1))
-    done
 }
 
 load_target() {
 }
 
 load_target() {
@@ -731,7 +682,7 @@ load_target() {
     #       go away and the target just specify the $RPMSMPTYPE
     [ -z "$RPMSMPTYPE" ] && set_rpm_smp_type
 
     #       go away and the target just specify the $RPMSMPTYPE
     [ -z "$RPMSMPTYPE" ] && set_rpm_smp_type
 
-    # CC might have been overwriten in TARGET_FILE
+    # CC might have been overwritten in TARGET_FILE
     if [[ $CC != ccache\ * ]] && which "$CCACHE" &>/dev/null; then
         export CCACHE && export CC="ccache $CC"
     fi
     if [[ $CC != ccache\ * ]] && which "$CCACHE" &>/dev/null; then
         export CCACHE && export CC="ccache $CC"
     fi
@@ -780,41 +731,27 @@ load_target() {
         # kernel.  don't make it look like one
         if $PATCHLESS || [ -n "$SERIES" ]; then
             EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
         # kernel.  don't make it look like one
         if $PATCHLESS || [ -n "$SERIES" ]; then
             EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
-            if ! $PATCHLESS && [ -n "$BUILDID" ]; then
-                EXTRA_VERSION="${EXTRA_VERSION}.${BUILDID}"
-            fi
         fi
     fi
     # EXTRA_VERSION=${EXTRA_VERSION//-/_}
         fi
     fi
     # EXTRA_VERSION=${EXTRA_VERSION//-/_}
-
-    ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
-
-    BUILD_ARCHS=
-    for arch in $(uniqify "$ALL_ARCHS"); do
-        if [ -z "$TARGET_ARCHS" ] ||
-           [[ \ $TARGET_ARCHS\  = *\ $arch\ * ]]; then
-            BUILD_ARCHS="$BUILD_ARCHS $arch"
-        fi
-    done
-    [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
-    echo "Building for: $BUILD_ARCHS"
 }
 
 tarflags() {
     local file="$1"
 
 }
 
 tarflags() {
     local file="$1"
 
+    echo -n '--wildcards '
     case "$file" in
         '')
             fatal 1 "tarflags(): File name argument missing."
             ;;
         *.tar.gz | *.tgz)
     case "$file" in
         '')
             fatal 1 "tarflags(): File name argument missing."
             ;;
         *.tar.gz | *.tgz)
-            echo 'zxf'
+            echo '-zxf'
             ;;
         *.tar.bz2)
             ;;
         *.tar.bz2)
-            echo 'jxf'
+            echo '-jxf'
             ;;
         *.tar)
             ;;
         *.tar)
-            echo 'xf'
+            echo '-xf'
             ;;
         *)
             fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
             ;;
         *)
             fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
@@ -834,12 +771,64 @@ untar() {
 }
 
 unpack_ofed() {
 }
 
 unpack_ofed() {
-
-    if ! untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then
-        return 1
-    fi
-    [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
-
+       local ofed_type="$1"
+       local ofed_version="$2"
+       local distro_name="${DISTRO}"
+       local arch="${TARGET_ARCH}"
+       local file
+
+       #if a src tarball has been given in the command line, we use it
+       #The format of the directory after untar MUST be in OFED-${version}
+       #even if it's from MLNX or IFS...or whatever
+       if [ -n "${OFED_SRC}" ]; then
+               if ! untar "$KERNELTREE/${OFED_SRC}"; then
+                       return 1
+               else
+                       [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
+               fi
+       fi
+       case $ofed_type in
+               ofa)
+                       file="OFED-${ofed_version}"
+                       if ! untar "$KERNELTREE/${file}.tgz"; then
+                               return 1
+                       fi
+                       [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
+                       ;;
+               mlnx)
+                       # this is a work around for suse distro (sles11.3). what we need is
+                       # sles11sp3. We really need to redesign how we use target and distro
+                       [[ $distro_name =~ sles ]] && distro_name=${DISTRO/./sp}
+                       file="MLNX_OFED_LINUX-${ofed_version}-${distro_name}-${arch}"
+
+                       # it's not important what distro we get the tarball since we only
+                       # interest in the src
+                       if ! untar "$KERNELTREE/${file}.tgz"; then
+                               return 1
+                       fi
+                       # we need to untar again to get the src since it's being
+                       # wrapped inside the tarball
+                       # There are cases where the source version is different
+                       # than the tarball.
+                       # (ie. MLNX_OFED_LINUX-2.3-1.0.1 but MLNX_OFED_SRC-2.3-1.0.0)
+                       local src=$(ls ${file}/src/MLNX_OFED_SRC-${ofed_version%.*}*.tgz)
+                       if ! untar "$src"; then
+                               return 1
+                       fi
+                       [ -d OFED ] || ln -sf MLNX_OFED_SRC-[0-9].[0-9]* OFED
+                       [ -d OFED_RPMS ] || ln -sf ${file}/RPMS OFED_RPMS
+                       ;;
+               ifs)
+                       file="IntelIB-Basic.$(echo ${distro_name%%.*} | tr '[:lower:]' '[:upper:]')-${arch}.${ofed_version}"
+                       if ! untar "$KERNELTREE/${file}.tgz"; then
+                               return 1
+                       fi
+                       [ -d OFED ] || ln -sf $file/IntelIB-OFED.$(echo ${distro_name%%.*} | tr '[:lower:]' '[:upper:]')-${arch}.* OFED
+                       ofed_version="$(cat OFED/Version)"
+                       ;;
+       esac
+       # version might change due to detect daily version
+       OFED_VERSION=${ofed_version}
 }
 
 unpack_lustre() {
 }
 
 unpack_lustre() {
@@ -849,73 +838,6 @@ unpack_lustre() {
 
 }
 
 
 }
 
-unpack_mpss() {
-
-    [ -d mpss ] && return 0
-
-    if [ "${MPSS_VERSION%%.*}" = "3" ]; then
-        local ver=${MPSS_VERSION%%-*}
-        local file
-        local i
-        # Check for MPSS 3.x or MPSS 3.x.x
-        if [ ${ver##*.} -eq 0 ]; then
-            ver=${ver%.*}
-        fi
-        for i in $(seq 0 9); do
-            file="$KERNELTREE/mpss_src-${MPSS_VERSION}-${MPSS_DISTRO}-part$i.tar"
-            if [ -r "$file" ]; then
-                untar "$file" \
-                    "mpss-$ver/*/linux-*.tar.bz2" \
-                    "mpss-$ver/*/kernel-dev-*.rpm" \
-                    "mpss-$ver/*/ofed-driver-*-devel-*.rpm"
-            fi
-        done
-        # Extract kernel configs
-        file=$(find mpss-$ver -type f -path "*/kernel-dev-*.rpm")
-        if ! rpm2cpio "$file" | cpio -idm; then
-            echo "Error extracting MPSS kernel configs"
-            return 1
-        fi
-        # Unpack kernel sources
-        file=$(find mpss-$ver -type f -path "*/linux-*.tar.bz2")
-        if ! untar "$file"; then
-            echo "Error unpacking MPSS kernel sources"
-            return 1
-        fi
-        # Extract OFED headers
-        file=$(find mpss-$ver -type f -path "*/ofed-driver-*-devel-*.rpm")
-        if ! rpm2cpio "$file" | cpio -idm; then
-            echo "Error extracting MPSS OFED headers"
-            return 1
-        fi
-        # Remove unpacked archives to save space
-        rm -rf mpss-$ver
-        # Make link to MPSS kernel sources
-        ln -sf linux-* mpss
-    else
-        local dir="mpss-${MPSS_VERSION}-${MPSS_DISTRO%%-*}"
-
-        mkdir $dir || return 255
-        pushd $dir >/dev/null || return 255
-        if ! untar "$KERNELTREE/mpss_src-${MPSS_VERSION}-${MPSS_DISTRO}-part0.tar" "*/gpl/*full_src*"; then
-            popd >/dev/null
-            rm -rf $dir
-            echo "Error unpacking MPSS tarball 1"
-            return 1
-        fi
-        local file=$(find . -type f -path "*/gpl/*full_src*")
-        if ! untar "$file"; then
-            popd >/dev/null
-            rm -rf $dir
-            echo "Error unpacking MPSS tarball 2"
-            return 1
-        fi
-        popd >/dev/null
-        ln -sf $dir mpss
-    fi
-
-}
-
 do_patch_linux() {
 
     local do_patch=${1:-true}
 do_patch_linux() {
 
     local do_patch=${1:-true}
@@ -956,34 +878,24 @@ do_patch_linux() {
 build_lustre() {
     local linux="$1"
     local linuxobj="$2"
 build_lustre() {
     local linux="$1"
     local linuxobj="$2"
+    local configure_args=""
 
     cp "$LUSTRE" SOURCES
 
     pushd lustre >/dev/null
 
 
     cp "$LUSTRE" SOURCES
 
     pushd lustre >/dev/null
 
-    echo "Building Lustre RPMs for: $BUILD_ARCHS..."
-    local targets arch
-    for arch in $BUILD_ARCHS; do
-        targets="--target $arch $targets"
-    done
-
-    local confoptions=""
-
-    if $PATCHLESS; then
-        confoptions="$confoptions --disable-server"
+    if ! build_lustre_dkms; then
+        popd >/dev/null # pushd lustre
+        return 255
     fi
 
     fi
 
-    local rpmbuildopt='-tb'
-    if $NORPM; then
-        rpmbuildopt='-tc'
-        echo NORPM mode. Only compiling.
-    fi
+    echo "Building Lustre RPMs for: $TARGET_ARCH"
 
     # If server we now build the spl and zfs modules against the lustre kernel.
     # These are required prior to the building of lustre server. Client does
     # not require spl/zfs. Use !PATCHLESS to indicate server which follows the
     # line above so is at least consistant.
 
     # If server we now build the spl and zfs modules against the lustre kernel.
     # These are required prior to the building of lustre server. Client does
     # not require spl/zfs. Use !PATCHLESS to indicate server which follows the
     # line above so is at least consistant.
-    if [ $PATCHLESS == false ] && [ "x$ZFSNOTSUPPORTED" == "x" ]; then
+    if [ $PATCHLESS == false ] && [ "x$WITH_ZFS" == "x" ]; then
         if ! build_spl_zfs; then
             popd >/dev/null # pushd lustre
             return 255
         if ! build_spl_zfs; then
             popd >/dev/null # pushd lustre
             return 255
@@ -991,51 +903,75 @@ build_lustre() {
     fi
 
     if $PATCHLESS; then
     fi
 
     if $PATCHLESS; then
-        RPMBUILD_DEFS="$RPMBUILD_DEFS --without servers"
-        if [ -n "$CROSS_SUFFIX" ]; then
-            RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"lustre_name lustre-client$CROSS_SUFFIX\""
-        fi
+        configure_args="$configure_args --disable-server"
     fi
 
     # ditto for the lustre-tests boolean
     if ! $LUSTRE_TESTS; then
     fi
 
     # ditto for the lustre-tests boolean
     if ! $LUSTRE_TESTS; then
-        RPMBUILD_DEFS="$RPMBUILD_DEFS --without lustre_tests"
+        configure_args="$configure_args --disable-tests"
     fi
 
     if ! $IOKITRPM; then
     fi
 
     if ! $IOKITRPM; then
-        RPMBUILD_DEFS="$RPMBUILD_DEFS --without lustre_iokit"
+        configure_args="$configure_args --disable-iokit"
     fi
 
     fi
 
-    local osd_zfs=""
-    if $OSDZFSRPM; then
-        osd_zfs="yes"
+    if ! $OSDZFSRPM; then
+        configure_args="$configure_args --without-zfs"
     fi
 
     fi
 
-    local osd_ldiskfs=""
-    if $OSDLDISKFSRPM; then
-        osd_ldiskfs="yes"
+    if ! $OSDLDISKFSRPM; then
+        configure_args="$configure_args --disable-ldiskfs"
     fi
 
     fi
 
-    RPMBUILD_DEFS="$RPMBUILD_DEFS ${FIND_REQUIRES:+--define \"__find_requires $FIND_REQUIRES\"}"
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"configure_args $confoptions ${CONFIGURE_FLAGS}\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"kdir $linux\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS ${linuxobj:+--define \"kobjdir $linuxobj\"}"
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"_tmppath $TMPDIR\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"_topdir $TOPDIR\""
-
-    eval $RPMBUILD $targets $rpmbuildopt "$LUSTRE" $RPMBUILD_DEFS \
-        ${osd_zfs:+--with zfs} \
-        ${osd_ldiskfs:+--with ldiskfs} 2>&1 || \
-        fatal 1 "Error building rpms for $BUILD_ARCHS."
-
-    if $DO_SRC; then
-        if ! eval $RPMBUILD -ts "$LUSTRE" $RPMBUILD_DEFS 2>&1; then
-            popd >/dev/null
-            return 255
-        fi
+    configure_args="$configure_args --with-linux=$linux"
+    configure_args="$configure_args ${linuxobj:+--with-linux-obj=$linuxobj}"
+
+    # allow environment setting to override ldiskfs series selection
+    [ -n "$LDISKFS_SERIES" ] && export LDISKFS_SERIES
+
+    ./configure $configure_args $CONFIGURE_FLAGS 2>&1 ||
+        fatal 1 "Error in configure."
+
+    if type -p apply_kmod_requires_conflicts; then
+        apply_kmod_requires_conflicts
     fi
     fi
+
+    make rpms 2>&1 ||
+        fatal 1 "Error building rpms for $TARGET_ARCH."
+
+    # move RPMs into place where they are expected to be
+    mv -f *lustre*.${TARGET_ARCH}.rpm $TOPDIR/RPMS/${TARGET_ARCH}/
+    mv -f lustre-*.src.rpm $TOPDIR/SRPMS/
+
     popd >/dev/null
     popd >/dev/null
+       if type -p cleanup_rpmmacros; then
+               cleanup_rpmmacros
+       fi
 
 
+    return 0
+}
+
+# Only zfs Lustre DKMS Server is supported
+build_lustre_dkms() {
+    local build_args=""
+    local name_prefix="lustre"
+    local ver=$(sed -n -e 's/^LUSTRE_VERSION = //p' LUSTRE-VERSION-FILE)
+
+    echo "Building Lustre DKMS RPMs for: $TARGET_ARCH"
+    ./configure --enable-dist || fatal 1 "Error in DKMS configure."
+
+    if $PATCHLESS; then
+        build_args="--without servers"
+        name_prefix="lustre-client"
+    fi
+
+    rpmbuild --define "_topdir $TOPDIR" $build_args -bs lustre-dkms.spec ||
+        fatal 1 "Error building DKMS .src.rpm for $TARGET_ARCH."
+    rpmbuild --define "_topdir $TOPDIR" $build_args \
+             --rebuild $TOPDIR/SRPMS/$name_prefix-dkms-$ver-*.src.rpm ||
+        fatal 1 "Error building DKMS .rpm for $TARGET_ARCH."
+
+    return 0
 }
 
 ###
 }
 
 ###
@@ -1058,8 +994,8 @@ build_spl_zfs() {
     # The spl/zfs spec files expect RPM_BUILD_ROOT to point to the root of the
     # destination for the rpms
     export RPM_BUILD_ROOT=$TOPDIR
     # The spl/zfs spec files expect RPM_BUILD_ROOT to point to the root of the
     # destination for the rpms
     export RPM_BUILD_ROOT=$TOPDIR
-    SPLZFSVER=${SPLZFSVER:-0.6.2}
-    SPLZFSTAG=${SPLZFSTAG:-upstream-master}
+    SPLZFSVER=${SPLZFSVER:-0.7.3}
+    SPLZFSTAG=${SPLZFSTAG:-}
 
     # The files expect a kver to be set to the kernel version .
     local kver=$(find_linux_release)
 
     # The files expect a kver to be set to the kernel version .
     local kver=$(find_linux_release)
@@ -1070,31 +1006,33 @@ build_spl_zfs() {
 
         local rpmpkg
 
 
         local rpmpkg
 
-        [ "$pkg" == "zfs" ] && spldir="$(ls -d $TOPDIR/usr/src/spl-*/|tail -1)"
+        [ "$pkg" == "zfs" ] && spldir="$(ls -d $TOPDIR/usr/src/spl-*|tail -1)"
 
         # need to fetch the repo in order to build it.
         # default to github but allow override
 
         # need to fetch the repo in order to build it.
         # default to github but allow override
-        git clone ${SPLZFSGITREPO:-"https://github.com/zfsonlinux"}/$pkg.git $pkg 2>&1
+       git clone -n ${SPLZFSGITREPO:-"https://github.com/zfsonlinux"}/$pkg.git $pkg 2>&1
 
 
-        pushd $pkg || return 255
+       pushd $pkg || return 255
+       local tag
        if [ -n "$SPLZFSTAG" ]; then
        if [ -n "$SPLZFSTAG" ]; then
-           git checkout $SPLZFSTAG
+           tag=$SPLZFSTAG
        else
        else
-           git checkout -b lbuild $pkg-$SPLZFSVER
+           tag=$pkg-$SPLZFSVER
        fi
        fi
+       git checkout -b lbuild $tag || fatal 1 "Failed to checkout \"$tag\" for $pkg.git"
 
 
-       # This differentiates between older zfs versions
-       if [ -f $pkg-modules.spec.in ]; then
-           rpmpkg=$pkg-modules
-           specdir=.
-           speclist="$pkg.spec $rpmpkg.spec"
-       else
+        # This differentiates between older zfs versions
+        if [ -f $pkg-modules.spec.in ]; then
+            rpmpkg=$pkg-modules
+            specdir=.
+            speclist="$pkg.spec $rpmpkg.spec"
+        else
             rpmpkg=kmod-$pkg-devel
             rpmpkg=kmod-$pkg-devel
-           specdir=rpm/generic
-           speclist="$pkg.spec $pkg-kmod.spec $pkg-dkms.spec"
-       fi
+            specdir=rpm/generic
+            speclist="$pkg.spec $pkg-kmod.spec $pkg-dkms.spec"
+        fi
 
 
-       sh autogen.sh || return 255
+        sh autogen.sh || return 255
 
         if  ! ./configure --with-linux=${LINUX} --with-linux-obj=${LINUXOBJ:-$LINUX} \
                           ${spldir:+--with-spl="${spldir}"} 2>&1 ||
 
         if  ! ./configure --with-linux=${LINUX} --with-linux-obj=${LINUXOBJ:-$LINUX} \
                           ${spldir:+--with-spl="${spldir}"} 2>&1 ||
@@ -1106,40 +1044,37 @@ build_spl_zfs() {
 
         ln -f $pkg/$pkg-*.tar.gz $TOPDIR/SOURCES ||
            error "failed to link $pkg/$pkg-*.tar.gz into $TOPDIR/SOURCES"
 
         ln -f $pkg/$pkg-*.tar.gz $TOPDIR/SOURCES ||
            error "failed to link $pkg/$pkg-*.tar.gz into $TOPDIR/SOURCES"
-       if [ -f $pkg/scripts/kmodtool ]; then
-           ln -f $pkg/scripts/kmodtool $TOPDIR/SOURCES/
-       fi
+        if [ -f $pkg/scripts/kmodtool ]; then
+            ln -f $pkg/scripts/kmodtool $TOPDIR/SOURCES/
+        fi
 
 
-       local rpmb
-       if $DO_SRC; then
-           rpmb=-ba
-       else
-           rpmb=-bb
-       fi
+        local rpmb
+        if $DO_SRC; then
+            rpmb=-ba
+        else
+            rpmb=-bb
+        fi
 
 
-       # set search dir for our own kmodtool to find correct
-       # directories
-       export KERNELSOURCE=$(dirname ${LINUX})
-       # Manually build rpms
-       for spec in $speclist; do
-           echo "Building RPMs from $pkg/$specdir/$spec"
-            if ! $RPMBUILD $rpmb $pkg/$specdir/$spec \
-               --nodeps -v \
-               --define "require_kdir ${LINUX}" \
-               ${LINUXOBJ:+--define "require_kobj ${LINUXOBJ}"} \
-               ${spldir:+--define "require_spldir ${spldir}"} \
-               --define "kver $kver" \
-               --define "kernels $kver" \
-               --define "_tmppath /var/tmp" \
-               --define "kernelbuildroot $TOPDIR/reused" \
-               --define "_topdir $TOPDIR" 2>&1; then
-               return 255
+        # set search dir for our own kmodtool to find correct
+        # directories
+        export KERNELSOURCE=$(dirname ${LINUX})
+        # Manually build rpms
+        for spec in $speclist; do
+            echo "Building RPMs from $pkg/$specdir/$spec"
+            if ! rpmbuild $rpmb $pkg/$specdir/$spec \
+                --nodeps -v \
+                --define "_use_internal_dependency_generator 0" \
+                --define "require_kdir ${LINUX}" \
+                ${LINUXOBJ:+--define "require_kobj ${LINUXOBJ}"} \
+                ${spldir:+--define "require_spldir ${spldir}"} \
+                --define "kver $kver" \
+                --define "kernels $kver" \
+                --define "_tmppath /var/tmp" \
+                --define "kernelbuildroot $TOPDIR/reused" \
+                --define "_topdir $TOPDIR" 2>&1; then
+                return 255
             fi
             fi
-       done
-
-#      $DO_SRC && mv $pkg*.src.rpm $TOPDIR/SRPMS/
-#      mv $pkg*.noarch.rpm $TOPDIR/RPMS/noarch/
-#      mv *$pkg*.$TARGET_ARCH.rpm $TOPDIR/RPMS/$(basearch $TARGET_ARCH)/
+        done
 
         # We have built the rpms for the package. Now we need to extract the
         # contained files so we can build further things against them
 
         # We have built the rpms for the package. Now we need to extract the
         # contained files so we can build further things against them
@@ -1147,23 +1082,29 @@ build_spl_zfs() {
 
         # cpio only extract to pwd so we need to go there.
         pushd $TOPDIR
 
         # cpio only extract to pwd so we need to go there.
         pushd $TOPDIR
-       local rpm
-       for rpm in $rpms; do
+        local rpm
+        for rpm in $rpms; do
             rpm2cpio $rpm | cpio -id
             rpm2cpio $rpm | cpio -id
-       done
+        done
 
         if [ "$pkg" == "zfs" ]; then
 
         if [ "$pkg" == "zfs" ]; then
-            mkdir -p $TOPDIR/zfsdevel
-            pushd $TOPDIR/zfsdevel
-            # We also need to extract zfs-devel rpm
-            local devel_rpm=$(ls -1 $TOPDIR/RPMS/*/$pkg-devel-*.rpm)
-            rpm2cpio $devel_rpm | cpio -id
-            popd
-            CONFIGURE_FLAGS="--with-$pkg-devel=$TOPDIR/zfsdevel ${CONFIGURE_FLAGS}"
+            # We also need to extract both the zfs and zfs-devel rpms
+            # the zfs rpm is needed because it has the actual libraries in
+            # it and the zfs-devel rpm only has unversioned symlinks to the
+            # libraries in the zfs rpm
+            # this will all change one day when we have a libzfs rpm per
+            # https://github.com/zfsonlinux/zfs/issues/2329
+            # and it looks like it could be one day soon:
+            # https://github.com/zfsonlinux/zfs/pull/2341
+            local devel_rpms=$(ls -1 $TOPDIR/RPMS/*/{$pkg-devel,$pkg-$SPLZFSVER,lib*}-*.rpm)
+            for rpm in $devel_rpms; do
+                rpm2cpio $rpm | cpio -id
+            done
+            CONFIGURE_FLAGS="--with-$pkg-devel=$TOPDIR ${CONFIGURE_FLAGS}"
         fi
         popd
 
         fi
         popd
 
-        CONFIGURE_FLAGS="--with-$pkg=$(ls -d $TOPDIR/usr/src/$pkg-*/|tail -1) ${CONFIGURE_FLAGS}"
+        CONFIGURE_FLAGS="--with-$pkg=$(ls -d $TOPDIR/usr/src/$pkg-*|tail -1) ${CONFIGURE_FLAGS}"
         CONFIGURE_FLAGS="--with-$pkg-obj=$(ls -d $TOPDIR/usr/src/$pkg-*/$kver*|tail -1) ${CONFIGURE_FLAGS}"
     done
 
         CONFIGURE_FLAGS="--with-$pkg-obj=$(ls -d $TOPDIR/usr/src/$pkg-*/$kver*|tail -1) ${CONFIGURE_FLAGS}"
     done
 
@@ -1172,46 +1113,15 @@ build_spl_zfs() {
     return 0
 }
 
     return 0
 }
 
-prepare_mpss() {
-
-    pushd mpss >/dev/null || return 255
-    if [ "${MPSS_VERSION%%.*}" = "3" ]; then
-        cp -f ../boot/config-* .config
-        if ! make ARCH=k1om silentoldconfig ; then
-            popd >/dev/null
-            return 1
-        fi
-        if ! make ARCH=k1om modules_prepare ; then
-            popd >/dev/null
-            return 1
-        fi
-        cp -f ../boot/Module.symvers-* Module.symvers
-    else
-        if ! make defconfig-miclinux; then
-            popd >/dev/null
-            return 1
-        fi
-        if ! make -C card/kernel ARCH=k1om modules_prepare ; then
-            popd >/dev/null
-            return 1
-        fi
-    fi
-    popd >/dev/null
-
-}
-
 stage() {
 
     [ "$STAGEDIR" ] || return 0
 
 stage() {
 
     [ "$STAGEDIR" ] || return 0
 
-    for arch in $BUILD_ARCHS; do
-        rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
-        echo "${0##*/}: Copying RPMs into ${rpmdir}"
-        mkdir -p "${rpmdir}"
-        cp -v RPMS/${arch}/*.rpm "${rpmdir}"
-        if [ -d RPMS/noarch ]; then
-            cp -v RPMS/noarch/*.rpm "${rpmdir}"
-        fi
+    rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${TARGET_ARCH}"
+    echo "${0##*/}: Copying RPMs into ${rpmdir}"
+    mkdir -p "${rpmdir}"
+    for rpm in $(ls RPMS/${TARGET_ARCH}/*.rpm RPMS/noarch/*.rpm); do
+        cp -v $rpm "${rpmdir}"
     done
 
     cp -v "$LUSTRE" "$STAGEDIR"
     done
 
     cp -v "$LUSTRE" "$STAGEDIR"
@@ -1267,10 +1177,6 @@ _find_linux_release() {
 
 # unpack kernel(/source/devel) RPM
 #
 
 # unpack kernel(/source/devel) RPM
 #
-# This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
-# needs to completely refactored.  It completely ingores that $BUILD_ARCHS may
-# contain a list of arches for which rpmbuild commands (including the one for
-# lustre itself)
 unpack_linux_devel_rpm() {
     local kernelrpm="${1}"
 
 unpack_linux_devel_rpm() {
     local kernelrpm="${1}"
 
@@ -1284,8 +1190,8 @@ unpack_linux_devel_rpm() {
     fi
 
     # call a distro specific hook, if available
     fi
 
     # call a distro specific hook, if available
-    if type -p unpack_linux_devel_rpm-$DISTRO; then
-        if ! unpack_linux_devel_rpm-$DISTRO "$kernelrpm"; then
+    if type -p unpack_linux_devel_rpm-$DISTROMAJ; then
+        if ! unpack_linux_devel_rpm-$DISTROMAJ "$kernelrpm"; then
             return 255
         fi
     fi
             return 255
         fi
     fi
@@ -1302,22 +1208,25 @@ build_kernel_ib() {
     local linux="$1"
     local kib_prefix="$2"
     local kib_rpm="$3"
     local linux="$1"
     local kib_prefix="$2"
     local kib_rpm="$3"
+    local ofed_type="${4}"
+    local ofed_version="${5}"
 
     # build kernel-ib{,-devel}/compat-rdma{,-devel}
     local K_SRC="K_SRC"
 
     # build kernel-ib{,-devel}/compat-rdma{,-devel}
     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
 
 
-    local OFED_CORE="--with-core-mod --with-ipoib-mod --with-sdp-mod --with-user_mad-mod --with-user_access-mod --with-addr_trans-mod"
-    local OFED_HARDWARE="--with-mthca-mod --with-mlx4-mod --with-mlx4_en-mod --with-cxgb3-mod --with-nes-mod"
+       local OFED_CORE="--with-core-mod --with-ipoib-mod --with-user_mad-mod \
+       --with-user_access-mod --with-addr_trans-mod --with-madeye-mod"
+       local OFED_HARDWARE="--with-mthca-mod --with-mlx4-mod \
+       --with-mlx4_en-mod --with-cxgb3-mod --with-mlx4_en-mod \
+       --with-cxgb3-mod --with-nes-mod --with-mlx5-mod --with-cxgb4-mod \
+       --with-qib-mod"
 
 
-    if compare_version $OFED_VERSION 3.0; then
-       OFED_CORE="$OFED_CORE --with-madeye-mod --with-rds-mod"
-    else
-       OFED_HARDWARE="$OFED_HARDWARE --with-cxgb4-mod"
-    fi
+       # Removing the check for older version support
+       #if compare_version $OFED_VERSION 3.0; then
+       #OFED_CORE="$OFED_CORE --with-madeye-mod --with-rds-mod"
+       #else
+       #OFED_HARDWARE="$OFED_HARDWARE --with-mlx5-mod --with-cxgb4-mod --with-ocrdma-mod --with-qib-mod"
+       #fi
 
     # some I/B drivers are architecture dependent and kernel-ib's configure
     # does not figure it out for us ~sigh~
 
     # some I/B drivers are architecture dependent and kernel-ib's configure
     # does not figure it out for us ~sigh~
@@ -1384,20 +1293,40 @@ EOF
     fi
 
     local linuxrelease=$(find_linux_release)
     fi
 
     local linuxrelease=$(find_linux_release)
-    if compare_version $OFED_VERSION 3.0; then
-        local OFA_KERNEL_RELEASE=$(echo -n ${linuxrelease} | sed -e 's/-/_/g')
-    fi
-    if ! $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
-                  ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
-                  --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
-                  --define "KVERSION ${linuxrelease}" \
-                  --define "$K_SRC ${linux}" \
-                  --define "LIB_MOD_DIR /lib/modules/${linuxrelease}/updates" \
-                  ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
-                  --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
-                  ${SOURCE} 2>&1; then
-        fatal 1 "Error building ${kib_rpm}"
-    fi
+       # a place to change/add any unique config
+       case $ofed_type in
+               ofa|ifs) local K_SRC_OBJ="K_SRC_OBJ"
+               if ! $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' \
+                       --define 'build_kernel_ib_devel 1' \
+                       ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
+                       --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
+                       --define "KVERSION ${linuxrelease}" \
+                       --define "$K_SRC ${linux}" \
+                       ${K_SRC_OBJ:+--define "$K_SRC_OBJ ${linux}"} \
+                       ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
+                       --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
+                       ${SOURCE} 2>&1; then
+                       fatal 1 "Error building ${kib_rpm}"
+               fi
+               ;;
+               mlnx)
+               if ! $RPMBUILD $BUILD_TYPE \
+                       ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
+                       --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
+                       --define "KVERSION ${linuxrelease}" \
+                       --define "$K_SRC ${linux}" \
+                       ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
+                       --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
+                       ${SOURCE} 2>&1; then
+                       fatal 1 "Error building ${kib_rpm}"
+               fi
+               # now that we have the kernel rpms, we need to lib rpms too
+               # we don't have to rebuild since MOFED include the binaries
+               cp -f OFED_RPMS/{libibmad-*,libibverbs-*,libibumad-*,librdmacm*,ibutils-*,opensm-libs*}.${TARGET_ARCH}.rpm \
+                       ${TOPDIR}/RPMS/${TARGET_ARCH} || \
+                       fatal 1 "Failed to copy MOFED rpms"
+               ;;
+       esac
 
 }
 
 
 }
 
@@ -1537,8 +1466,6 @@ build_kernel_with_srpm() {
     do_patch_linux false >&${outfd}    # sets global $FULL_PATCH (yeah, yuck)
 
     # get an md5sum of the kernel patch + config for reuse check
     do_patch_linux false >&${outfd}    # sets global $FULL_PATCH (yeah, yuck)
 
     # get an md5sum of the kernel patch + config for reuse check
-    # XXX really, there needs to be a signature and a CONFIG_FILE per arch
-    #     in BUILD_ARCHS
     local release_str
     if $RELEASE; then
         local release_str="RELEASE=$RELEASE\n"
     local release_str
     if $RELEASE; then
         local release_str="RELEASE=$RELEASE\n"
@@ -1547,8 +1474,12 @@ build_kernel_with_srpm() {
     if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
         local REUSE_SIGNATURE=$({ echo -en $release_str;
                                   echo $BUILD_GEN;
     if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
         local REUSE_SIGNATURE=$({ echo -en $release_str;
                                   echo $BUILD_GEN;
-                                  cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH;
-                                  cat $LBUILD_DIR/lbuild $LBUILD_DIR/lbuild-${DISTRO}; } |
+                                  cat "$CONFIG_FILE";
+                                  cat "$TARGET_FILE" |
+                                  sed -e '/_VERSION=/s/_[0-9]*_g.*$//g';
+                                  cat "$FULL_PATCH";
+                                  cat "$LBUILD_DIR/lbuild";
+                                  cat "$LBUILD_DIR/lbuild-$DISTROMAJ"; } |
                                 md5sum | cut -d" " -f1)
         # see if we can link to the reuse pool
         # XXX - hrm.  i'm not convinced this doesn't belong in the reuse
                                 md5sum | cut -d" " -f1)
         # see if we can link to the reuse pool
         # XXX - hrm.  i'm not convinced this doesn't belong in the reuse
@@ -1567,10 +1498,8 @@ build_kernel_with_srpm() {
     if ! $USE_BUILD_CACHE || ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
                                    "$REUSE_SIGNATURE"; then
         # nothing cached, build from scratch
     if ! $USE_BUILD_CACHE || ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
                                    "$REUSE_SIGNATURE"; then
         # nothing cached, build from scratch
-        if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
-            echo "Downloading kernel SRPM" >&${outfd}
-            download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&${outfd}
-        fi
+       echo "Downloading kernel SRPM" >&${outfd}
+       download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&${outfd}
 
         if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
                   --define "_topdir $TOPDIR" >&${outfd} 2>&1; then
 
         if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
                   --define "_topdir $TOPDIR" >&${outfd} 2>&1; then
@@ -1625,16 +1554,14 @@ build_kernel_with_srpm() {
 #    CONFIGURE_FLAGS
 
 build_ofed() {
 #    CONFIGURE_FLAGS
 
 build_ofed() {
-    local linux="$1"
-    local ofed_version="$2"
-    local kib_prefix
-    local kib_rpm
-
-    # if an ofed version is given, then it means use OFED proper,
-    # not any vendor specific "inkernel" version
-    if [ -z "$ofed_version" ]; then
-        return 0
-    fi
+       local linux="$1"
+       local ofed_type="$2"
+       local ofed_version="$3"
+       local kib_prefix
+       local kib_rpm
+       local pre_prefix
+       local o2ib_location
+       local rpm
 
     if [ "$ofed_version" = "inkernel" ]; then
         # see if there is a distro specific override for this and use
 
     if [ "$ofed_version" = "inkernel" ]; then
         # see if there is a distro specific override for this and use
@@ -1642,22 +1569,33 @@ build_ofed() {
         # XXX we need to better integrate a distro specific override with
         #     the rest of this function so that all of the reuse cache
         #     stuff is leveraged given that 80% of this function is reuse
         # XXX we need to better integrate a distro specific override with
         #     the rest of this function so that all of the reuse cache
         #     stuff is leveraged given that 80% of this function is reuse
-        if type -p build_ofed-${DISTRO}; then
+        if type -p build_ofed-$DISTROMAJ; then
             local ofed_location
             local ofed_location
-            ofed_location=$(build_ofed-${DISTRO} ${STDOUT})
+            ofed_location=$(build_ofed-$DISTROMAJ ${STDOUT})
             local rc=${PIPESTATUS[0]}
             CONFIGURE_FLAGS="--with-o2ib=${ofed_location} ${CONFIGURE_FLAGS}"
             return $rc
         else
             return 0
         fi
             local rc=${PIPESTATUS[0]}
             CONFIGURE_FLAGS="--with-o2ib=${ofed_location} ${CONFIGURE_FLAGS}"
             return $rc
         else
             return 0
         fi
-    elif compare_version $OFED_VERSION 3.0; then
-       kib_prefix="ofa_kernel"
-       kib_rpm="kernel-ib"
-    else
-       kib_prefix="compat-rdma"
-       kib_rpm="compat-rdma"
-    fi
+       else
+               case $ofed_type in
+                       mlnx) # no compat-rdma for mlnx as of 3.1
+                               kib_prefix="ofa_kernel"
+                               pre_prefix="mlnx-"
+                               kib_rpm="${pre_prefix}${kib_prefix}"
+                               ;;
+                       ofa|ifs)
+                               if compare_version $ofed_version 3.0; then
+                                       kib_prefix="ofa_kernel"
+                                       kib_rpm="${pre_prefix}${kib_prefix}"
+                               else
+                                       kib_prefix="compat-rdma"
+                                       kib_rpm="compat-rdma"
+                               fi
+                               ;;
+               esac
+       fi
 
     # build kernel-ib/compat-rdma
     if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
 
     # build kernel-ib/compat-rdma
     if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
@@ -1665,8 +1603,8 @@ build_ofed() {
                                   echo "$(find_linux_release;
                                   echo "$BUILD_GEN")";
                                   cat "${linux}/include/linux/autoconf.h";
                                   echo "$(find_linux_release;
                                   echo "$BUILD_GEN")";
                                   cat "${linux}/include/linux/autoconf.h";
-                                  cat "$LBUILD_DIR/lbuild" ;
-                                  cat "$LBUILD_DIR/lbuild-${DISTRO}"; } |
+                                  cat "$LBUILD_DIR/lbuild";
+                                  cat "$LBUILD_DIR/lbuild-$DISTROMAJ"; } |
                                 md5sum | cut -d" " -f1)
         # see if we can link to the reuse pool
         # XXX - hrm.  i'm not convinced this doesn't belong in the reuse
                                 md5sum | cut -d" " -f1)
         # see if we can link to the reuse pool
         # XXX - hrm.  i'm not convinced this doesn't belong in the reuse
@@ -1694,7 +1632,7 @@ build_ofed() {
             create_rpmbuild_dirs
         fi
         # build it
             create_rpmbuild_dirs
         fi
         # build it
-        build_kernel_ib "${linux}" "${kib_prefix}" "${kib_rpm}"
+       build_kernel_ib "${linux}" "${pre_prefix}${kib_prefix}" "${kib_rpm}" "${ofed_type}"
 
         if [ -z "$REUSE_SIGNATURE" ]; then
             echo "No reuse signature was caculated so not storing the built ofed"
 
         if [ -z "$REUSE_SIGNATURE" ]; then
             echo "No reuse signature was caculated so not storing the built ofed"
@@ -1717,67 +1655,96 @@ build_ofed() {
     rm -rf ${kib_rpm}-devel
     mkdir ${kib_rpm}-devel
     cd ${kib_rpm}-devel
     rm -rf ${kib_rpm}-devel
     mkdir ${kib_rpm}-devel
     cd ${kib_rpm}-devel
-    # the actual ofed RPMs don't have the -rc$n or -$date string appened that
-    # might be present on the file
-    #local linuxrelease=$(find_linux_release)
-    #ofed_version=$(echo $ofed_version |
-    #               sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
-    # FIXME
-    # OFED version will have 'hyphen' for minor release. (e.g. 3.5-1, instead
-    # of 3.5.1) compat-rdma and compat-rdma-devel could have same version
-    # number, but currectly not. Once OFED fix this in the future release, we
-    # can remove following filter.
-    #ofed_version=$(echo $ofed_version |
-    #               sed -re 's/-([0-9]*-[rR][cC][0-9]*)$//')
-    #local rpm=$(ls $TOPDIR/RPMS/*/${kib_rpm}-devel-${ofed_version}-${linuxrelease//-/_}.*.rpm)
-    # I dont' know why we have gone through the trouble to filter out the name
-    # of the rpm there should only be one ${kib_rpm}-devel built
-    local rpm=$(ls $TOPDIR/RPMS/*/${kib_rpm}-devel-*.rpm)
-    if ! rpm2cpio < $rpm | cpio -id; then
-        fatal 1 "could not unpack the ${kib_rpm}-devel rpm."
-    fi
-    CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/${kib_prefix} ${CONFIGURE_FLAGS}"
-    popd >/dev/null
+
+       o2ib_location="$(pwd)/usr/src/${kib_prefix}"
+       case $ofed_type in
+               mlnx) # Prior to MOFED 3.1, we had to use build_kernel_ib=1 to
+                     # build devel rpm. not so after 3.1
+                       if compare_version $ofed_version 3.0; then
+                               rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${ofed_version%%-*}-*.rpm)
+                       else
+                               rpm=$(ls $TOPDIR/RPMS/*/${kib_rpm}-devel-${ofed_version%%-*}-*.rpm)
+                       fi
+                       o2ib_location="${o2ib_location}/default"
+                       ;;
+               ofa) # Prior to OFA 3.18, we had to use build_kernel_ib=1 during configure,
+                    # not so after 3.18
+                       if compare_version $ofed_version 3.18; then
+                               rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${ofed_version%%-*}-*.rpm)
+                       else
+                               rpm=$(ls $TOPDIR/RPMS/*/${kib_rpm}-devel-${ofed_version%%-*}-*.rpm)
+                       fi
+                       ;;
+               ifs) # ifs doesn't follow any convention (if any)
+                       rpm=$(ls $TOPDIR/RPMS/*/${kib_rpm}-devel-*.rpm)
+                       ;;
+       esac
+
+       if ! rpm2cpio < $rpm | cpio -id; then
+               fatal 1 "could not unpack the $rpm."
+       fi
+       CONFIGURE_FLAGS="--with-o2ib=${o2ib_location} ${CONFIGURE_FLAGS}"
+       popd >/dev/null
 
 }
 
 build_with_srpm() {
 
 }
 
 build_with_srpm() {
-
-    if ! $PATCHLESS; then
-        local kernel_extra_version
-        if ! kernel_extra_version=$(build_kernel_with_srpm ${STDOUT}); then
-            fatal 1 "Failed to build the kernel from it's SRPM"
-        fi
-
-        for arch in $BUILD_ARCHS; do
-            local kernel_devel_rpm
-            if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name $KERNEL_LUSTRE_NAMING) ="); then
-                fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
-            fi
-
-            # install the -devel RPM in preparation for modules builds
-            if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \
-                           "$TOPDIR/RPMS/$arch/$kernel_devel_rpm"; then
-                fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
-            fi
-        done
-    else
-        # need to find and unpack the vendor's own kernel-devel for patchless
-        # client build
-        local kernelrpm
-        if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE"); then
-            fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
-        fi
-        if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then
-            fatal 1 "Could not find the Linux tree in $kernelrpm"
-        fi
-    fi
+       local ofed_type="$1"
+       local ofed_version="$2"
+       local kernelrpm
+
+       if ! $PATCHLESS; then
+               if $PATCHLESS_SERVER; then
+                       # need to find and unpack the vendor's own kernel-devel
+                       # for patchless server build
+                       if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE"); then
+                               fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in $KERNELRPMSBASE/$lnxmaj/$DISTROMAJ"
+                       fi
+                       if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then
+                               fatal 1 "Could not find the Linux tree in $kernelrpm"
+                       fi
+                       # download and unpack kernel-debuginfo-common (only in EL)
+                       if [[ $DISTROMAJ =~ rhel ]]; then
+                               local KERNEL_DEBUGINFO="kernel-debuginfo-common-${TARGET_ARCH}-${lnxmaj}-${lnxrel}.${TARGET_ARCH}.rpm"
+                               download_debuginfo_common "$KERNEL_DEBUGINFO"
+                               if ! lnxrel="$lnxrel" unpack_linux_devel_rpm \
+                                       "$KERNELRPMSBASE/$lnxmaj/$DISTROMAJ/$TARGET_ARCH/$KERNEL_DEBUGINFO"; then
+                                       fatal 1 "Could not find the Linux debuginfo common rpm in $KERNELRPMSBASE/$lnxmaj/$DISTROMAJ/$TARGET_ARCH/$KERNEL_DEBUGINFO"
+                               fi
+                       fi
+               else
+                       local kernel_extra_version
+                       if ! kernel_extra_version=$(build_kernel_with_srpm ${STDOUT}); then
+                               fatal 1 "Failed to build the kernel from it's SRPM"
+                       fi
+
+                       local kernel_devel_rpm
+                       if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/${TARGET_ARCH}/" provides "^$(devel_kernel_name $KERNEL_LUSTRE_NAMING) ="); then
+                               fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/${TARGET_ARCH}/"
+                       fi
+
+                       # install the -devel RPM in preparation for modules builds
+                       if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \
+                               "$TOPDIR/RPMS/${TARGET_ARCH}/$kernel_devel_rpm"; then
+                               fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/${TARGET_ARCH}/$kernel_devel_rpm"
+                       fi
+               fi
+       else
+               # need to find and unpack the vendor's own kernel-devel for patchless
+               # client build
+               if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE"); then
+                       fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in $KERNELRPMSBASE/$lnxmaj/$DISTROMAJ"
+               fi
+               if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then
+                       fatal 1 "Could not find the Linux tree in $kernelrpm"
+               fi
+       fi
 
     # ~sigh~  have to make copies of and modify some of the rpm
     # infrastructure files so that find-requires can find our unpacked
     # kernel-devel artifacts
     cp $RPM_HELPERS_DIR/{symset-table,find-requires{,.ksyms}} .
 
     # ~sigh~  have to make copies of and modify some of the rpm
     # infrastructure files so that find-requires can find our unpacked
     # kernel-devel artifacts
     cp $RPM_HELPERS_DIR/{symset-table,find-requires{,.ksyms}} .
-    FIND_REQUIRES="$(pwd)/find-requires"
+    export FIND_REQUIRES="$(pwd)/find-requires"
     chmod 755 {symset-table,find-requires{,.ksyms}}
     local tmp="$(pwd)"
     tmp="${tmp//\//\\/}"
     chmod 755 {symset-table,find-requires{,.ksyms}}
     local tmp="$(pwd)"
     tmp="${tmp//\//\\/}"
@@ -1794,6 +1761,7 @@ EOF
 set -x
 .
 g/\/.*\/\(symset-table\)/s//$tmp\/\1/g
 set -x
 .
 g/\/.*\/\(symset-table\)/s//$tmp\/\1/g
+g/\(\/usr\/src\/kernels\/\)/s//$tmp\/reused\1/g
 wq
 EOF
     ed symset-table <<EOF
 wq
 EOF
     ed symset-table <<EOF
@@ -1805,7 +1773,7 @@ g/\(\/usr\/src\/kernels\/\)/s//$tmp\/reused\1/g
 wq
 EOF
 
 wq
 EOF
 
-    build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
+       build_ofed "${LINUXOBJ:-$LINUX}" "$ofed_type" "$ofed_version" ||
         fatal 1 "error building OFED"
 
     # now build Lustre
         fatal 1 "error building OFED"
 
     # now build Lustre
@@ -1851,20 +1819,13 @@ EOF
 
 create_rpmbuild_dirs() {
 
 
 create_rpmbuild_dirs() {
 
-    [ -d RPMS ] || mkdir RPMS
-    for arch in $BUILD_ARCHS; do
-        if [[ $arch = i?86 ]]; then
-            # some stupidity in the sles11 kernel spec requires an RPMS/i386
-            # even if the target arch is i686
-            [ -d RPMS/i386 ] || mkdir RPMS/i386
-        fi
-        [ -d RPMS/$arch ] || mkdir RPMS/$arch
-    done
-    [ -d RPMS/noarch ] || mkdir RPMS/noarch
-    [ -d BUILD ] || mkdir BUILD
-    [ -d SOURCES ] || mkdir SOURCES
-    [ -d SPECS ] || mkdir SPECS
-    [ -d SRPMS ] || mkdir SRPMS
+       [ -d RPMS ] || mkdir RPMS
+       [ -d RPMS/${TARGET_ARCH} ] || mkdir RPMS/${TARGET_ARCH}
+       [ -d RPMS/noarch ] || mkdir RPMS/noarch
+       [ -d BUILD ] || mkdir BUILD
+       [ -d SOURCES ] || mkdir SOURCES
+       [ -d SPECS ] || mkdir SPECS
+       [ -d SRPMS ] || mkdir SRPMS
 
 }
 
 
 }
 
@@ -1966,7 +1927,11 @@ set -E
 
 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
 
 
 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
 
-options=$(getopt -o D:h -l kerneltree:,distro:,kernelrpm:,reusebuild:,patchless,ldiskfs,ccache,reuse:,norpm,disable-datestamp,external-patches:,timestamp:,extraversion:,kerneldir:,linux:,lustre:,nodownload,nosrc,noiokit,ofed-version:,mpss-version:,publish,release,set-value:,src,stage:,tag:,target:,target-archs:,with-linux:,xen -- "$@")
+options=$(getopt -o D:h -l kerneltree:,distro:,kernelrpm:,reusebuild:,\
+patchless,patchless-server,ccache,norpm,external-patches:,timestamp:,\
+extraversion:,kerneldir:,linux:,lustre:,nodownload,nosrc,noiokit,ofed-type:,\
+ofed-version:,mlnx-version:,ofed-src:,publish,disable-zfs,release,set-value:,\
+src,stage:,target:,with-linux:,xen -- "$@")
 
 if [ $? != 0 ]; then
     usage 1
 
 if [ $? != 0 ]; then
     usage 1
@@ -2018,10 +1983,6 @@ while [ "$1" ]; do
             DISTRO=$2
             shift 2
             ;;
             DISTRO=$2
             shift 2
             ;;
-        --reuserpm)
-            REUSERPM=$2
-            shift 2
-            ;;
         --reusebuild)
             if ! REUSEBUILD=$(canon_path "$2"); then
                 fatal 1 "Could not determine the canonical location of $2"
         --reusebuild)
             if ! REUSEBUILD=$(canon_path "$2"); then
                 fatal 1 "Could not determine the canonical location of $2"
@@ -2029,11 +1990,6 @@ while [ "$1" ]; do
             shift 2
             ;;
         --norpm)
             shift 2
             ;;
         --norpm)
-            NORPM=true
-            shift
-            ;;
-        --ldiskfs)
-           echo "WARNING: \"--ldiskfs\" is deprecated" > 2
             shift
             ;;
         --noiokit)
             shift
             ;;
         --noiokit)
@@ -2044,6 +2000,10 @@ while [ "$1" ]; do
             PATCHLESS=true
             shift
             ;;
             PATCHLESS=true
             shift
             ;;
+       --patchless-server)
+               PATCHLESS_SERVER=true
+               shift
+               ;;
         --kernelrpm)
             if ! KERNELRPMSBASE=$(canon_path "$2"); then
                 fatal 1 "Could not determine the canonical location of $2"
         --kernelrpm)
             if ! KERNELRPMSBASE=$(canon_path "$2"); then
                 fatal 1 "Could not determine the canonical location of $2"
@@ -2072,13 +2032,21 @@ while [ "$1" ]; do
             OFED_VERSION="$2"
             shift 2
             ;;
             OFED_VERSION="$2"
             shift 2
             ;;
-        --mpss-version)
-            MPSS_VERSION="$2"
-            shift 2
-            ;;
+       --ofed-type)
+               OFED_TYPE="$2"
+               shift 2
+               ;;
+       --ofed-src)
+               OFED_SRC="$2"
+               shift 2
+               ;;
         --publish)
             shift
             ;;
         --publish)
             shift
             ;;
+       --disable-zfs)
+           WITH_ZFS="no"
+           shift
+           ;;
         --release)
             RELEASE=true
             shift
         --release)
             RELEASE=true
             shift
@@ -2091,18 +2059,10 @@ while [ "$1" ]; do
             STAGEDIR=$2
             shift 2
             ;;
             STAGEDIR=$2
             shift 2
             ;;
-        --tag)
-            shift 2
-            echo "WARNING: \"--tag\" is deprecated" > 2
-            ;;
         --target)
             TARGET=$2
             shift 2
             ;;
         --target)
             TARGET=$2
             shift 2
             ;;
-        --target-archs)
-            TARGET_ARCHS=$2
-            shift 2
-            ;;
         --xen)
             XEN=true
             shift
         --xen)
             XEN=true
             shift
@@ -2131,75 +2091,12 @@ check_options
 
 unpack_lustre
 
 
 unpack_lustre
 
-# XXX - should we _always_ get the buildid from the META file?  what are the
-# other (i.e. non-lustre-tarball use cases of lbuild)?
-BUILDID=$(sed -ne '/^BUILDID =/s/.*= *//p' lustre/META)
-VERSION=$(sed -ne '/^VERSION =/s/.*= *//p' lustre/META)
-
 load_target
 
 load_target
 
-if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
-    download_ofed
-    unpack_ofed || fatal 1 "Error unpacking OFED tarball"
-fi
-
-if [ -n "$MPSS_VERSION" ]; then
-    [ -z "$MPSS_DISTRO" ] && MPSS_DISTRO=$(autodetect_distro)
-
-    MPSS_INFO=$(mktemp -u mpss-info-XXXXXXXXXX.html)
-    download_mpss_info "$MPSS_INFO"
-
-    if [ "$MPSS_VERSION" = "last" ]; then
-        MPSS_VERSION=$(parse_mpss_info "$MPSS_INFO" "" ${MPSS_DISTRO})
-        [ -z "$MPSS_VERSION" ] && fatal 1 "Could not determine the last MPSS version"
-    elif [[ $MPSS_VERSION != [0-9].[0-9].[0-9]*-[0-9]* ]]; then
-        fatal 1 "Incorrect MPSS version $MPSS_VERSION"
-    fi
-
-    download_mpss "$MPSS_INFO"
-    [ -r "$MPSS_INFO" ] && rm -f "$MPSS_INFO"
-    echo "Building with MPSS $MPSS_VERSION"
-    unpack_mpss  || fatal 1 "Error unpacking MPSS tarballs"
-    prepare_mpss || fatal 1 "Error preparing MPSS for kernel modules build"
-
-    if [ -z "$MPSS_OFED" ]; then
-        MPSS_OFED=$(find $PWD -type f -path "*/ofed-driver-*/Module.symvers")
-        if [ -n "$MPSS_OFED" ]; then
-            MPSS_OFED="--with-o2ib=$(dirname $MPSS_OFED)"
-        else
-            MPSS_OFED="--without-o2ib"
-        fi
-    fi
-
-    # disable unsupported parts:
-    PATCHLESS=true
-    IOKITRPM=false
-    LDISKFSRPM=false
-    ZFSNOTSUPPORTED="yes"
-
-    # define variables for cross compilation:
-    CROSS_SUFFIX="-mic"
-    if [ "${MPSS_VERSION%%.*}" = "3" ]; then
-        CC_TARGET_ARCH=k1om-mpss-linux
-        LINUX="$TOPDIR/mpss"
-    else
-        CC_TARGET_ARCH=x86_64-k1om-linux
-        LINUX="$TOPDIR/mpss/card/kernel"
-        RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"cross_requires intel-mic-gpl = ${MPSS_VERSION%%-*}\""
-    fi
-    CONFIGURE_FLAGS="$CONFIGURE_FLAGS $MPSS_OFED --host=$CC_TARGET_ARCH --build=x86_64-pc-linux"
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"post_script build/gen_filelist.sh\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"make_args ARCH=k1om CROSS_COMPILE=${CC_TARGET_ARCH}-\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"cross_path ${CROSS_PATH:=/opt/lustre/${VERSION}/${CC_TARGET_ARCH}}\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"rootdir %{cross_path}\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"_prefix %{cross_path}/usr\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"_mandir %{_prefix}/share/man\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"_sysconfdir %{cross_path}/etc\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"kmoddir extra\""
-
-    # redefine CC for proper ./configure during rpmbuild
-    export CC=${CC_TARGET_ARCH}-gcc
-fi
+       if [ -n "$OFED_TYPE" -a "$OFED_TYPE" != "inkernel" ]; then
+               download_ofed "$OFED_TYPE" "$OFED_VERSION"
+               unpack_ofed "$OFED_TYPE" "$OFED_VERSION" || fatal 1 "Error unpacking OFED tarball"
+       fi
 
 # make sure the RPM build environment is set up
 create_rpmbuild_dirs
 
 # make sure the RPM build environment is set up
 create_rpmbuild_dirs
@@ -2210,15 +2107,15 @@ if [ -n "$LINUX" ]; then
     find_linux_release() {
         _find_linux_release $LINUX
     }
     find_linux_release() {
         _find_linux_release $LINUX
     }
-    build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
+       build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_TYPE" "$OFED_VERSION" ||
         fatal 1 "error building OFED"
     build_lustre "$LINUX" "$LINUXOBJ"
 else
         fatal 1 "error building OFED"
     build_lustre "$LINUX" "$LINUXOBJ"
 else
-    if [ ! -f "${LBUILD_DIR}/lbuild-$DISTRO" ]; then
-        fatal 1 "${LBUILD_DIR}/lbuild-$DISTRO not found"
+    if [ ! -f "${LBUILD_DIR}/lbuild-$DISTROMAJ" ]; then
+        fatal 1 "${LBUILD_DIR}/lbuild-$DISTROMAJ not found"
     fi
     fi
-    source ${LBUILD_DIR}/lbuild-$DISTRO
-    build_with_srpm || fatal 1 "Failed to build_with_srpm"
+    source ${LBUILD_DIR}/lbuild-$DISTROMAJ
+       build_with_srpm "$OFED_TYPE" "$OFED_VERSION" || fatal 1 "Failed to build_with_srpm"
 fi
 
 stage
 fi
 
 stage