diff --git a/.gitignore b/.gitignore
index 91934d6..7163ca1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/openmpi-4.0.5.tar.bz2
+SOURCES/openmpi-4.1.1.tar.bz2
diff --git a/.openmpi.metadata b/.openmpi.metadata
index f532325..2f44671 100644
--- a/.openmpi.metadata
+++ b/.openmpi.metadata
@@ -1 +1 @@
-01fba71461dd0c89e191e3bf1eb70e832d1aa5db SOURCES/openmpi-4.0.5.tar.bz2
+fa4dc97da18c8c26d5aadb85262a0f2d52b1aa90 SOURCES/openmpi-4.1.1.tar.bz2
diff --git a/SOURCES/0001-Revert-ucx-check-supported-transports-and-devices-fo.patch b/SOURCES/0001-Revert-ucx-check-supported-transports-and-devices-fo.patch
new file mode 100644
index 0000000..2871232
--- /dev/null
+++ b/SOURCES/0001-Revert-ucx-check-supported-transports-and-devices-fo.patch
@@ -0,0 +1,367 @@
+From 63c80c7692e55f634cbca6f67cc5c9cdef3a04d2 Mon Sep 17 00:00:00 2001
+From: Honggang Li <honli@redhat.com>
+Date: Mon, 28 Jun 2021 21:38:13 +0800
+Subject: [PATCH] Revert "ucx: check supported transports and devices for
+ setting priority"
+
+This reverts commit c36d7459b6331c4da825cad5a64326e7c1a272aa.
+---
+ contrib/platform/mellanox/optimized.conf |   2 -
+ ompi/mca/pml/ucx/pml_ucx_component.c     |  15 +-
+ opal/mca/common/ucx/common_ucx.c         | 202 +----------------------
+ opal/mca/common/ucx/common_ucx.h         |  15 --
+ opal/mca/common/ucx/configure.m4         |   2 -
+ 5 files changed, 2 insertions(+), 234 deletions(-)
+
+diff --git a/contrib/platform/mellanox/optimized.conf b/contrib/platform/mellanox/optimized.conf
+index 543fd8d1e224..b86b37c9e2fa 100644
+--- a/contrib/platform/mellanox/optimized.conf
++++ b/contrib/platform/mellanox/optimized.conf
+@@ -61,8 +61,6 @@
+ coll = ^ml
+ hwloc_base_binding_policy = core
+ btl = self
+-pml_ucx_tls = any
+-pml_ucx_devices = any
+ # Basic behavior to smooth startup
+ mca_base_component_show_load_errors = 0
+ orte_abort_timeout = 10
+diff --git a/ompi/mca/pml/ucx/pml_ucx_component.c b/ompi/mca/pml/ucx/pml_ucx_component.c
+index 6aed6c41d11d..ed9cc6573e8e 100644
+--- a/ompi/mca/pml/ucx/pml_ucx_component.c
++++ b/ompi/mca/pml/ucx/pml_ucx_component.c
+@@ -107,26 +107,13 @@ static mca_pml_base_module_t*
+ mca_pml_ucx_component_init(int* priority, bool enable_progress_threads,
+                            bool enable_mpi_threads)
+ {
+-    opal_common_ucx_support_level_t support_level;
+     int ret;
+ 
+-    support_level = opal_common_ucx_support_level(ompi_pml_ucx.ucp_context);
+-    if (support_level == OPAL_COMMON_UCX_SUPPORT_NONE) {
+-        return NULL;
+-    }
+-
+     if ( (ret = mca_pml_ucx_init(enable_mpi_threads)) != 0) {
+         return NULL;
+     }
+ 
+-    /*
+-     * If found supported devices - set to the configured (high) priority.
+-     * Otherwise - Found only supported transports (which could be exposed by
+-     *             unsupported devices), so set a priority lower than ob1.
+-     */
+-    *priority = (support_level == OPAL_COMMON_UCX_SUPPORT_DEVICE) ?
+-                ompi_pml_ucx.priority : 19;
+-    PML_UCX_VERBOSE(2, "returning priority %d", *priority);
++    *priority = ompi_pml_ucx.priority;
+     return &ompi_pml_ucx.super;
+ }
+ 
+diff --git a/opal/mca/common/ucx/common_ucx.c b/opal/mca/common/ucx/common_ucx.c
+index ac7a17d799a5..ae8e66877ab6 100644
+--- a/opal/mca/common/ucx/common_ucx.c
++++ b/opal/mca/common/ucx/common_ucx.c
+@@ -14,11 +14,8 @@
+ #include "opal/mca/base/mca_base_framework.h"
+ #include "opal/mca/pmix/pmix.h"
+ #include "opal/memoryhooks/memory.h"
+-#include "opal/util/argv.h"
+ 
+ #include <ucm/api/ucm.h>
+-#include <fnmatch.h>
+-#include <stdio.h>
+ 
+ /***********************************************************************/
+ 
+@@ -28,8 +25,7 @@ opal_common_ucx_module_t opal_common_ucx = {
+     .verbose             = 0,
+     .progress_iterations = 100,
+     .registered          = 0,
+-    .opal_mem_hooks      = 0,
+-    .tls                 = NULL
++    .opal_mem_hooks      = 0
+ };
+ 
+ static void opal_common_ucx_mem_release_cb(void *buf, size_t length,
+@@ -40,15 +36,10 @@ static void opal_common_ucx_mem_release_cb(void *buf, size_t length,
+ 
+ OPAL_DECLSPEC void opal_common_ucx_mca_var_register(const mca_base_component_t *component)
+ {
+-    static const char *default_tls     = "rc_verbs,ud_verbs,rc_mlx5,dc_mlx5,cuda_ipc,rocm_ipc";
+-    static const char *default_devices = "mlx*";
+     static int registered = 0;
+     static int hook_index;
+     static int verbose_index;
+     static int progress_index;
+-    static int tls_index;
+-    static int devices_index;
+-
+     if (!registered) {
+         verbose_index = mca_base_var_register("opal", "opal_common", "ucx", "verbose",
+                                               "Verbose level of the UCX components",
+@@ -69,29 +60,6 @@ OPAL_DECLSPEC void opal_common_ucx_mca_var_register(const mca_base_component_t *
+                                            OPAL_INFO_LVL_3,
+                                            MCA_BASE_VAR_SCOPE_LOCAL,
+                                            &opal_common_ucx.opal_mem_hooks);
+-
+-        opal_common_ucx.tls  = malloc(sizeof(*opal_common_ucx.tls));
+-        *opal_common_ucx.tls = strdup(default_tls);
+-        tls_index = mca_base_var_register("opal", "opal_common", "ucx", "tls",
+-                                          "List of UCX transports which should be supported on the system, to enable "
+-                                          "selecting the UCX component. Special values: any (any available). "
+-                                          "A '^' prefix negates the list. "
+-                                          "For example, in order to exclude on shared memory and TCP transports, "
+-                                          "please set to '^posix,sysv,self,tcp,cma,knem,xpmem'.",
+-                                          MCA_BASE_VAR_TYPE_STRING, NULL, 0, 0,
+-                                          OPAL_INFO_LVL_3,
+-                                          MCA_BASE_VAR_SCOPE_LOCAL,
+-                                          opal_common_ucx.tls);
+-
+-        opal_common_ucx.devices  = malloc(sizeof(*opal_common_ucx.devices));
+-        *opal_common_ucx.devices = strdup(default_devices);
+-        devices_index = mca_base_var_register("opal", "opal_common", "ucx", "devices",
+-                                              "List of device driver pattern names, which, if supported by UCX, will "
+-                                              "bump its priority above ob1. Special values: any (any available)",
+-                                              MCA_BASE_VAR_TYPE_STRING, NULL, 0, 0,
+-                                              OPAL_INFO_LVL_3,
+-                                              MCA_BASE_VAR_SCOPE_LOCAL,
+-                                              opal_common_ucx.devices);
+         registered = 1;
+     }
+     if (component) {
+@@ -107,14 +75,6 @@ OPAL_DECLSPEC void opal_common_ucx_mca_var_register(const mca_base_component_t *
+                                       component->mca_type_name,
+                                       component->mca_component_name,
+                                       "opal_mem_hooks", 0);
+-        mca_base_var_register_synonym(tls_index, component->mca_project_name,
+-                                      component->mca_type_name,
+-                                      component->mca_component_name,
+-                                      "tls", 0);
+-        mca_base_var_register_synonym(devices_index, component->mca_project_name,
+-                                      component->mca_type_name,
+-                                      component->mca_component_name,
+-                                      "devices", 0);
+     }
+ }
+ 
+@@ -163,166 +123,6 @@ OPAL_DECLSPEC void opal_common_ucx_mca_deregister(void)
+     opal_output_close(opal_common_ucx.output);
+ }
+ 
+-#if HAVE_DECL_OPEN_MEMSTREAM
+-static bool opal_common_ucx_check_device(const char *device_name, char **device_list)
+-{
+-    char sysfs_driver_link[PATH_MAX];
+-    char driver_path[PATH_MAX];
+-    char *ib_device_name;
+-    char *driver_name;
+-    char **list_item;
+-    ssize_t ret;
+-
+-    /* mlx5_0:1 */
+-    ret = sscanf(device_name, "%m[^:]%*d", &ib_device_name);
+-    if (ret != 1) {
+-        return false;
+-    }
+-
+-    sysfs_driver_link[sizeof(sysfs_driver_link) - 1] = '\0';
+-    snprintf(sysfs_driver_link, sizeof(sysfs_driver_link) - 1,
+-             "/sys/class/infiniband/%s/device/driver", ib_device_name);
+-    free(ib_device_name);
+-
+-    driver_path[sizeof(driver_path) - 1] = '\0';
+-    ret = readlink(sysfs_driver_link, driver_path, sizeof(driver_path) - 1);
+-    if (ret < 0) {
+-        MCA_COMMON_UCX_VERBOSE(2, "readlink(%s) failed: %s", sysfs_driver_link,
+-                               strerror(errno));
+-        return false;
+-    }
+-
+-    driver_name = basename(driver_path);
+-    for (list_item = device_list; *list_item != NULL; ++list_item) {
+-        if (!fnmatch(*list_item, driver_name, 0)) {
+-            MCA_COMMON_UCX_VERBOSE(2, "driver '%s' matched by '%s'",
+-                                   driver_path, *list_item);
+-            return true;
+-        }
+-    }
+-
+-    return false;
+-}
+-#endif
+-
+-OPAL_DECLSPEC opal_common_ucx_support_level_t
+-opal_common_ucx_support_level(ucp_context_h context)
+-{
+-    opal_common_ucx_support_level_t support_level = OPAL_COMMON_UCX_SUPPORT_NONE;
+-    static const char *support_level_names[] = {
+-        [OPAL_COMMON_UCX_SUPPORT_NONE]      = "none",
+-        [OPAL_COMMON_UCX_SUPPORT_TRANSPORT] = "transports only",
+-        [OPAL_COMMON_UCX_SUPPORT_DEVICE]    = "transports and devices"
+-    };
+-#if HAVE_DECL_OPEN_MEMSTREAM
+-    char *rsc_tl_name, *rsc_device_name;
+-    char **tl_list, **device_list, **list_item;
+-    bool is_any_tl, is_any_device;
+-    bool found_tl, negate;
+-    char line[128];
+-    FILE *stream;
+-    char *buffer;
+-    size_t size;
+-    int ret;
+-#endif
+-
+-    is_any_tl     = !strcmp(*opal_common_ucx.tls, "any");
+-    is_any_device = !strcmp(*opal_common_ucx.devices, "any");
+-
+-    /* Check for special value "any" */
+-    if (is_any_tl && is_any_device) {
+-        MCA_COMMON_UCX_VERBOSE(1, "ucx is enabled on any transport or device",
+-                               *opal_common_ucx.tls);
+-        support_level = OPAL_COMMON_UCX_SUPPORT_DEVICE;
+-        goto out;
+-    }
+-
+-#if HAVE_DECL_OPEN_MEMSTREAM
+-    /* Split transports list */
+-    negate  = ('^' == (*opal_common_ucx.tls)[0]);
+-    tl_list = opal_argv_split(*opal_common_ucx.tls + (negate ? 1 : 0), ',');
+-    if (tl_list == NULL) {
+-        MCA_COMMON_UCX_VERBOSE(1, "failed to split tl list '%s', ucx is disabled",
+-                               *opal_common_ucx.tls);
+-        goto out;
+-    }
+-
+-    /* Split devices list */
+-    device_list = opal_argv_split(*opal_common_ucx.devices, ',');
+-    if (device_list == NULL) {
+-        MCA_COMMON_UCX_VERBOSE(1, "failed to split devices list '%s', ucx is disabled",
+-                               *opal_common_ucx.devices);
+-        goto out_free_tl_list;
+-    }
+-
+-    /* Open memory stream to dump UCX information to */
+-    stream = open_memstream(&buffer, &size);
+-    if (stream == NULL) {
+-        MCA_COMMON_UCX_VERBOSE(1, "failed to open memory stream for ucx info (%s), "
+-                               "ucx is disabled", strerror(errno));
+-        goto out_free_device_list;
+-    }
+-
+-    /* Print ucx transports information to the memory stream */
+-    ucp_context_print_info(context, stream);
+-
+-    /* Rewind and read transports/devices list from the stream */
+-    fseek(stream, 0, SEEK_SET);
+-    while ((support_level != OPAL_COMMON_UCX_SUPPORT_DEVICE) &&
+-           (fgets(line, sizeof(line), stream) != NULL)) {
+-        rsc_tl_name = NULL;
+-        ret = sscanf(line,
+-                     /* "# resource 6  :  md 5  dev 4  flags -- rc_verbs/mlx5_0:1" */
+-                     "# resource %*d : md %*d dev %*d flags -- %m[^/ \n\r]/%m[^/ \n\r]",
+-                     &rsc_tl_name, &rsc_device_name);
+-        if (ret != 2) {
+-            free(rsc_tl_name);
+-            continue;
+-        }
+-
+-        /* Check if 'rsc_tl_name' is found  provided list */
+-        found_tl = is_any_tl;
+-        for (list_item = tl_list; !found_tl && (*list_item != NULL); ++list_item) {
+-            found_tl = !strcmp(*list_item, rsc_tl_name);
+-        }
+-
+-        /* Check if the transport has a match (either positive or negative) */
+-        assert(!(is_any_tl && negate));
+-        if (found_tl != negate) {
+-            if (is_any_device ||
+-                opal_common_ucx_check_device(rsc_device_name, device_list)) {
+-                MCA_COMMON_UCX_VERBOSE(2, "%s/%s: matched both transport and device list",
+-                                    rsc_tl_name, rsc_device_name);
+-                support_level = OPAL_COMMON_UCX_SUPPORT_DEVICE;
+-            } else {
+-                MCA_COMMON_UCX_VERBOSE(2, "%s/%s: matched transport list but not device list",
+-                                    rsc_tl_name, rsc_device_name);
+-                support_level = OPAL_COMMON_UCX_SUPPORT_TRANSPORT;
+-            }
+-        } else {
+-            MCA_COMMON_UCX_VERBOSE(2, "%s/%s: did not match transport list",
+-                                   rsc_tl_name, rsc_device_name);
+-        }
+-
+-        free(rsc_device_name);
+-        free(rsc_tl_name);
+-    }
+-
+-    MCA_COMMON_UCX_VERBOSE(2, "support level is %s", support_level_names[support_level]);
+-    fclose(stream);
+-    free(buffer);
+-
+-out_free_device_list:
+-    opal_argv_free(device_list);
+-out_free_tl_list:
+-    opal_argv_free(tl_list);
+-out:
+-#else
+-    MCA_COMMON_UCX_VERBOSE(2, "open_memstream() was not found, ucx is disabled");
+-#endif
+-    return support_level;
+-}
+-
+ void opal_common_ucx_empty_complete_cb(void *request, ucs_status_t status)
+ {
+ }
+diff --git a/opal/mca/common/ucx/common_ucx.h b/opal/mca/common/ucx/common_ucx.h
+index 92cdd738ef98..202131ac8907 100644
+--- a/opal/mca/common/ucx/common_ucx.h
++++ b/opal/mca/common/ucx/common_ucx.h
+@@ -88,8 +88,6 @@ typedef struct opal_common_ucx_module {
+     int  progress_iterations;
+     int  registered;
+     bool opal_mem_hooks;
+-    char **tls;
+-    char **devices;
+ } opal_common_ucx_module_t;
+ 
+ typedef struct opal_common_ucx_del_proc {
+@@ -97,23 +95,10 @@ typedef struct opal_common_ucx_del_proc {
+     size_t   vpid;
+ } opal_common_ucx_del_proc_t;
+ 
+-typedef enum {
+-    /* No supported transports found (according to configured list of supported
+-       transports) */
+-    OPAL_COMMON_UCX_SUPPORT_NONE,
+-
+-    /* Have supported transports but not supported devices */
+-    OPAL_COMMON_UCX_SUPPORT_TRANSPORT,
+-
+-    /* Have both supported transports and supported devices */
+-    OPAL_COMMON_UCX_SUPPORT_DEVICE,
+-} opal_common_ucx_support_level_t;
+-
+ extern opal_common_ucx_module_t opal_common_ucx;
+ 
+ OPAL_DECLSPEC void opal_common_ucx_mca_register(void);
+ OPAL_DECLSPEC void opal_common_ucx_mca_deregister(void);
+-OPAL_DECLSPEC opal_common_ucx_support_level_t opal_common_ucx_support_level(ucp_context_h context);
+ OPAL_DECLSPEC void opal_common_ucx_mca_proc_added(void);
+ OPAL_DECLSPEC void opal_common_ucx_empty_complete_cb(void *request, ucs_status_t status);
+ OPAL_DECLSPEC int opal_common_ucx_mca_pmix_fence(ucp_worker_h worker);
+diff --git a/opal/mca/common/ucx/configure.m4 b/opal/mca/common/ucx/configure.m4
+index af8628a889c6..27e07c2005b2 100644
+--- a/opal/mca/common/ucx/configure.m4
++++ b/opal/mca/common/ucx/configure.m4
+@@ -18,8 +18,6 @@ AC_DEFUN([MCA_opal_common_ucx_CONFIG],[
+                [common_ucx_happy="yes"],
+                [common_ucx_happy="no"])
+ 
+-    AC_CHECK_DECLS([open_memstream], [], [], [[#include <stdio.h>]])
+-
+     AS_IF([test "$common_ucx_happy" = "yes"],
+           [$1],
+           [$2])
+-- 
+2.31.1
+
diff --git a/SOURCES/266189935aef4fce825d0db831b4b53accc62c32.patch b/SOURCES/266189935aef4fce825d0db831b4b53accc62c32.patch
new file mode 100644
index 0000000..ac960e4
--- /dev/null
+++ b/SOURCES/266189935aef4fce825d0db831b4b53accc62c32.patch
@@ -0,0 +1,33 @@
+From 266189935aef4fce825d0db831b4b53accc62c32 Mon Sep 17 00:00:00 2001
+From: Jeff Squyres <jsquyres@cisco.com>
+Date: Tue, 22 Jun 2021 22:28:37 -0400
+Subject: [PATCH] fbtl-posix: link to common_ompio
+
+The posix fbtl calls mca_common_ompio_progress(), which resides in
+common/ompio (i.e., libmca_common_ompio.la).  So add that into
+mca_fbtl_posix_la_LIBADD (like we do in a few other OMPIO-based
+components).  Failure to do this *can* lead to the posix fbtl
+component failing to load (depending on whether other OMPIO-based
+components that pull in libmca_common_ompio were loaded first).
+
+Thanks to Honggang Li for raising the issue.
+
+Signed-off-by: Jeff Squyres <jsquyres@cisco.com>
+---
+ ompi/mca/fbtl/posix/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/ompi/mca/fbtl/posix/Makefile.am b/ompi/mca/fbtl/posix/Makefile.am
+index a7b0624d3ec..1ce19cb09b7 100644
+--- a/ompi/mca/fbtl/posix/Makefile.am
++++ b/ompi/mca/fbtl/posix/Makefile.am
+@@ -34,7 +34,8 @@ mcacomponentdir = $(ompilibdir)
+ mcacomponent_LTLIBRARIES = $(component_install)
+ mca_fbtl_posix_la_SOURCES = $(sources)
+ mca_fbtl_posix_la_LDFLAGS = -module -avoid-version
+-mca_fbtl_posix_la_LIBADD = $(top_builddir)/ompi/lib@OMPI_LIBMPI_NAME@.la
++mca_fbtl_posix_la_LIBADD = $(top_builddir)/ompi/lib@OMPI_LIBMPI_NAME@.la \
++    $(OMPI_TOP_BUILDDIR)/ompi/mca/common/ompio/libmca_common_ompio.la
+ 
+ noinst_LTLIBRARIES = $(component_noinst)
+ libmca_fbtl_posix_la_SOURCES = $(sources)
diff --git a/SOURCES/macros.openmpi b/SOURCES/macros.openmpi
index 05e613f..1ee6a3c 100644
--- a/SOURCES/macros.openmpi
+++ b/SOURCES/macros.openmpi
@@ -1,6 +1,7 @@
 %_openmpi_load \
  . /etc/profile.d/modules.sh; \
- module load mpi/openmpi-%{_arch};
+ module load mpi/openmpi-%{_arch}; \
+ export OMPI_MCA_rmaps_base_oversubscribe=1
 %_openmpi_unload \
  . /etc/profile.d/modules.sh; \
  module unload mpi/openmpi-%{_arch};
diff --git a/SOURCES/openmpi.module.in b/SOURCES/openmpi.module.in
index 287a4b5..41583c4 100644
--- a/SOURCES/openmpi.module.in
+++ b/SOURCES/openmpi.module.in
@@ -13,9 +13,9 @@ setenv			MPI_FORTRAN_MOD_DIR	@FMODDIR@
 setenv			MPI_INCLUDE	@INCDIR@
 setenv	 		MPI_LIB		@LIBDIR@/lib
 setenv			MPI_MAN		@MANDIR@
-setenv			MPI_PYTHON_SITEARCH	@PYSITEARCH@
-setenv			MPI_PYTHON2_SITEARCH	@PYSITEARCH@
-setenv			MPI_PYTHON3_SITEARCH	@PYSITEARCH@
+setenv			MPI_PYTHON_SITEARCH	@PY2SITEARCH@
+setenv			MPI_PYTHON2_SITEARCH	@PY2SITEARCH@
+setenv			MPI_PYTHON3_SITEARCH	@PY3SITEARCH@
 setenv			MPI_COMPILER	@COMPILER@
 setenv			MPI_SUFFIX	@SUFFIX@
 setenv	 		MPI_HOME	@LIBDIR@
diff --git a/SOURCES/openmpi.pth.py2 b/SOURCES/openmpi.pth.py2
new file mode 100644
index 0000000..a2dc353
--- /dev/null
+++ b/SOURCES/openmpi.pth.py2
@@ -0,0 +1 @@
+import sys, os; s = os.getenv('MPI_PYTHON2_SITEARCH'); s and (s in sys.path or sys.path.append(s))
diff --git a/SPECS/openmpi.spec b/SPECS/openmpi.spec
index 500e23f..6c3949c 100644
--- a/SPECS/openmpi.spec
+++ b/SPECS/openmpi.spec
@@ -1,18 +1,3 @@
-%global _hardened_build 1
-# We only compile with gcc, but other people may want other compilers.
-# Set the compiler here.
-%global opt_cc gcc
-# Optional CFLAGS to use with the specific compiler...gcc doesn't need any,
-# so uncomment and define to use
-#global opt_cflags
-%global opt_cxx g++
-#global opt_cxxflags
-%global opt_f77 gfortran
-#global opt_fflags
-%global opt_fc gfortran
-#global opt_fcflags
-
-
 # Optional name suffix to use...we leave it off when compiling with gcc, but
 # for other compiled versions to install side by side, it will need a
 # suffix in order to keep the names from conflicting.
@@ -20,60 +5,99 @@
 
 %global macrosdir %(d=%{_rpmconfigdir}/macros.d; [ -d $d ] || d=%{_sysconfdir}/rpm; echo $d)
 
-Name:			openmpi%{?_cc_name_suffix}
-Version:		4.0.5
-Release:		3%{?dist}
-Summary:		Open Message Passing Interface
-Group:			Development/Libraries
-License:		BSD and MIT and Romio
-URL:			http://www.open-mpi.org/
+%if 0%{?fedora} >= 32 || 0%{?rhel} >= 8
+%bcond_with python2
+%else
+%bcond_without python2
+%endif
 
-# We can't use %%{name} here because of _cc_name_suffix
-Source0:		https://www.open-mpi.org/software/ompi/v4.0/downloads/openmpi-%{version}.tar.bz2
-Source1:		openmpi.module.in
-Source2:		openmpi.pth.py3
-Source3:		macros.openmpi
+%ifarch aarch64 ppc64le x86_64
+%bcond_without ucx
+%else
+%bcond_with ucx
+%endif
 
-BuildRequires:		gcc-gfortran, gcc-c++
-%ifnarch s390 s390x
-BuildRequires:		valgrind-devel
+# ARM 32-bit is not supported by rdma
+# https://bugzilla.redhat.com/show_bug.cgi?id=1780584
+%ifarch %{arm}
+%bcond_with rdma
+%else
+%bcond_without rdma
 %endif
-%ifnarch s390 s390x i686
-BuildRequires:		ucx-devel
+
+# Run autogen - needed for some patches
+%bcond_without autogen
+
+Name:           openmpi%{?_cc_name_suffix}
+Version:        4.1.1
+Release:        2%{?dist}
+Summary:        Open Message Passing Interface
+License:        BSD and MIT and Romio
+URL:            http://www.open-mpi.org/
+
+# We can't use %%{name} here because of _cc_name_suffix
+Source0:        https://www.open-mpi.org/software/ompi/v4.1/downloads/openmpi-%{version}.tar.bz2
+Source1:        openmpi.module.in
+Source2:        openmpi.pth.py2
+Source3:        openmpi.pth.py3
+Source4:        macros.openmpi
+Patch1:         266189935aef4fce825d0db831b4b53accc62c32.patch
+Patch2:         0001-Revert-ucx-check-supported-transports-and-devices-fo.patch
+
+BuildRequires:  gcc-c++
+BuildRequires:  gcc-gfortran
+BuildRequires:  make
+%if %{with autogen}
+BuildRequires:  libtool
+BuildRequires:  perl(Data::Dumper)
+BuildRequires:  perl(File::Find)
 %endif
-%ifnarch s390 s390x %{arm}
-BuildRequires:		libibverbs-devel >= 1.1.3, opensm-devel >= 3.3.22
-BuildRequires:		librdmacm-devel rdma-core-devel
+BuildRequires:  valgrind-devel
+%if %{with rdma}
+BuildRequires:  opensm-devel > 3.3.0
+BuildRequires:  rdma-core-devel
 %endif
 # Doesn't compile:
 # vt_dyn.cc:958:28: error: 'class BPatch_basicBlockLoop' has no member named 'getLoopHead'
 #                      loop->getLoopHead()->getStartAddress(), loop_stmts );
-#BuildRequires:		dyninst-devel
-BuildRequires:		hwloc-devel >= 2.2.0
+#BuildRequires:  dyninst-devel
+BuildRequires:  hwloc-devel >= 2.2.0
 # So configure can find lstopo
-BuildRequires:		hwloc-gui
-BuildRequires:		java-devel
+BuildRequires:  hwloc-gui
+BuildRequires:  java-devel
+# Old libevent causes issues
+%if !0%{?el7}
+BuildRequires:  libevent-devel
+%endif
+BuildRequires:  libfabric-devel
 %ifnarch s390 s390x
-BuildRequires:		libfabric-devel
-BuildRequires:		papi-devel
+BuildRequires:  papi-devel
 %endif
-BuildRequires:		perl-generators
-BuildRequires:		perl(Getopt::Long)
-BuildRequires:		pmix-devel
+BuildRequires:  perl-generators
+BuildRequires:  perl-interpreter
+BuildRequires:  perl(Getopt::Long)
+BuildRequires:  pmix-devel
+BuildRequires:  python%{python3_pkgversion}-devel
 %ifarch x86_64
-BuildRequires:          libpsm2-devel
+BuildRequires:  libpsm2-devel
+%endif
+%if %{with ucx}
+BuildRequires:  ucx-devel
+%endif
+BuildRequires:  zlib-devel
+%if !0%{?el7}
+BuildRequires:  rpm-mpi-hooks
 %endif
-BuildRequires:		torque-devel
-BuildRequires:		zlib-devel
-BuildRequires:		rpm-mpi-hooks
-BuildRequires:		libevent-devel >= 2.0.22
 
-Provides:		mpi
-Requires:		environment(modules)
+Provides:       mpi
+%if 0%{?rhel} == 7
+# Need this for /etc/profile.d/modules.sh
+Requires:       environment-modules
+%endif
+Requires:       environment(modules)
 # openmpi currently requires ssh to run
 # https://svn.open-mpi.org/trac/ompi/ticket/4228
-Requires:		openssh-clients
-Requires:		libevent >= 2.0.22
+Requires:       openssh-clients
 
 # Private openmpi libraries
 %global __provides_exclude_from %{_libdir}/openmpi/lib/(lib(mca|ompi|open-(pal|rte|trace))|openmpi/).*.so
@@ -90,28 +114,31 @@ researchers. For more information, see http://www.open-mpi.org/ .
 
 %package devel
 Summary:	Development files for openmpi
-Group:		Development/Libraries
 Requires:	%{name} = %{version}-%{release}, gcc-gfortran
 Provides:	mpi-devel
+%if !0%{?el7}
 Requires:	rpm-mpi-hooks
+# Make sure this package is rebuilt with correct Python version when updating
+# Otherwise mpi.req from rpm-mpi-hooks doesn't work
+# https://bugzilla.redhat.com/show_bug.cgi?id=1705296
+Requires:	(python(abi) = %{python3_version} if python3)
+%endif
 
 %description devel
 Contains development headers and libraries for openmpi.
 
 %package java
-Summary:	Java library
-Group:		Development/Libraries
-Requires:	%{name} = %{version}-%{release}
-Requires:	java-headless
+Summary:        Java library
+Requires:       %{name} = %{version}-%{release}
+Requires:       java-headless
 
 %description java
-OpenMPI Java library.
+Java library.
 
 %package java-devel
-Summary:	Java development files for openmpi
-Group:		Development/Libraries
-Requires:	%{name}-java = %{version}-%{release}
-Requires:	java-devel
+Summary:        Java development files for openmpi
+Requires:       %{name}-java = %{version}-%{release}
+Requires:       java-devel
 
 %description java-devel
 Contains development wrapper for compiling Java with openmpi.
@@ -120,19 +147,32 @@ Contains development wrapper for compiling Java with openmpi.
 # particular package, version, compiler
 %global namearch openmpi-%{_arch}%{?_cc_name_suffix}
 
-%package -n python3-openmpi
-Summary:	OpenMPI support for Python 3
-Group:		Development/Libraries
-BuildRequires:	python3-devel
-Requires:	%{name} = %{version}-%{release}
-Provides:	python-openmpi
+%if %{with python2}
+%package -n python2-openmpi
+Summary:        OpenMPI support for Python 2
+BuildRequires:  python2-devel
+Requires:       %{name} = %{version}-%{release}
+Requires:       python(abi) = %{python2_version}
 
-%description -n python3-openmpi
+%description -n python2-openmpi
+OpenMPI support for Python 2.
+%endif
+
+%package -n python%{python3_pkgversion}-openmpi
+Summary:        OpenMPI support for Python 3
+Requires:       %{name} = %{version}-%{release}
+Requires:       python(abi) = %{python3_version}
+
+%description -n python%{python3_pkgversion}-openmpi
 OpenMPI support for Python 3.
 
 
 %prep
-%setup -q -n openmpi-%{version}
+%autosetup -p1 -n %{name}-%{version}
+%if %{with autogen}
+./autogen.pl --force
+%endif
+
 
 %build
 %set_build_flags
@@ -141,37 +181,23 @@ OpenMPI support for Python 3.
 	--includedir=%{_includedir}/%{namearch} \
 	--sysconfdir=%{_sysconfdir}/%{namearch} \
 	--disable-silent-rules \
-	--disable-builtin-atomics \
-	--enable-mpi-thread-multiple \
-%ifnarch %{power64}
+	--enable-builtin-atomics \
 	--enable-mpi-cxx \
-%endif
 	--enable-mpi-java \
-	--enable-mpi-fortran=all \
-	--enable-cxx-exceptions \
+	--enable-mpi1-compatibility \
 	--with-sge \
-%ifnarch s390 s390x
 	--with-valgrind \
 	--enable-memchecker \
-%endif
-%ifnarch s390 s390x i686
-	--with-ucx \
-	--with-ucx-libdir=%{_libdir} \
-%endif
-	--with-hwloc=external \
-	--with-pmix=external \
+	--with-hwloc=/usr \
+%if !0%{?el7}
 	--with-libevent=external \
-	CC=%{opt_cc} CXX=%{opt_cxx} FC=%{opt_fc} \
-	LDFLAGS="%{build_ldflags}" \
-	CFLAGS="%{?opt_cflags}%{!?opt_cflags:$RPM_OPT_FLAGS}" \
-	CXXFLAGS="%{?opt_cxxflags}%{!?opt_cxxflags:$RPM_OPT_FLAGS}" \
-	FCFLAGS="%{?opt_fcflags}%{!?opt_fcflags:$RPM_OPT_FLAGS}" \
-	--with-contrib-vt-flags='CXXFLAGS="-I%{_includedir}/dyninst -L%{_libdir}/dyninst"'
+	--with-pmix=external \
+%endif
 
-make %{?_smp_mflags} V=1
+%make_build V=1
 
 %install
-make install DESTDIR=%{buildroot}
+%make_install
 find %{buildroot}%{_libdir}/%{name}/lib -name \*.la | xargs rm
 find %{buildroot}%{_mandir}/%{namearch} -type f | xargs gzip -9
 ln -s mpicc.1.gz %{buildroot}%{_mandir}/%{namearch}/man1/mpiCC.1.gz
@@ -180,21 +206,26 @@ rm %{buildroot}%{_mandir}/%{namearch}/man1/mpiCC.1
 mkdir %{buildroot}%{_mandir}/%{namearch}/man{2,4,5,6,8,9,n}
 
 # Make the environment-modules file
-mkdir -p %{buildroot}%{_sysconfdir}/modulefiles/mpi
+mkdir -p %{buildroot}%{_datadir}/modulefiles/mpi
 # Since we're doing our own substitution here, use our own definitions.
 sed 's#@LIBDIR@#%{_libdir}/%{name}#;
      s#@ETCDIR@#%{_sysconfdir}/%{namearch}#;
      s#@FMODDIR@#%{_fmoddir}/%{name}#;
      s#@INCDIR@#%{_includedir}/%{namearch}#;
      s#@MANDIR@#%{_mandir}/%{namearch}#;
-     s#@PYSITEARCH@#%{python3_sitearch}/%{name}#;
+%if %{with python2}
+     s#@PY2SITEARCH@#%{python2_sitearch}/%{name}#;
+%else
+     /@PY2SITEARCH@/d;
+%endif
+     s#@PY3SITEARCH@#%{python3_sitearch}/%{name}#;
      s#@COMPILER@#openmpi-%{_arch}%{?_cc_name_suffix}#;
      s#@SUFFIX@#%{?_cc_name_suffix}_openmpi#' \
      <%{SOURCE1} \
-     >%{buildroot}%{_sysconfdir}/modulefiles/mpi/%{namearch}
+     >%{buildroot}%{_datadir}/modulefiles/mpi/%{namearch}
 
 # make the rpm config file
-install -Dpm 644 %{SOURCE3} %{buildroot}/%{macrosdir}/macros.%{namearch}
+install -Dpm 644 %{SOURCE4} %{buildroot}/%{macrosdir}/macros.%{namearch}
 
 # Link the fortran module to proper location
 mkdir -p %{buildroot}%{_fmoddir}/%{name}
@@ -215,8 +246,12 @@ sed -i -e s/-ldl// -e s/-lhwloc// \
   %{buildroot}%{_libdir}/%{name}/share/openmpi/*-wrapper-data.txt
 
 # install .pth files
+%if %{with python2}
+mkdir -p %{buildroot}/%{python2_sitearch}/%{name}
+install -pDm0644 %{SOURCE2} %{buildroot}/%{python2_sitearch}/openmpi.pth
+%endif
 mkdir -p %{buildroot}/%{python3_sitearch}/%{name}
-install -pDm0644 %{SOURCE2} %{buildroot}/%{python3_sitearch}/openmpi.pth
+install -pDm0644 %{SOURCE3} %{buildroot}/%{python3_sitearch}/openmpi.pth
 
 %check
 make check
@@ -231,33 +266,58 @@ make check
 %dir %{_mandir}/%{namearch}
 %dir %{_mandir}/%{namearch}/man*
 %config(noreplace) %{_sysconfdir}/%{namearch}/*
-%{_libdir}/%{name}/bin/*.pl
 %{_libdir}/%{name}/bin/mpi[er]*
 %{_libdir}/%{name}/bin/ompi*
 %{_libdir}/%{name}/bin/orte[-dr_]*
-%ifnarch s390 s390x i686
-%{_libdir}/%{name}/bin/osh*
-%{_libdir}/%{name}/bin/shmem*
+%if %{with ucx}
+%{_libdir}/%{name}/bin/oshmem_info
+%{_libdir}/%{name}/bin/oshrun
+%{_libdir}/%{name}/bin/shmemrun
+%endif
+%{_libdir}/%{name}/lib/*.so.40*
+%{_libdir}/%{name}/lib/libmca_common_ofi.so.10*
+%{_libdir}/%{name}/lib/libmca*.so.41*
+%{_libdir}/%{name}/lib/libmca*.so.50*
+%if 0%{?el7}
+%{_libdir}/%{name}/lib/pmix/
 %endif
-%{_libdir}/%{name}/lib/*.so.*
-%{_mandir}/%{namearch}/man1/*
-%{_mandir}/%{namearch}/man7/*
+%{_mandir}/%{namearch}/man1/mpi[er]*
+%{_mandir}/%{namearch}/man1/ompi*
+%{_mandir}/%{namearch}/man1/orte[-dr_]*
+%if %{with ucx}
+%{_mandir}/%{namearch}/man1/oshmem_info*
+%{_mandir}/%{namearch}/man1/oshrun*
+%{_mandir}/%{namearch}/man1/shmemrun*
+%endif
+%{_mandir}/%{namearch}/man7/ompi_*
+%{_mandir}/%{namearch}/man7/opal_*
+%{_mandir}/%{namearch}/man7/orte*
 %{_libdir}/%{name}/lib/openmpi/*
-%{_sysconfdir}/modulefiles/mpi/
+%{_datadir}/modulefiles/mpi/
 %dir %{_libdir}/%{name}/share
 %dir %{_libdir}/%{name}/share/openmpi
 %{_libdir}/%{name}/share/openmpi/amca-param-sets
 %{_libdir}/%{name}/share/openmpi/help*.txt
-%ifnarch s390 %{arm}
+%if %{with rdma}
 %{_libdir}/%{name}/share/openmpi/mca-btl-openib-device-params.ini
 %endif
-
+%if 0%{?el7}
+%{_libdir}/%{name}/share/pmix/
+%endif
 
 %files devel
 %dir %{_includedir}/%{namearch}
+%{_libdir}/%{name}/bin/aggregate_profile.pl
 %{_libdir}/%{name}/bin/mpi[cCf]*
 %{_libdir}/%{name}/bin/opal_*
 %{_libdir}/%{name}/bin/orte[cCf]*
+%if %{with ucx}
+%{_libdir}/%{name}/bin/osh[cCf]*
+%endif
+%{_libdir}/%{name}/bin/profile2mat.pl
+%if %{with ucx}
+%{_libdir}/%{name}/bin/shmem[cCf]*
+%endif
 %{_includedir}/%{namearch}/*
 %{_fmoddir}/%{name}/
 %{_libdir}/%{name}/lib/*.so
@@ -265,6 +325,10 @@ make check
 %{_libdir}/%{name}/lib/pkgconfig/
 %{_libdir}/pkgconfig/*.pc
 %{_mandir}/%{namearch}/man1/mpi[cCf]*
+%if %{with ucx}
+%{_mandir}/%{namearch}/man1/osh[cCf]*
+%{_mandir}/%{namearch}/man1/shmem[cCf]*
+%endif
 %{_mandir}/%{namearch}/man1/opal_*
 %{_mandir}/%{namearch}/man3/*
 %{_libdir}/%{name}/share/openmpi/openmpi-valgrind.supp
@@ -281,12 +345,29 @@ make check
 %{_libdir}/%{name}/share/doc/
 %{_mandir}/%{namearch}/man1/mpijavac.1.gz
 
-%files -n python3-openmpi
+%if %{with python2}
+%files -n python2-openmpi
+%dir %{python2_sitearch}/%{name}
+%{python2_sitearch}/openmpi.pth
+%endif
+
+%files -n python%{python3_pkgversion}-openmpi
 %dir %{python3_sitearch}/%{name}
 %{python3_sitearch}/openmpi.pth
 
 
 %changelog
+* Wed Jul 21 2021 Honggang Li <honli@redhat.com> - 4.1.1-2
+- fbtl-posix: link to common_ompio
+- Require environment(modules)
+- Revert upstream commit c36d7459b6331c4da82
+- Resolves: rhbz#1974780, rhbz#1971771
+
+* Wed Jun 09 2021 Honggang Li <honli@redhat.com> - 4.1.1-1
+- Update to upstream v4.1.1 release
+- Sync with Fedora build
+- Resolves: rhbz#1928631, rhbz#1920801
+
 * Wed Jan 27 2021 Honggang Li <honli@redhat.com> - 4.0.5-3
 - disable gcc built-in atomics
 - Resolves: rhbz#1921262