[librdmacm] Update to latest upstream
Doug Ledford
dledford at fedoraproject.org
Tue Jan 3 18:52:45 UTC 2012
commit 4b6b9bbec9fc60c71d91c41e3cdf89d90cedc4b3
Author: Doug Ledford <dledford at redhat.com>
Date: Tue Jan 3 13:43:47 2012 -0500
Update to latest upstream
Signed-off-by: Doug Ledford <dledford at redhat.com>
.gitignore | 1 +
...ma-verbs-Fix-race-polling-for-completions.patch | 109 ++++++++++++++++++++
0002-librdmacm-Fix-duplicate-free-of-connect.patch | 40 +++++++
0003-librdmacm-Verify-size-of-route_len.patch | 85 +++++++++++++++
...udaddy-Fix-resource-leak-in-case-of-error.patch | 27 +++++
...nor-code-refactoring-when-saving-a-string.patch | 33 ++++++
...eturn-ECONNREFUSED-from-rdma_connect-on-r.patch | 37 +++++++
...ucmatose-allow-easy-setting-of-tos-in-hex.patch | 44 ++++++++
...dmacm-Update-web-site-and-email-addresses.patch | 26 +++++
librdmacm.spec | 32 +++++-
sources | 2 +-
11 files changed, 430 insertions(+), 6 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 79fc9d9..873de08 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
librdmacm-1.0.7.tar.gz
librdmacm-1.0.10.tar.gz
librdmacm-1.0.14.1.tar.gz
+/librdmacm-1.0.15.tar.gz
diff --git a/0001-rdma-verbs-Fix-race-polling-for-completions.patch b/0001-rdma-verbs-Fix-race-polling-for-completions.patch
new file mode 100644
index 0000000..e9c9733
--- /dev/null
+++ b/0001-rdma-verbs-Fix-race-polling-for-completions.patch
@@ -0,0 +1,109 @@
+From e92afcbe5284095d55aad937b8c23333368d4d62 Mon Sep 17 00:00:00 2001
+From: Sean Hefty <sean.hefty at intel.com>
+Date: Fri, 16 Sep 2011 12:06:40 -0700
+Subject: [PATCH 1/9] rdma/verbs: Fix race polling for completions
+
+To avoid hanging in rdma_get_send/recv_comp, we need to rearm
+the CQ inside of the while loop. If the CQ is armed,
+the HCA will write an entry to the CQ, then generate a CQ
+event. However, a caller could poll the CQ, find the entry,
+then attempt to rearm the CQ before the HCA generates the CQ
+event. In this case, the rearm call (ibv_req_notify_cq) will
+act as a no-op, since the HCA hasn't finished generating the
+event for the previous completion. At this point, the event
+will be queued.
+
+A call to ibv_get_cq_event will find the event, but not
+a CQ entry. The CQ is now not armed, and a call to
+ibv_get_cq_event will block waiting for an event that will
+never occur.
+
+Problem was found in an rdma_cm example test under development.
+The test can ping-pong messages between two applications.
+
+Signed-off-by: Sean Hefty <sean.hefty at intel.com>
+---
+ include/rdma/rdma_verbs.h | 44 ++++++++++++++++++++++++++------------------
+ 1 files changed, 26 insertions(+), 18 deletions(-)
+
+diff --git a/include/rdma/rdma_verbs.h b/include/rdma/rdma_verbs.h
+index eca2c7a..2b1a961 100644
+--- a/include/rdma/rdma_verbs.h
++++ b/include/rdma/rdma_verbs.h
+@@ -254,23 +254,27 @@ rdma_get_send_comp(struct rdma_cm_id *id, struct ibv_wc *wc)
+ void *context;
+ int ret;
+
+- ret = ibv_poll_cq(id->send_cq, 1, wc);
+- if (ret)
+- goto out;
++ do {
++ ret = ibv_poll_cq(id->send_cq, 1, wc);
++ if (ret)
++ break;
+
+- ret = ibv_req_notify_cq(id->send_cq, 0);
+- if (ret)
+- return rdma_seterrno(ret);
++ ret = ibv_req_notify_cq(id->send_cq, 0);
++ if (ret)
++ return rdma_seterrno(ret);
++
++ ret = ibv_poll_cq(id->send_cq, 1, wc);
++ if (ret)
++ break;
+
+- while (!(ret = ibv_poll_cq(id->send_cq, 1, wc))) {
+ ret = ibv_get_cq_event(id->send_cq_channel, &cq, &context);
+ if (ret)
+ return rdma_seterrno(ret);
+
+ assert(cq == id->send_cq && context == id);
+ ibv_ack_cq_events(id->send_cq, 1);
+- }
+-out:
++ } while (1);
++
+ return (ret < 0) ? rdma_seterrno(ret) : ret;
+ }
+
+@@ -281,23 +285,27 @@ rdma_get_recv_comp(struct rdma_cm_id *id, struct ibv_wc *wc)
+ void *context;
+ int ret;
+
+- ret = ibv_poll_cq(id->recv_cq, 1, wc);
+- if (ret)
+- goto out;
++ do {
++ ret = ibv_poll_cq(id->recv_cq, 1, wc);
++ if (ret)
++ break;
+
+- ret = ibv_req_notify_cq(id->recv_cq, 0);
+- if (ret)
+- return rdma_seterrno(ret);
++ ret = ibv_req_notify_cq(id->recv_cq, 0);
++ if (ret)
++ return rdma_seterrno(ret);
++
++ ret = ibv_poll_cq(id->recv_cq, 1, wc);
++ if (ret)
++ break;
+
+- while (!(ret = ibv_poll_cq(id->recv_cq, 1, wc))) {
+ ret = ibv_get_cq_event(id->recv_cq_channel, &cq, &context);
+ if (ret)
+ return rdma_seterrno(ret);
+
+ assert(cq == id->recv_cq && context == id);
+ ibv_ack_cq_events(id->recv_cq, 1);
+- }
+-out:
++ } while (1);
++
+ return (ret < 0) ? rdma_seterrno(ret) : ret;
+ }
+
+--
+1.7.6.4
+
diff --git a/0002-librdmacm-Fix-duplicate-free-of-connect.patch b/0002-librdmacm-Fix-duplicate-free-of-connect.patch
new file mode 100644
index 0000000..a62f883
--- /dev/null
+++ b/0002-librdmacm-Fix-duplicate-free-of-connect.patch
@@ -0,0 +1,40 @@
+From 20cf9c7bff72c5c0ac1ec7c99dadb7e095875bc6 Mon Sep 17 00:00:00 2001
+From: Sean Hefty <sean.hefty at intel.com>
+Date: Tue, 27 Sep 2011 11:19:36 -0700
+Subject: [PATCH 2/9] librdmacm: Fix duplicate free of connect
+
+The connect data stored with the cma_id_private is freed in
+rdma_connect, since it is no longer needed. Avoid duplicating
+the free in rdma_destroy_id by checking for connect_len = 0,
+rather than connect to be NULL.
+
+Signed-off-by: Sean Hefty <sean.hefty at intel.com>
+---
+ src/cma.c | 4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/cma.c b/src/cma.c
+index 91e110e..e09ab99 100755
+--- a/src/cma.c
++++ b/src/cma.c
+@@ -379,7 +379,7 @@ static void ucma_free_id(struct cma_id_private *id_priv)
+
+ if (id_priv->sync)
+ rdma_destroy_event_channel(id_priv->id.channel);
+- if (id_priv->connect)
++ if (id_priv->connect_len)
+ free(id_priv->connect);
+ free(id_priv);
+ }
+@@ -1319,7 +1319,7 @@ int rdma_connect(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
+ if (ret != sizeof cmd)
+ return (ret >= 0) ? ERR(ENODATA) : -1;
+
+- if (id_priv->connect) {
++ if (id_priv->connect_len) {
+ free(id_priv->connect);
+ id_priv->connect_len = 0;
+ }
+--
+1.7.6.4
+
diff --git a/0003-librdmacm-Verify-size-of-route_len.patch b/0003-librdmacm-Verify-size-of-route_len.patch
new file mode 100644
index 0000000..9f36fec
--- /dev/null
+++ b/0003-librdmacm-Verify-size-of-route_len.patch
@@ -0,0 +1,85 @@
+From b17cbf0636dc8bbe786c2055405e23104b513887 Mon Sep 17 00:00:00 2001
+From: Sean Hefty <sean.hefty at intel.com>
+Date: Tue, 27 Sep 2011 23:22:21 -0700
+Subject: [PATCH 3/9] librdmacm: Verify size of route_len
+
+If the user specifies route information on input to rdma_getaddrinfo,
+verify that the size of the routing data is something that we're
+prepared to handle.
+
+The routing data is only useful if IB ACM is enabled and may be
+either struct ibv_path_record or struct ibv_path_data on input.
+
+Signed-off-by: Sean Hefty <sean.hefty at intel.com>
+---
+ man/rdma_getaddrinfo.3 | 13 +++++++++++--
+ src/acm.c | 19 +++++++++++++++----
+ 2 files changed, 26 insertions(+), 6 deletions(-)
+
+diff --git a/man/rdma_getaddrinfo.3 b/man/rdma_getaddrinfo.3
+index e69d8ce..31c233d 100755
+--- a/man/rdma_getaddrinfo.3
++++ b/man/rdma_getaddrinfo.3
+@@ -28,10 +28,15 @@ RDMA functional equivalent to getaddrinfo.
+ Returns 0 on success, or -1 on error. If an error occurs, errno will be
+ set to indicate the failure reason.
+ .SH "NOTES"
+-Either node or service must be provided. If hints are provided, the
++Either node, service, or hints must be provided. If hints are provided, the
+ operation will be controlled by hints.ai_flags. If RAI_PASSIVE is
+ specified, the call will resolve address information for use on the
+ passive side of a connection.
++If node is provided, rdma_getaddrinfo will attempt to resolve the RDMA address,
++route, and connection data to the given node. The hints parameter, if provided,
++may be used to control the resulting output as indicated below.
++If node is not given, rdma_getaddrinfo will attempt to resolve the RDMA addressing
++information based on the hints.ai_src_addr, hints.ai_dst_addr, or hints.ai_route.
+ .SH "rdma_addrinfo"
+ .IP "ai_flags" 12
+ Hint flags that control the operation. Supported flags are:
+@@ -74,7 +79,11 @@ could be resolved.
+ Routing information for RDMA transports that require routing data as part
+ of connection establishment. The format of the routing data depends on
+ the underlying transport. If Infiniband transports are
+-used, ai_route will reference an array of struct ibv_path_data.
++used, ai_route will reference an array of struct ibv_path_data on output,
++if routing data is available. Routing paths may be restricted by setting
++desired routing data fields on input to rdma_getaddrinfo. For Infiniband,
++hints.ai_route may reference an array of struct ibv_path_record or
++struct ibv_path_data on input.
+ .IP "ai_connect_len" 12
+ Size of connection information referenced by ai_connect. This will be
+ 0 if the underlying transport does not require additional connection
+diff --git a/src/acm.c b/src/acm.c
+index 1fa6c62..00e0043 100755
+--- a/src/acm.c
++++ b/src/acm.c
+@@ -300,10 +300,21 @@ void ucma_ib_resolve(struct rdma_addrinfo *rai, struct rdma_addrinfo *hints)
+ }
+
+ if (hints && hints->ai_route_len) {
+- data->type = ACM_EP_INFO_PATH;
+- memcpy(&data->info.path, hints->ai_route, hints->ai_route_len);
+- data++;
+- msg.hdr.length += ACM_MSG_EP_LENGTH;
++ struct ibv_path_record *path;
++
++ if (hints->ai_route_len == sizeof(struct ibv_path_record))
++ path = (struct ibv_path_record *) hints->ai_route;
++ else if (hints->ai_route_len == sizeof(struct ibv_path_data))
++ path = &((struct ibv_path_data *) hints->ai_route)->path;
++ else
++ path = NULL;
++
++ if (path) {
++ data->type = ACM_EP_INFO_PATH;
++ memcpy(&data->info.path, path, sizeof(*path));
++ data++;
++ msg.hdr.length += ACM_MSG_EP_LENGTH;
++ }
+ }
+
+ pthread_mutex_lock(&acm_lock);
+--
+1.7.6.4
+
diff --git a/0004-librdmacm-udaddy-Fix-resource-leak-in-case-of-error.patch b/0004-librdmacm-udaddy-Fix-resource-leak-in-case-of-error.patch
new file mode 100644
index 0000000..04a4ea0
--- /dev/null
+++ b/0004-librdmacm-udaddy-Fix-resource-leak-in-case-of-error.patch
@@ -0,0 +1,27 @@
+From 934d3e3c98d07c3d872f7eeb1d935c9708474838 Mon Sep 17 00:00:00 2001
+From: Dotan Barak <dotanb at dev.mellanox.co.il>
+Date: Wed, 26 Oct 2011 07:19:25 -0700
+Subject: [PATCH 4/9] librdmacm/udaddy: Fix resource leak in case of error
+
+Signed-off-by: Dotan Barak <dotanb at dev.mellanox.co.il>
+Signed-off-by: Sean Hefty <sean.hefty at intel.com>
+---
+ examples/udaddy.c | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/examples/udaddy.c b/examples/udaddy.c
+index 637306a..1534df5 100644
+--- a/examples/udaddy.c
++++ b/examples/udaddy.c
+@@ -547,7 +547,7 @@ static int run_server(void)
+ ret = rdma_bind_addr(listen_id, test.src_addr);
+ if (ret) {
+ perror("udaddy: bind address failed");
+- return ret;
++ goto out;
+ }
+
+ ret = rdma_listen(listen_id, 0);
+--
+1.7.6.4
+
diff --git a/0006-rdma-cma-minor-code-refactoring-when-saving-a-string.patch b/0006-rdma-cma-minor-code-refactoring-when-saving-a-string.patch
new file mode 100644
index 0000000..5cbb6af
--- /dev/null
+++ b/0006-rdma-cma-minor-code-refactoring-when-saving-a-string.patch
@@ -0,0 +1,33 @@
+From 404c828cadf8a5370c80d0edffc4f23c97e229f2 Mon Sep 17 00:00:00 2001
+From: Dotan Barak <dotanb at dev.mellanox.co.il>
+Date: Mon, 31 Oct 2011 08:53:07 -0700
+Subject: [PATCH 6/9] rdma/cma: minor code refactoring when saving a string
+ content
+
+In this case, using strdup will provide a cleaner code
+(and maybe a little bit faster too).
+
+Signed-off-by: Dotan Barak <dotanb at dev.mellanox.co.il>
+Signed-off-by: Sean Hefty <sean.hefty at intel.com>
+---
+ src/addrinfo.c | 4 +---
+ 1 files changed, 1 insertions(+), 3 deletions(-)
+
+diff --git a/src/addrinfo.c b/src/addrinfo.c
+index 695430b..34c7fb4 100755
+--- a/src/addrinfo.c
++++ b/src/addrinfo.c
+@@ -137,9 +137,7 @@ static int ucma_convert_to_rai(struct rdma_addrinfo *rai,
+ if (!addr)
+ return ERR(ENOMEM);
+
+- canonname = ai->ai_canonname ? malloc(strlen(ai->ai_canonname) + 1) : NULL;
+- if (canonname)
+- strcpy(canonname, ai->ai_canonname);
++ canonname = ai->ai_canonname ? strdup(ai->ai_canonname) : NULL;
+
+ memcpy(addr, ai->ai_addr, ai->ai_addrlen);
+ if (ai->ai_flags & RAI_PASSIVE) {
+--
+1.7.6.4
+
diff --git a/0007-librdmacm-Return-ECONNREFUSED-from-rdma_connect-on-r.patch b/0007-librdmacm-Return-ECONNREFUSED-from-rdma_connect-on-r.patch
new file mode 100644
index 0000000..584aeb1
--- /dev/null
+++ b/0007-librdmacm-Return-ECONNREFUSED-from-rdma_connect-on-r.patch
@@ -0,0 +1,37 @@
+From 7a79fba60be15e562e688bce211715ebe35c69b1 Mon Sep 17 00:00:00 2001
+From: Sean Hefty <sean.hefty at intel.com>
+Date: Tue, 22 Nov 2011 17:17:04 -0800
+Subject: [PATCH 7/9] librdmacm: Return ECONNREFUSED from rdma_connect on
+ reject
+
+Make the errno return code from rdma_connect constistent with
+connect. The underlying status value is available by reading
+the event data.
+
+Signed-off-by: Sean Hefty <sean.hefty at intel.com>
+---
+ src/cma.c | 8 ++++++--
+ 1 files changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/src/cma.c b/src/cma.c
+index e09ab99..4a0bde9 100755
+--- a/src/cma.c
++++ b/src/cma.c
+@@ -761,8 +761,12 @@ static int ucma_complete(struct cma_id_private *id_priv)
+ if (ret)
+ return ret;
+
+- if (id_priv->id.event->status)
+- ret = ERR(id_priv->id.event->status);
++ if (id_priv->id.event->status) {
++ if (id_priv->id.event->event == RDMA_CM_EVENT_REJECTED)
++ ret = ERR(ECONNREFUSED);
++ else
++ ret = ERR(id_priv->id.event->status);
++ }
+ return ret;
+ }
+
+--
+1.7.6.4
+
diff --git a/0008-udaddy-ucmatose-allow-easy-setting-of-tos-in-hex.patch b/0008-udaddy-ucmatose-allow-easy-setting-of-tos-in-hex.patch
new file mode 100644
index 0000000..5b029d2
--- /dev/null
+++ b/0008-udaddy-ucmatose-allow-easy-setting-of-tos-in-hex.patch
@@ -0,0 +1,44 @@
+From 1405b8e9c60d7e98ca099148cfcb6fef45dd2494 Mon Sep 17 00:00:00 2001
+From: Or Gerlitz <ogerlitz at mellanox.com>
+Date: Mon, 12 Dec 2011 11:23:59 -0800
+Subject: [PATCH 8/9] udaddy/ucmatose: allow easy setting of tos in hex
+
+Under IBoE, the 3 MSBits of the TOS map to the SL, hence letting
+the user to specify them in hex makes the interface friendlier.
+
+Signed-off-by: Or Gerlitz <ogerlitz at mellanox.com>
+Signed-off-by: Sean Hefty <sean.hefty at intel.com>
+---
+ examples/cmatose.c | 2 +-
+ examples/udaddy.c | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/examples/cmatose.c b/examples/cmatose.c
+index 82e0d7c..3f2ff03 100644
+--- a/examples/cmatose.c
++++ b/examples/cmatose.c
+@@ -702,7 +702,7 @@ int main(int argc, char **argv)
+ break;
+ case 't':
+ set_tos = 1;
+- tos = (uint8_t) atoi(optarg);
++ tos = (uint8_t) strtoul(optarg, NULL, 0);
+ break;
+ case 'p':
+ port = atoi(optarg);
+diff --git a/examples/udaddy.c b/examples/udaddy.c
+index 637306a..a07f657 100644
+--- a/examples/udaddy.c
++++ b/examples/udaddy.c
+@@ -655,7 +655,7 @@ int main(int argc, char **argv)
+ break;
+ case 't':
+ set_tos = 1;
+- tos = (uint8_t) atoi(optarg);
++ tos = (uint8_t) strtoul(optarg, NULL, 0);
+ break;
+ case 'p':
+ port_space = strtol(optarg, NULL, 0);
+--
+1.7.6.4
+
diff --git a/0009-librdmacm-Update-web-site-and-email-addresses.patch b/0009-librdmacm-Update-web-site-and-email-addresses.patch
new file mode 100644
index 0000000..d37cb25
--- /dev/null
+++ b/0009-librdmacm-Update-web-site-and-email-addresses.patch
@@ -0,0 +1,26 @@
+From 870bcbda2f01f801bbbabfd3c4b2956f79572d9b Mon Sep 17 00:00:00 2001
+From: Sean Hefty <sean.hefty at intel.com>
+Date: Wed, 14 Dec 2011 16:38:45 -0800
+Subject: [PATCH 9/9] librdmacm: Update web site and email addresses
+
+Signed-off-by: Sean Hefty <sean.hefty at intel.com>
+---
+ configure.in | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/configure.in b/configure.in
+index 03dbed8..8d89741 100644
+--- a/configure.in
++++ b/configure.in
+@@ -1,7 +1,7 @@
+ dnl Process this file with autoconf to produce a configure script.
+
+ AC_PREREQ(2.57)
+-AC_INIT(librdmacm, 1.0.15, general at lists.openfabrics.org)
++AC_INIT(librdmacm, 1.0.15, linux-rdma at vger.kernel.org)
+ AC_CONFIG_SRCDIR([src/cma.c])
+ AC_CONFIG_AUX_DIR(config)
+ AC_CONFIG_MACRO_DIR(config)
+--
+1.7.6.4
+
diff --git a/librdmacm.spec b/librdmacm.spec
index b63224c..6f80169 100644
--- a/librdmacm.spec
+++ b/librdmacm.spec
@@ -1,14 +1,22 @@
Name: librdmacm
-Version: 1.0.14.1
+Version: 1.0.15
Release: 1%{?dist}
Summary: Userspace RDMA Connection Manager
Group: System Environment/Libraries
License: GPLv2 or BSD
Url: http://www.openfabrics.org/
Source: http://www.openfabrics.org/downloads/rdmacm/%{name}-%{version}.tar.gz
+Patch1: 0001-rdma-verbs-Fix-race-polling-for-completions.patch
+Patch2: 0002-librdmacm-Fix-duplicate-free-of-connect.patch
+Patch3: 0003-librdmacm-Verify-size-of-route_len.patch
+Patch4: 0004-librdmacm-udaddy-Fix-resource-leak-in-case-of-error.patch
+Patch6: 0006-rdma-cma-minor-code-refactoring-when-saving-a-string.patch
+Patch7: 0007-librdmacm-Return-ECONNREFUSED-from-rdma_connect-on-r.patch
+Patch8: 0008-udaddy-ucmatose-allow-easy-setting-of-tos-in-hex.patch
+Patch9: 0009-librdmacm-Update-web-site-and-email-addresses.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
ExcludeArch: s390 s390x
-BuildRequires: libibverbs-devel > 1.1.4
+BuildRequires: libibverbs-devel > 1.1.4, chrpath
%description
librdmacm provides a userspace RDMA Communication Managment API.
@@ -38,6 +46,14 @@ Example test programs for the librdmacm library.
%prep
%setup -q
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+%patch4 -p1
+%patch6 -p1
+%patch7 -p1
+%patch8 -p1
+%patch9 -p1
%build
%configure LDFLAGS=-lpthread
@@ -46,13 +62,15 @@ sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool
make %{?_smp_mflags}
%install
-rm -rf $RPM_BUILD_ROOT
+rm -rf %{buildroot}
%makeinstall
# remove unpackaged files from the buildroot
-rm -f $RPM_BUILD_ROOT%{_libdir}/*.la
+rm -f %{buildroot}%{_libdir}/*.la
+# kill rpaths
+chrpath -d %{buildroot}%{_bindir}/*
%clean
-rm -rf $RPM_BUILD_ROOT
+rm -rf %{buildroot}
%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig
@@ -79,6 +97,10 @@ rm -rf $RPM_BUILD_ROOT
%{_mandir}/man1/*
%changelog
+* Tue Jan 03 2012 Doug Ledford <dledford at redhat.com> - 1.0.15-1
+- Update to latest upstream tarball
+- Add in latest git commits as patches
+
* Wed Jul 20 2011 Doug Ledford <dledford at redhat.com> - 1.0.14.1-1
- Update to latest upstream release
- Rebuild against latest libibverbs
diff --git a/sources b/sources
index 6f3ea25..6271fef 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-bc3cc06b808ab6096b5c0937f54a8dbd librdmacm-1.0.14.1.tar.gz
+0053fd9a7368f04e72287923eb58ea36 librdmacm-1.0.15.tar.gz
More information about the scm-commits
mailing list